Vous êtes sur la page 1sur 19

TD Modélisation statistique des valeurs extrêmes Corrigé

M1 EURIA 2020-2021

Nicolas Raillard (nicolas.raillard@ifremer.fr)

25/03/2021

Exercice 1
1. On va chercher dans cet exercice à caractériser les loi limites de la moyenne empirique des lois suivantes:

• U ∼ U([− 12 , − 12 ];
• Z ∼ N (0, 1);
• X := sign(U ) × log(1 − 2|U |) (Loi de Laplace)
• T ∼ T (1.8)

a. Simuler un échantillon de taille 50 et calculer la moyenne empirique correspondante;


b. Tracer un histogramme de la distribution de cet estimateur;
c. Refaire l’expérience pour N=500, puis 5000;
d. Quel commentaires peut-on en tirer ?

2. Refaire l’expérience sur la loi des maxima.

ndraw=1000L #Nombre de tirages de max


N=list(50,500,5000) #Taille des échantillons
names(N)<-N
#Tirage de lois uniformes sur (0,1)
simulated.probs=purrr::map(N, function(n){array(runif(4*n*ndraw),dim=c(4,n,ndraw))})
#Calcul de la moyenne des échantillons pour trois distributions
Calcul_Mean = function(x){
sims = data.frame(Uniform=x[2,],
Normal=qnorm(x[1,]),
Laplace=sign(1/2-x[3,])*log(1-2*abs(1/2-x[3,])),
Student=qt(x[4,],df=1.8) )
res=apply(sims, 2, mean)
}
#Calcul de la distribution des moyennes empiriques
Law_Mean = lapply(simulated.probs, function(sims){
cbind(N=paste0("N=",dim(sims)[2]),
reshape::melt(as.data.frame(t(apply(sims,3,Calcul_Mean))),
id.vars=NULL))
})

Law_Mean = do.call(rbind,Law_Mean)

1
Law_Mean %>% ggplot(aes(x=value,fill=variable)) +
stat_bin(bins=30)+
facet_wrap(variable~N,scale="free",ncol=3)+
theme_light() +
theme(legend.position='none') +
scale_fill_discrete("Distribution")

Uniform Uniform Uniform


N=50 N=500 N=5000
100
75 90
75
50 50 60
25 25 30
0 0 0
0.4 0.5 0.6 0.475 0.500 0.525 0.49 0.50 0.51

Normal Normal Normal


N=50 N=500 N=5000
100
75 75
75
50 50 50
25 25 25
0 0 0
−0.25 0.00 0.25 −0.1 0.0 0.1 −0.050 −0.025 0.000 0.025
count

Laplace Laplace Laplace


N=50 N=500 N=5000
100 100
75 75 75
50 50 50
25 25 25
0 0 0
−0.4 0.0 0.4 −0.2 −0.1 0.0 0.1 0.2 −0.04 0.00 0.04 0.08

Student Student Student


N=50 N=500 N=5000
600 400
300
300
400
200 200
100 200
100
0 0 0
−5.0 −2.5 0.0 2.5 5.0 7.5 −6 −4 −2 0 2 −1.0 −0.5 0.0 0.5
value

#Calcul du max des échantillons pour trois distributions


Calcul_Max = function(x){
sims = data.frame(Uniform=x[2,],

2
Normal=qnorm(x[1,]),
Laplace=sign(1/2-x[3,])*log(1-2*abs(1/2-x[3,])),
Student=qt(x[3,],df = 1.8))
res=apply(sims, 2, max)
}

#Calcul de la loi des maxima empiriques


Law_Maxima = lapply(simulated.probs, function(sims){
cbind(N=paste0("N=",dim(sims)[2]),
reshape::melt(as.data.frame(t(apply(sims,3,Calcul_Max))),
id.vars=NULL))
})

Law_Maxima = do.call(rbind,Law_Maxima)

Law_Maxima %>% ggplot(aes(x=value,fill=variable)) +


stat_bin(bins=30)+
facet_wrap(variable~N,scale="free",ncol=3)+
theme_light() +
theme(legend.position='none') +
scale_fill_discrete("Distribution")

3
Uniform Uniform Uniform
N=50 N=500 N=5000
200 150
150
150
100 100
100
50 50 50

0 0 0
0.85 0.90 0.95 1.00 0.985 0.990 0.995 1.000 0.9988 0.9992 0.9996 1.0000

Normal Normal Normal


N=50 N=500 N=5000
125
100
100
75 100
75
50 50 50
25 25
0 0 0
1 2 3 4 2 3 4 5 3.0 3.5 4.0 4.5 5.0 5.5
count

Laplace Laplace Laplace


N=50 N=500 N=5000
150
120
100
100 80

50 50
40

0 0 0
2.5 5.0 7.5 10.0 12.5 5.0 7.5 10.0 12.5 7.5 10.0 12.5 15.0

Student Student Student


N=50 N=500 N=5000
600
750 400
400 300
500
200
250 200
100
0 0 0
0 250 500 750 1000 0 250 500 750 1000 0 1000 2000 3000 4000
value

Exercice 2
Question 1

n=5000
X=rt(n,df=3)
qqnorm(X,pch=20)
qqline(X)

4
20
10
Sample Quantiles

0
−10
−20

−4 −2 0 2 4

Standard Normal Quantiles

Question 2

n=5000
X=rt(n,df=3)
Y=rt(n,df=100)
qqplot(X,Y,pch=20)

5
1−1 line
regression line
95% confidence bands
2
y Quantiles

0
−2
−4

−30 −20 −10 0 10

x Quantiles

Question 3

df=3
bloc_size=1000
n_blocs=5000
Y=matrix(rt(bloc_size*n_blocs,df=2),nrow = bloc_size)
M=apply(Y,2,max)
fit=fgev(M)
fit

6
##
## Call: fgev(x = M)
## Deviance: 42777.24
##
## Estimates
## loc scale shape
## 22.3135 11.1705 0.4973
##
## Standard Errors
## loc scale shape
## 0.17939 0.17218 0.01361
##
## Optimization Information
## Convergence: successful
## Function Evaluations: 61
## Gradient Evaluations: 19

confint(fit)

## 2.5 % 97.5 %
## loc 21.9619074 22.6651095
## scale 10.8330206 11.5079548
## shape 0.4705995 0.5239676

par(mfrow=c(2,2))
plot(fit) #comparaison loi empirique-loi ajusté

7
1.0
Probability Plot Quantile Plot

12000
0.8

8000
Empirical
0.6
Model

0.4

4000
0.2
0.0

0
0.0 0.2 0.4 0.6 0.8 1.0 0 500 1000 1500

Empirical Model

Density Plot 12000


Return Level Plot
0.010

Return Level

8000
Density

0.005

4000
0.000

0 1000 2000 3000 4000 5000 1e−01 1e+01 1e+03

Quantile Return Period

Quand df est grand, loi de Student est proche d’une loi normale. On peut faire un graphique en échelle
Gumbel (log-log) pour vérifier sur l’hypothèse ξ = 0 est crédible.

xord<-sort(M,decreasing=F)
inds <- (1:n_blocs)/(n_blocs+1)
gbquant<- -log(-log(inds))
plot(gbquant,xord,pch=20)
reg.lin<-lm(xord~gbquant)
coeff<- reg.lin$coefficients
abline(coeff[1],coeff[2],
col="red",lwd=2)

8
4000
3000
xord

2000
1000
0

−2 0 2 4 6 8

gbquant

Questions 4.a. et 4.b.

p=.999
df=3
x=rt(n=5000,df=df)
qt(p,df=df) #vraie valeur

## [1] 10.21453

9
quantile(x,p) #quantile empirique

## 99.9%
## 9.108651

qnorm(p=p,mean=mean(x),sd=sd(x)) #avec approximation gaussienne

## [1] 5.455147

Question 4.c.

Un calcul simple montre que le quantile d’ordre p de la distribution de l’échantillon d’origine est le quantile
d’ordre pl de la distribution des max par blocs de taille l puisque

P (max(X1 , ..., Xl ) < x) = P (X1 < x)l

On peut utiliser la fonction fgev pour estimer directement un quantile (cf commandes ci-dessous).
l=100; #taille des blocs
m=apply(matrix(x,ncol=l,byrow=TRUE),1,max)
fit = fevd(m)

qevd(pˆl, loc = fit$results$par[1],scale = fit$results$par[2],shape = fit$results$par[3]) #estimation d

## location
## 9.982058

Question 4.d: comparaison des différents estimateurs par simulation

N=10ˆ3 #nombre de simulations


p=.999 #niveau de quantile
#p=.9999 : événement qui se produit une fois tous les 10000 observations
df=5
q1=numeric(N)
q2=numeric(N)
q3=numeric(N)
for (i in 1:N){
x=rt(n=2000,df=df)
q1[i]=quantile(x,p)#quantile empirique
q2[i]=qnorm(p=p,mean=mean(x),sd=sd(x))#approx gaussienne
#max par blocs######
l=100; #taille des blocs
m=apply(matrix(x,ncol=l,byrow=TRUE),1,max)
fit=fevd(m)
q3[i]=qevd(pˆl, loc = fit$results$par[1],scale = fit$results$par[2],shape = fit$results$par[3])
}

q=data.frame(empir=q1,normal=q2,maxbloc=q3)
boxplot(q)
q0=qt(p,df=df) #vraie valeur
abline(q0,0,col='red')

10
10
9
8
7
6
5
4

empir normal maxbloc

apply(q,2,mean)-q0 #biais

## empir normal maxbloc


## -0.21114843 -1.90243817 0.01905059

apply(q,2,sd) #écart-type

## empir normal maxbloc


## 0.8409880 0.1281453 0.8551075

11
apply((q-q0)ˆ2,2,mean) #EQM= biaisˆ2+ variance

## empir normal maxbloc


## 0.7511371 3.6356758 0.7308406

L’estimateur basé sur l’approximation gaussienne sous-estime les quantiles. Les méthodes issues de la théorie
des valeurs extrêmes marchent mieux pour les quantiles vraiment extrêmes.

Exercice 3
Question 1
 
x + log(n)
P [λMn − log(n) ≤ x] = P Mn ≤
λ
 
x + log(n)
= Fn
λ
x+log(n) n
h i
= 1 − e−λ λ
 n
1
= 1 − e−x
n
→ exp e−x
 
n→∞

Donc on a an = 1/λ et bn = − log(n)


λ .

Question 2

En prenant x < 0 et n > −x, on a:

P [n(Mn − 1) ≤ x] = P Mn ≤ n−1 x + 1
 
 x n
= 1+
n
→ ex
n→∞

Exercice 4
Question 2

SP <- read_csv("SP500_1950-2019.csv")

y=SP$Close
plot(SP$Date,y,type='l')

12
3000
2500
2000
y

1500
1000
500
0

1960 1980 2000 2020

SP$Date

x=diff(log(y))
n=length(x)
plot(SP$Date[1:n],x,type='l')

13
0.10
0.05
0.00
−0.05
x

−0.10
−0.15
−0.20

1960 1980 2000 2020

SP$Date[1:n]

La volatilité temporelle est variable

Question 3

qqnorm(x)
qqline(x,col='red')

14
0.10
0.05
0.00
Sample Quantiles

−0.05
−0.10
−0.15
−0.20

−4 −2 0 2 4

Standard Normal Quantiles

quantile(x,.999)

## 99.9%
## 0.0467969

qnorm(.999,mean=mean(x),sd=sd(x))

## [1] 0.03016684

On constate que les observations ont une queue plus lourde que la loi normale.

15
Question 4

x=-x
an=lubridate::year(SP$Date[2:(n+1)])
m=tapply(x,an,max)
bloc_length = tapply(x,an,length)
taban=unique(an)
par(mfrow=c(2,1))
plot(taban,m,type='l',main='max annuel')
plot(taban,bloc_length,type='l',main="Nombre d'observations par an")

max annuel
0.15
m

0.05

1950 1960 1970 1980 1990 2000 2010 2020

taban

Nombre d'observations par an


255
bloc_length

245
235
225

1950 1960 1970 1980 1990 2000 2010 2020

taban

16
fit=fevd(m)
ci(fit,type="parameter") #loi à queue lourde

## fevd(x = m)
##
## [1] "Normal Approx."
##
## 95% lower CI Estimate 95% upper CI
## location 0.021214362 0.02390611 0.02659786
## scale 0.007774568 0.01018113 0.01258769
## shape 0.216059246 0.46196444 0.70786964

par(mfrow=c(2,2))
plot(fit)

17
fevd(x = m)

Quantiles from Model Simulated Data


1−1 line
0.05 0.10 0.15 0.20

0.25
regression line
Empirical Quantiles

95% confidence bands

0.15
0.05
0.05 0.10 0.15 0.05 0.10 0.15 0.20

Model Quantiles m Empirical Quantiles


40

Empirical
Modeled
0.8
30

Return Level
Density

20

0.4
10

0.0
0

0.00 0.05 0.10 0.15 0.20 0.25 2 5 10 50 200 1000

N = 75 Bandwidth = 0.00568 Return Period (years)

#diagnostique OK
#lois à queue lourde (fréchet)

p=0.999
l=mean(bloc_length)
qgev(pˆl,loc = fit$results$par[1],scale = fit$results$par[2],shape = fit$results$par[3])

## location
## 0.04356052

18
1/(1-pgev(m[taban==1987],loc = fit$results$par[1],scale = fit$results$par[2],shape = fit$results$par[3]

## shape
## 156.455

19

Vous aimerez peut-être aussi