Lunds tekniska högskola Matematikcentrum Matematisk statistik STATISTISKA METODER FÖR SÄKERHETSANALYS FMS065 Datorövning 6 Extremvärden och Peak over Threshold I denna datorövning ska vi använda mätningarna av den signifikanta våghöjen 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. 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, den 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 2011. Rådata finns i variabeln data. En förklaring till variablerna finns på http://www.ndbc.noaa.gov/measdes.shtml. 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:
ii >> figure(2) >> plot(1:12,monthmax(:,2:13), - ) 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 10-årsmaximum med hjälp av den empiriska fördelningen 2.2 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ördelningan 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 = 9 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 = 9; % 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
iii Uppgift: Hur ofta kan man förvänta sig att dagsmaximum av våghöjden överstiger 9 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]) >> 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 det är 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: Är parametern c 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), g ) % Gen. Pareto c<>0 >> hold off Uppgift: Ser det ut att passa bra med exponentialfördelning? Eller bättre med generaliserad Pareto?
iv 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-dags vå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? 2.3 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 34 å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 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-maximum GEV-fördelat med parametrar = { c (ÐN ) c, c 0 a, c = 0 Ñ = { u + a, c 0 c u + a ln ÐN, c = 0 Vi skattar fördelningen för 10-årsmaximum M 10 å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.25*10; % 10 år >> sigmagev = a*(lambda*n)^c; % GEV >> mugev = u+(sigma-a)/c; % GEV >> sigmagum = ahat; % Gumbel >> mugum = u+ahat*log(lambda*n); % Gumbel 1 Jämför med centrala gränsvärdessatsen som säger att summan är ungefär normalfördelad.
v >> 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 10-årsmaximum ) >> Fgev = gevcdf(x,-c,sigmagev,mugev); % -c i Matlabs GEV! >> Fgum = gevcdf(x,0,sigmagum,mugum); >> figure(9) >> plot(x,fcev, -,x,fcum, r ) >> legend( c <> 0, c = 0 ) >> title( Fördelningsfunktion för 10-årsmaximum ) Uppgift: Blev det skillnad på fördelningarna när vi antar c = 0 resp. c 0? Nu vill vi beräkna 1000-decennievågen, dvs den där P(M 10 å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 >> x0sum = mugum-sigmagum*log(-log(1-alpha)) % Gumbel Uppgift: Vilken version gav störst skattning? 2.4 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 1000-decennievå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. >> x0boot = []; % Tom x0-skattning. >> 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 > 9? lambdab = length(iu)/ndata; % Skatta lambda.
vi phat = gpfit(xb(iu)-u); % Skatta GPD-param. cb = -phat(1); % phat(1)=-c. ab = phat(2); sigmab = ab*(n*lambdab)^cb; % Gör om till GEV-parametrar. mub = u+(sigmab-ab)/cb; %..och skatta kvantilen: x0boot(k,1) = mub+sigmab/cb*(1-(-log(1-alpha))^cb); 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. Vi gör ett bootstrapintervall istället: >> 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 av 1000-decennievågen vara tillförlitlig?