Lunds tekniska högskola Matematikcentrum Matematisk statistik STATISTISKA METODER FÖR SÄKERHETSANALYS FMS065, HT-16 Datorövning 6 Extremvärden och Peaks over Threshold I denna datorövning ska vi använda mätningarna av den signifikanta våghöjden hos en boj i Stilla havet. Data är hämtade från bojens egen hemsida: http://www.ndbc.noaa.gov/station_page.php?station= 46005. Länken finns på kurshemsidan. Gå gärna dit och kolla var bojen finns och hur den ser ut. Vi ska först skatta fördelningen för de mest extrema dags-maxima för den signifikanta våghöjden med POT (Peaks Over Threshold). Sedan ska vi anpassa en Generaliserad Extremvärdesfördelning och använda den för att uppskatta fördelningen för 10-års-maximum av våghöjden. Fördelningen ska vi sedan använda för att uppskatta 1000-decennievågen, dvs den våg som i medeltal kommer en gång per 1000 tioårsperioder. 1 Förberedelseuppgifter 1. Läs igenom handledningen till datorövningen samt kapitel 9.2 och 10.2 i boken. 2 Signifikant våghöjd I filen bojdata.mat finns alla meteorologiska data som bojen samlat in under perioden 1976 2012. Rådata finns i variabeln data. En förklaring till variablerna finns på http://www.ndbc.noaa.gov/measdes. shtml, länk finns på kurshemsidan. Vi börjar med att läsa in data och rita upp våghöjderna. Det vi är intresserade av är kolumnen WVHT: Significant wave height (meters) is calculated as the average of the highest one-third of all of the wave heights during the 20-minute sampling period. Den ligger i kolumn 9. Matlabs funktion datenum gör om år-månad-dag-timme-minut-sekund till Matlabs datumnummer. Man kan sedan få datum på x-axeln med datetick. Gör gärna help datetick för att se vilka varianter det finns. >> load bojdata >> WVHT = data(:,9); % WaVe HeighT >> tid = datenum([data(:,1:4) zeros(size(wvht)) zeros(size(wvht))]); % Inga minuter eller sekunder. >> figure(1) >> plot(tid,wvht,'-') >> title('signifikant våghöjd') >> datetick('x','yyyy') % Årtal med 4 siffror på x-axeln >> axis([min(tid) max(tid) 0 Inf]) Uppgift: Det finns uppenbarligen hål i dataserien. Bojen har t.ex. inga mätningar under 2005 eller 2009. Men om vi bortser från det, ser det ut som om den signifikanta våghöjden är ungefär lika stor hela tiden? Finns det någon periodicitet? Vad kan det bero på? I variabeln monthmax finns maximum av signifikant våghöjd för varje månad, med årtal i första kolumnen och de 12 månaderna i de övriga kolumnerna. Vi ritar upp månadsvärdena med en linje per år:
DATORÖVNING 6, FMS065 2 >> figure(2) >> plot(1:12,monthmax(:,2:13),'-') >> xlabel('månad') >> title('månadsmaximum för signifikant våghöjd') Uppgift: Ger figuren en förklaring på det periodiska beteendet? Det finns uppenbarligen en årstidsvariation i data. Det stormar mer på vintern och knappast alls i juli. Detta måste man ta hänsyn till om man ska göra en ordentlig analys. Vi struntar i det här och hänvisar till kursen FMS155 Statistisk modellering av extremvärden istället. Bojen levererar i regel en mätning i timmen och mätningar gjorda i närheten av varandra är säkert inte oberoende. En storm varar, t.ex., mer än en timme så man kan förvänta sig flera höga mätningar i rad. För att minska beroendet beräknar vi maximala signifikanta våghöjden under ett dygn. De ligger i variabeln daymax med år, månad, dag i de tre första kolumnerna. >> datum = datenum(daymax(:,1:3)); >> WVHTday = daymax(:,4); >> figure(3) >> plot(datum,wvhtday,'b') >> title('dagsmaximum för signifikant våghöjd') >> datetick('x','yyyy') >> axis([min(datum) max(datum) 0 Inf]) >> figure(4) >> hist(wvhtday,20) >> xlabel('dagsmaximum för signifikant våghöjd (meter)') Vi kan också skatta 1000-dagsvågen x 0.001 som den empiriska 0.1 %-kvantilen: >> x0emp = prctile(wvhtday,(1-0.001)*100) Uppgift: Skriv upp skattningen av 1000-dagsvågen. Vi ska jämföra den med skattningarna nedan. 2.1 Skattning av den extrema svansen med POT-metoden Vi vill uppskatta hur extrema de mest extrema våghöjderna kan tänkas bli. Då kan vi strunta i de små vågorna och bara titta på hur den övre svansen i fördelningen ser ut. Nästan alla fördelningar har en svans som är ungefär en generaliserad Pareto-fördelning (GPD). Det betyder att den del av dagsmaximum, X, som överstiger en viss nivå, t.ex. u = 5 meter, dvs Y = X u när X > u, har en fördelning enligt: ( P(Y y) 1 1 c y ) 1/c a + där x + = max(0, x). Om c = 0 är Y exponentialfördelad. Vi får också att antalet överstigningar är en Poissonprocess med intensitet λ = P(X > u). Vi börjar med att skatta intensiteten λ: >> u = 5; % Gräns för överskotten. >> I = find(wvhtday>u); % Hitta de överskjutna dagsmaxima. >> n = length(wvhtday); % Antal dagsmaxima. >> nu = length(i); % Antal överskott. >> lambda = nu/n
DATORÖVNING 6, FMS065 3 Uppgift: Hur ofta kan man förvänta sig att dagsmaximum av våghöjden överstiger 5 meter? Vi ritar upp de överskjutande våghöjderna också: >> Y = WVHTday(I)-u; >> figure(5) >> stem(datum(i),y,'.') % stem ritar skjälkar under punkterna. >> datetick('x','yyyy') >> axis([min(datum) max(datum) 0 Inf]) >> title('överskjutande våghöjd (meter)') >> figure(6) >> hist(y,20) Uppgift: Jämför figur 5 med figur 3. Kan du hitta överskjutningarna? Uppgift: Titta på histogrammet. Ser det ut som någon fördelning du känner igen? För att ta reda vilken generaliserad Pareto-fördelning överskotten har låter vi Matlab ML-skatta parametrarna och beräkna 95 % konfidensintervall för dem: >> [parhat parci] = gpfit(y); % Generaliserad Pareto ML-skattning med konf.int. >> c = -parhat(1) % Matlab har parameter -c. >> c_ci = [-parci(2,1) -parci(1,1)] >> a = parhat(2) >> a_ci = [parci(1,2) parci(2,2)] Uppgift: Använd konfidensintervallet för att avgöra om parametern c är signifikant skild från noll. Kan överskotten vara exponentialfördelade? Vi vill inte bestämma oss för om c = 0 eller inte utan använder båda modellerna. Då måste vi skatta a i exponentialfördelningen med medelvärdet. Vi ritar upp empiriska fördelningsfunktionen (jfr datorövning 1) och de två fördelningsfunktionerna: >> ahat = mean(y) >> [y,ratio] = empcdf(y); % empcdf från Lab 1. >> figure(7) >> plot(y,ratio,'b') >> hold on >> plot(y,expcdf(y,ahat),'r--') % Exponential >> plot(y,gpcdf(y,-c,a),'k-.') % Gen. Pareto c<>0 >> hold off >> legend('empirisk fördelning', 'Exponential', 'Gen. Pareto',... % kommandot 'Location','East') % fortsätter på nästa rad. Location=East lägger % förklaringen i mitten till höger. >> xlabel('överskjutande våghöjd (meter)')
DATORÖVNING 6, FMS065 4 Uppgift: Ser det ut att passa bra med exponentialfördelning? Eller bättre med generaliserad Pareto? Om vi har att överskott över nivån u sker med intensiteten λ dag 1 och överskotten följer en generaliserad Pareto-fördelning så ges, t.ex., 1000-dagsvågen x α där α = 1/1000 av { u + a ( 1 (α/λ) c ), c 0 x α = c u + a ln(λ/α), c = 0 >> alpha = 1/1000; >> x0exp = u+ahat*log(lambda/alpha) % Om vi antar att c=0. >> x0gpd = u+(a/c)*(1-(alpha/lambda)^c) % Om c <> 0. Uppgift: Blev det någon större skillnad på skattningarna? Våra skattningar baserar sig ju på att vi anpassat en generaliserad Paretofördelning till svansen i fördelningen för dagsmaximum. Uppgift: Jämför skattningarna med den empiriska kvantilen i föregående avsnitt. Verkar dina skattningar rimliga? Uppgift: Gränsen u = 5 är valt lite på måfå. Undersök hur känslig din kvantil baserat på Generaliserad Pareto är genom att göra om skattningarna när u = 6, 7 resp. 8 istället. Blev det någon större skillnad på x0gpd? Använd gränsen u = 8 meter i de fortsatta räkningarna. Uppgift: Är c-parametern signifikant skild från 0 när u = 8? 2.2 Generaliserad extremvärdesfördelning Nu ska vi utnyttja vår generaliserade Pareto-fördelning för att beräkna fördelningen för maximala våghöjden under en längre tidsperiod. Vi har ju bara observerat våghöjden under 35 år. Om vi vill bygga en oljeplattform eller liknande vill vi dimensionera den för vågor som kanske bara kommer vart tusende eller tiotusende år. Fördelningen för maximum, M N, av många (N ), oberoende, likafördelade observationer följer ungefär en generaliserad extremvärdesfördelning (GEV) 1 : ( exp (1 c x μ ) P(M N x) σ )1/c +, c 0 exp( e (x μ)/σ ), c = 0 Gumbel 1 Jämför med centrala gränsvärdessatsen som säger att summan är ungefär normalfördelad.
DATORÖVNING 6, FMS065 5 Om vi har att överskott över nivån u sker med intensiteten λ dag 1 och överskotten följer en generaliserad Pareto-fördelning med parametrar a och c så blir maximum av N stycken dags-maxima GEV-fördelat med parametrar σ = { a (λn ) c, c 0 a, c = 0 μ = { u + σ a, c 0 c u + a ln λn, c = 0 Det kan ju vara intressant att skatta fördelningen för 35-årsmaximum M 35 år, både när vi antar att c = 0 och när c 0 för att se hur stor skillnad det blir: >> N = 365*35; % 35 år uttryckt i dagar. >> sigmagev = a*(lambda*n)^c; % GEV >> mugev = u+(sigmagev-a)/c % GEV >> sigmagum = ahat; % Gumbel >> mugum = u+ahat*log(lambda*n); % Gumbel >> x = linspace(4,30,10000); >> fgev = gevpdf(x,-c,sigmagev,mugev); % -c i Matlabs GEV! >> fgum = gevpdf(x,0,sigmagum,mugum); >> figure(8) >> plot(x,fgev,'-',x,fgum,'r') >> legend('c <> 0', 'c = 0') >> title('täthetsfunktion för 35-årsmaximum') >> Fgev = gevcdf(x,-c,sigmagev,mugev); % -c i Matlabs GEV! >> Fgum = gevcdf(x,0,sigmagum,mugum); >> figure(9) >> plot(x,fgev,'-',x,fgum,'r') >> legend('c <> 0', 'c = 0') >> title('fördelningsfunktion för 35-årsmaximum') Uppgift: Blev det skillnad på fördelningarna när vi antar c = 0 resp. c 0? Nu vill vi beräkna 1 -kvantilen i 35-årsmaximum-fördelningen, dvs den där P(M 35 år > x 0.001 ) = 0.001. I en GEV ges α-kvantilen av { μ + σ x α = c (1 ( ln(1 α))c ), c 0 μ σ ln( ln(1 α)), c = 0 dvs >> alpha = 1/1000; >> x0gev = mugev+sigmagev/c*(1-(-log(1-alpha))^c) % GEV >> x0gum = mugum-sigmagum*log(-log(1-alpha)) % Gumbel Uppgift: Vilken version gav störst skattning?
DATORÖVNING 6, FMS065 6 2.3 Osäkerheten hos skattningen av 1000-decennievågen Det vore bra om vi kunde få en uppskattning av osäkerheten hos skattningen. Om den är osäker finns det ju risk att den verkliga 1-35-årsvågen är väsentligt större än vår uppskattning. Osäkerheten i skattningen beror (bortsett från att det kan vara helt fel modell) på osäkerheten i skattningen av överskottsintensiteten λ, samt parametrarna c och a i den generaliserade Paretofördelningen. Vi behöver alltså ta fram osäkerheten (och beroendet) mellan dessa tre skattningar och se hur de fortplantar sig till skattningen av vår kvantil. Det enklaste är att göra det med en bootstrap (se datorövning 3). >> ndata = length(wvhtday); % Antal dagsmax. >> M = 5000; % 5000 bootstrapreplikat. >> lambdab = []; ab = []; cb = []; % Tomma vektorer att samla skattningar i. >> for k=1:m Ib = randi(ndata,ndata,1); % Dragning med återläggning. Xb = WVHTday(Ib); % De dragna WVHTday-värdena. Iu = find(xb>u); % Vilka är > u? lambdab(k,1) = length(iu)/ndata; % Skatta lambda. phat = gpfit(xb(iu)-u); % Skatta GPD-param. cb(k,1) = -phat(1); % phat(1)=-c. ab(k,1) = phat(2); end Uppgift: Fick du några felmeddelanden? Om c < 0.5 så har den generaliserade Paretofördelningen oändligt stor varians! Om c < 1 är väntevärdet inte ändligt heller. Det bekymrar oss inte nu eftersom vi inte använder Matlabs konfidensintervall för a och c. Räkna sedan ut de tillhörande 5000 σ- och μ-skattningarna och tillhörande bootstrapintervall: >> sigmab = ab.*(n*lambdab).^cb; % Gör om till GEV-parametrar. >> mub = u+(sigmab-ab)./cb; %..och skatta kvantilen: >> x0boot = mub+sigmab./cb.*(1-(-log(1-alpha)).^cb); >> esterror = x0gev-x0boot; % Bootstrapfelen. >> q = prctile(esterror,[2.5 97.5]) % Bootstrap konfidensintervall. >> x0_ci = x0gev+[q(1) q(2)] Uppgift: Vad blev konfidensintervallet? Verkar skattningen vara tillförlitlig? 2.4 En liten undersökning av osäkerheten i fördelningen För att se varför konfidensintervallet för kvantilen blir så brett kan vi undersöka hur mycket våra λ-, a- och c-bootstrapskattningar varierar, och hur korrelerade de är. >> figure(10) >> subplot(221) >> plot(ab,cb,'.') >> xlabel('a*') >> ylabel('c*')
DATORÖVNING 6, FMS065 7 >> subplot(222) >> plot(ab,lambdab,'.') >> xlabel('a*') >> ylabel('\lambda*') >> subplot(223) >> plot(cb,lambdab,'.') >> xlabel('c*') >> ylabel('\lambda*') Uppgift: Vilka av skattningarna verkar korrelerade? För att se hur osäkerheten i skattningarna påverkar den skattade fördelningen ritar vi upp täthets- och fördelningsfunktionerna som man får om man använder de 25 första bootstrapskattningarna (det blir svårt att se något om man ritar alla 5000). >> figure(11) >> fgev = gevpdf(x,-c,sigmagev,mugev); % täthetsfunktionen enl ML-skattn. >> plot(x,fgev,'r-') >> title('25 bootstrapade täthetsfunktioner för 35-årsmaximum') >> hold on >> for k=1:25; >> fgevb = gevpdf(x,-cb(k),sigmab(k),mub(k)); >> plot(x,fgevb) >> end >> plot(x,fgev,'r-','linewidth',2) % rita igen så den syns, och bredare >> hold off >> figure(12) >> plot(x,fgev,'r-') % Fgev beräknades tidigare >> title('25 bootstrapade fördelningsfunktioner för 35-årsmaximum') >> hold on >> for k=1:25; >> Fgevb = gevcdf(x,-cb(k),sigmab(k),mub(k)); >> plot(x,fgevb) >> end >> plot(x,fgev,'r-','linewidth',2) >> hold off Uppgift: Verkar fördelningen vara enkel att bestämma?