Lunds tekniska högskola Matematikcentrum Matematisk statistik STATISTISKA METODER FÖR SÄKERHETSANALYS FMS065 Datorövning 3 Bootstrap och Bayesiansk analys I denna datorövning ska vi fokusera på två olika angreppssätt för att studera osäkerheten hos skattningar: bootstrap och bayesiansk analys. I den första delen ska vi undersöka tiden mellan jordbävningar, och, i den andra, livslängden hos kullager. Data finns i filerna quakeper.mat respektive ballbearings.mat på hemsidan. 1 Förberedelseuppgifter 1. Läs igenom laborationshandledningen samt kapitel 4.4 4.6 och 6 i boken. 2. Skriv ner Bayes formel för uppdatering av en a priori-täthetsfunktion till en a posteriori-täthetsfunktion. 2 Jordbävningsdata Tidsintervallen mellan successiva allvarliga jordbävningar (> 7.5 på Richterskalan eller mer än 1000 dödsfall) över hela jorden har noterats. Sammanlagt 63 allvarliga jordbävningar, dvs 62 tidsintervall, finns registrerade. Detta datamaterial täcker perioden 16 december 1902 till 4 mars 1977. Vårt mål är att få en uppfattning om sannolikheter att få en period av mer än 1500 dagar ( 4 år) mellan jordbävningar. Vi ska skatta denna sannoklikhet och rita ett histogram för att beskriva osäkerheten hos denna skattning. Vi ska också göra ett konfidensintervall för sannolikheten. Läs in jordbävningsdata i Matlab och rita in data i ett (normerat) histogram: >> load quakeper >> histpdf(quakeper) % histpdf från kurshemsidan. >> xlabel( dagar ) % Sätter titel på x-axeln Från tidigare studier (och histogrammet) tror vi att en exponentialfördelning borde passa bra för att modellera tiderna mellan jordbävningar. Exponentialfördelningen har en parameter, ( = förväntad tid mellan jordbävningar): F X (x; ) = 1 e x/. (1) och vi söker sannolikheten p = P(X > 1500) = 1 F X (1500; ) = e 1500/. (2) Först ska vi skriva ner skattningen av p och (försöka) beräkna variansen. Antag att vi har n slumpvariabler X k, k = 1,... n, som är oberoende och vars fördelning ges av ekvation 1. ML-skattningen av ges då av
ii  = 1 n n X k. Ekvation 2 ger sedan att k=1 P = e 1500/Â. (3) Notera att, eftersom variablerna X k är slumpmässiga så är även  and P slumpmässiga. Osäkerheten hos skattningen P mäts med hjälp av dess varians. Ett sätt att beräkna variansen för P är att utnyttja att V (P ) = E((P ) 2 ) E 2 (P ). Uppgift: Skriv upp de integraler som ger E(P ) och E((P ) 2 ). Verkar de enkla att beräkna? Variansen är uppenbarligen inte så lätt att beräkna. Därför ska vi istället använda bootstrap för att lösa problemet. 2.1 Punktskattning av p För att få en skattning p av p beräknar vi först ML-skattningen av och utnyttjar ekvation 3: >> thetastar = mean(quakeper) >> pstar = exp(-1500/thetastar) Uppgift: Skriv upp skattningen av p. Ett annat sätt att skatta sannolikheten är att använda den empiriska fördelningsfunktionen. Rita upp den empiriska fördelningsfunktionen och avläs sannolikheten att överstiga värdet 1500: >> [x,ratios] = empcdf(quakeper); >> plot(x,ratios) Man kan också få den empiriska skattningen på följande vis: >> pemp = sum(quakeper>1500)/length(quakeper) % Jämför lab1. Uppgift: Ligger skattningarna pstar och pemp nära varandra? Om de inte legat nära varandra, vad kunde det berott på? Nu är frågan hur bra skattningen är, framförallt hur osäker den är. Vi vill inte beräkna den teoretiska variansen eftersom det är ganska besvärligt. Istället utnyttjar vi bootstrap-tekniken för att undersöka osäkerheten hos p.
iii 2.2 Uppskattning av osäkerheten hos p med hjälp av bootstrap Under de senaste årtiondena har bootstrap-tekniker varit föremål för stort intresse. Bootstrap-tekniken kombinerar klassisk inferensteori med datorintensiva metoder. Vi ska bara beröra några grundläggande idéer 1 och demonstrera hur man använder bootstrap för att hitta fördelningen för skattningsfelet E = p p. Vi kan ju inte beräkna fördelningen fullständigt eftersom vi bara har en skattning p och p är okänt. Men med hjälp av bootstrap kan vi åtminstone skatta fördelningen för felet E. För att förstå den grundläggande idén bakom bootstrap, använder vi först ett litet datamaterial: >> y = [23, 45, 67, 89, 132, 171] % Ett litet datamaterial >> n = length(y) % med n observationer. Följande två rader ger ett boostrap-stickprov från vektorny: >> help randi % Vad gör funktionen randi? >> Iboot = randi(n,1,n) % En (1 x n)-vektor med slumptal från 1,...,n. >> yboot = y(iboot) % Ett bootstrap-stickprov från y % med y-värdena från platserna i Iboot. Se till att du förstår huryboot uppstod frånymed hjälp aviboot. Upprepa raderna >> Iboot = randi(n,1,n) >> yboot = y(iboot) för att få nya stickprov. Vektorn yboot innehåller 6 värden där varje element i yboot tar något av värdena [23, 45, 67, 89, 132, 171] med lika sannolikhet. Nu ska vi använda de 62 observationerna i quakeper. Vi har antagit att de är oberoende av varandra. Från värdena i quakeper fick vi skattningen p av p. Nu ska vi undersöka hur p varierar när vi slumpmässigt, med återläggning, väljer 62 värden från stickprovet quakeper: >> n = length(quakeper); >> Iboot = randi(n,n,1) % (n x 1)-vektor istället. >> yboot = quakeper(iboot) % Ett bootstrap-stickprov. >> thetaboot = mean(yboot) % En bootstrapskattning av theta. >> pboot = exp(-1500/thetaboot) % En bootstrapskattning av p. Värdetpboot är en ny skattning av p, skattad med bootstrap-stickprovet yboot. Uppgift: Hur stämmerpboot med de tidigare skattningarnapstar ochpemp? Vårt syfte med att bootstrapa från quakeper var ju att få fram fördelningen för E = p p. Man kan visa att E = p p har approximativt samma fördelning som skillnaden pstar-pboot. Så om vi upprepar kommandona ovan för att göra flera skattningar pboot, kan vi sedan göra ett histogram för skillnaden pstar-pboot, som beskriver variationen hos felet p p och därmed osäkerheten hos skattningen p : 1 Den som vill lära sig mer om bootstrap kan läsa FMS091 Monte Carlo-baserade statistiska metoder
iv >> NB = 1000; % Antal bootstrap-replikat. >> for k=1:nb yboot(:,k) = quakeper(randi(n,n,1); % (:,k) betyder end; % "alla rader men bara kolumn k". % Vi får alltså en n x NB-matris med % med de olika bootstrap-stickproven % i varsin kolumn. >> thetaboot = mean(yboot); % Ett medelvärde för varje kolumn. >> pboot = exp(-1500./thetaboot); % Divisionen./ betyder elementvis % division, inte matrisdivision som är % default i Matlab. Rita upp bootstrap-skattningarna för att se hur de varierar: >> figure(1) >> histpdf(pboot,20) % Histogram med 20 klasser. Beräkna bootstrap-felen och se hur de varierar: >> esterror = pstar-pboot; >> figure(2) >> histpdf(esterror,20) Uppgift: Jämför de två histogrammen. Hur relaterar de till varandra? Uppgift: Enligt teorin är ML-skattningar approximativt normalfördelade om n är stort. Man kan fråga sig om 62 är tillräckligt stort. Ser det normalfördelat ut? 2.3 Bootstrap-konfidensintervall Eftersom skattningsfelen inte är särskilt normalfördelade är det inte någon bra idé att använda ett normalfördelningsbaserat konfidensintervall även om vi kunnat beräkna variansen. Istället gör vi ett konfidensintervall baserat direkt på fördelningen för felen med hjälp av kvantilerna för de bootstrapade felen. Vi vill göra ett 95 % konfidensintervall och behöver därför ta fram 2.5 %- och 97.5 %-kvantilerna för bootstrap-felen: >> help prctile % Empiriska kvantiler. >> q = prctile(esterror,[2.5 97.5]) Vi har nu att 95 % av felen ligger i intervallet [q(1), q(2)]. Eftersom felen ges av E = p p, så blir intervallet för p: >> confint = [pstar+q(1),pstar+q(2)] Uppgift: Beräkna bootstrap-konfidensintervallet för p.
v 3 Bayesiansk analys av jordbävningsdata Istället för bootstrap-tekniken ska vi nu analysera samma data med Bayesiansk teknik. Vi ska undersöka intensiteten Ä = 1/Â istället för återkomsttiden Â. Den sannolikhet vi är intresserade av är P = P(X > 1500) = e 1500/Â = e Ä 1500. I likhet med i bootstrap-exemplet, vill vi hitta fördelningen för P. I en Bayesiansk ansats är intensiteten Ä en slumpvariabel, därför betecknas den med stor bokstav. I klassisk ansats är Ð en fix, men okänd, konstant medan skattningen är slumpmässig. I den Bayesianska ansatsen är P en funktion av slumpvariabeln Ä och alltså också en slumpvariabel. Vi tar fram fördelningen för P genom att utgå från fördelningen för Ä. Vi antar, som tidigare, att tiderna mellan jordbävningar är exponentialfördelade. Det medför att antalet jordbävningar, N, under tidsintervallet [0, t] är Poissonfördelat, givet att vi känner värdet på intensiteten, Ä. Det ger att sannolikheten för k jordbävningar är: Ðt (Ðt)k P(N = k Ä = Ð) = e, för k = 0, 1,... k! Den Bayesianska tekniken kräver att vi har en a priori-fördelning för Ä. Sedan använder vi informationen om att det inträffade 63 jordbävningar under perioden för att få a posteriori-fördelningen. Uppdateringen görs med formeln f post Ä prior (Ð) = c P(N = 63 Ä = Ð) f (Ð), (4) Ä där c är en konstant, dvs. den beror inte på Ð. 3.1 Val av a priori-fördelning Första steget i en Bayesiansk analys är att välja a priori-fördelning. A priori-fördelningen ska återspegla vår kunskap om Ä innan vi gjort mätningarna. Om vi inte vet så mycket om Ä ska vi välja en platt fördelning. Här ska vi välja en oegentlig ( improper ) a priori-fördelning: f prior Ä (Ð) = 1/Ð, för Ð > 0. Detta ger en icke-informativ a priori-fördelning. Vi ritar upp en bit av den: >> lambda = linspace(0.001,0.005); % Jämnt fördelade tal mellan 0.001 och 0.005. >> f_prior = 1./lambda; %./ för elementvis division. >> plot(l,f_prior) Uppgift: Varför är denna a priori-fördelning oegentlig?
vi 3.2 Beräkning av a posteriori-fördelningen För att beräkna a posteriori-fördelningen behöver vi ta hänsyn till att vi vet att det blev 63 jordbävningar på 27 120 days (16 december 1902 till 4 mars 1977). Vi beräknar a posteriori-fördelningen med hjälp av ekvation 4. Eftersom N = antal jordbävningar, är poissonfördelad, får vi att Ð 27120 (Ð 27120)63 P(N = 63 Ä = Ð) = e 63! och a posteriori-fördelningen blir f post (Ð) = c c Ä 1 e Ð 27120 Ð }{{ 63 } Ð 1 }{{} uppdateringssannolikhet a prior-fördelning = c 1 e Ð 27120 Ð 63 = c 2 Ð 63 1 e Ð 27120 vilket är en gammafördelning med parametrar a = 63 och b = 27120 (Matlab använder parametrarna a och 1/b). Vi ritar a posteriori-fördelningen i samma diagram som a priori-fördelningen: >> a=63; b=27120; >> hold on >> plot(lambda,gampdf(lambda,a,1/b), r ) >> hold off Uppgift: Jämför a priori- och a posteriori-fördelningarna. Nu är vi ju egentligen intresserade av a posteriori-fördelningen för P = e Ä 1500. Eftersom ln P = 1500 Ä ska vi beräkna fördelningen för logaritmen av en gamma-fördelningen. Det går bra eftersom det är en monoton funktion. Vi får att fördelningsfunktionen för P ges av F p (p) = P(P p) = P(e Ä 1500 p) = P(Ä 1 1500 ln p) = 1 F Ä( 1 1500 med täthetsfunktionen f P (p) = F P (p) = d dp (1 F Ð( 1 1500 ln p) = 1 1500p f Ä( 1 1500 Eftersom Matlab har funktioner för gammafördelningen behöver vi inte räkna ut exakt hur funktionerna ser ut. Vi ritar upp a posteriori-fördelningen för p: ln p). >> p = exp(-lambda*1500); >> subplot(211) % Delfigurer i samma fönster med 2 rader och 1 % kolumn. Rita i första delfönstret. >> plot(p,1-gamcdf(-log(p)/1500,a,1/b)) >> title( A posteriori-fördelningsfunktion för p ) >> xlabel( p ) >> subplot(212) % Rita i andra delfönstret. >> plot(p,1./(1500*p).*gampdf(-log(p)/1500,a,1/b)) >> title( A posteriori-täthetsfunktion för p ) >> xlabel( p ) Vi kan nu läsa av gränserna för ett 95 % trolighetsintervall för p i den övre figuren. Vi kan också räkna ut det med hjälp av kvantilerna i gamma-fördelningen: ln p)
vii >> q_lambda = gaminv([0.025 0.975],a,1/b) >> q_p = exp(-[q_lambda(2) q_lambda(1)]*1500) Uppgift: Avläs trolighetsintervallet i figuren och kontrollera att det stämmer med kvantilberäkningen. Uppgift: Jämför trolighetsintervallet med konfidensintervallet från förra avsnitten. Verkar de lika? Vi ritar in histogrammet över bootstrapskattningarna från förra avsnittet i samma figur som a posterioritäthetsfunktionen: >> hold on >> histpdf(pboot) >> hold off Uppgift: Verkar det som om de två skattnings-teknikerna ger liknande fördelning på osäkerheten? 4 Kullager Vi avslutar med en ny bootstrap. Vi ska studera mätningar av livslängden på kullager. Vi anpassar en fördelning och vill undersöka osäkerheten hos skattningen av kvantilen x 0.9. Läs in data i Matlab: >> load ballbearings Livslängdsmätningarna ligger i variablenball. Mätenheten är millioner cykler. Av erfarenhet vet man ett en Weibullfördelning ofta är en lämplig model för denna typ av data. Rita data i ett Weibull-papper för att kolla att det kan stämma: >> wblplot(ball) Uppgift: Verkar det passa med en Weibullfördelning? Weibullfördelningen har två parameterar, a och c: F X (x) = 1 e (x/a)c (5) Nu påstår en expert att bara 10 % av kullagren har en livslängd på mindre än 40 million cykler. Vi vill undersöka detta påstående med hjälp av bootstrap.
viii 5 Kullager en bootstrap-studie Vi ska nu undersöka den intressanta kvantilen, x 0.9. Mer precist, ska vi skatta kvantilen och undersöka variationen hos skattningen med hjälp av bootstrap. Först skattar vi parametrarna a och c i Weibull-fördelningen och ritar upp den empiriska fördelningsfunktionen tillsammans med den skattade fördelningsfunktionen: >> par = wblfit(ball); >> a=par(1), c=par(2) >> [x,ratios] = empcdf(ball); >> plot(x,ratios) >> hold on >> plot(x,wblcdf(x,a,c), r ) >> hold off Vi kan beräkna den empiriska skattningen av x 0.9 genom att läsa av den empiriska fördelningsfunktionen eller genom >> x09emp = prctile(ball,10) Vi kan också använda ML-skattningen och läsa av den skattade fördelningsfunktionen eller använda >> x09star = a*(-log(0.9))^(1/c) Uppgift: Skatta x 0.9 på båda sätten och jämför skattningarna. För att få en uppfattning om variationen hos skattningen bootstrapar vi materialet för att få fler skattningar av x 0.9 : >> n = length(ball) >> NB = 1000; >> for k=1:nb xboot = ball(randi(n,n,1)); pboot = wblfit(xboot); x09boot(k) = pboot(1)*(-log(0.9))^(1/pboot(2)); end Rita ett histogram över bootstrap-skattningarna och beräkna ett bootstrap-konfidensintervall: >> figure >> histpdf(x09boot,20) >> esterror = x09star-x09boot; >> q = prctile(esterror,[2.5 97.5]); >> x09ci = [x09star+q(1) x09star+q(2)] Uppgift: Verkar experten ha rätt i att bara 10 % av kullagren har en livslängd på mindre än 40 million cykler?