Freakonometrics

To content | To menu | To search

Tag - quantile

Entries feed - Comments feed

Saturday, November 17 2012

Le mois des (boites à) moustaches

On célèbre cette année les 35 ans d'un livre qui a révolutionné la statistique, tant sur les aspects computationnels que graphiques: Exploratory Data Analysis par John Tukey. La légende prétend (on pourra relire a brief history of S par Richard Becker) que ce livre a inspiré ce qui allait devenir R, 
"Commercial software did not fit well into our research environment. It often used a ‘‘shotgun’’ approach — print out everything that might be relevant to the problem at hand because it could be several hours before the statistician could get another set of output. This was reasonable when computing was done in a batch mode. However, we wanted to be able to interact with our data, using Exploratory Data Analysis (Tukey, 1971) techniques. In addition, commercial statistical software usually didn’t compute what we wanted and was not set up to be modified."

En particulier, c'est dans ce livre qu'est introduit un outil graphique intéressant pour visualiser des données, le boxplot, appelé en français boite à moustaches (que tous les statisticiens se doivent d'utiliser en ce mois de Movembre). Dans la version originale, les boites sont verticales

mais mis horizontalement, on voit une boite, avec des moustaches. Cela dit, les moustaches ne sont pas toujours ce que l'on croit. Par exemple, on pense souvent (et moi le premier, il y a encore peu) que la boite à moustaches permettait de visualiser des valeurs extrêmes, voire des quantiles s'il y a trop de données (le maximum peut - en effet - être très très grand)

C'est malheureusement plus compliqué que ca... Afin de mieux comprendre ce qu'on trace, regardons le jeu de données suivant,
> set.seed(1)
> X=rlnorm(99)

(on est ici en échelle logarithmique). Pour commencer, on peut faire une boite à moustache avec une visualisation du minimum (à gauche) et du maximum (à droite)
> boxplot(X,horizontal=TRUE,log="x",range="0")

Et effectivement, on retrouve facilement tous les paramètres: ceux de la boite (en rouge)
> abline(v=median(X),lty=2,col="red")
> abline(v=quantile(X,.25),lty=2,col="red")
> abline(v=quantile(X,.75),lty=2,col="red")
et ceux de la moustache (en bleu)
> abline(v=min(X),lty=2,col="blue")
> abline(v=max(X),lty=2,col="blue")
Mais ce n'est pas la version standard de la boite à moustaches, qui est - sous R - la suivante
> boxplot(X,horizontal=TRUE,log="x")

Si la borne inférieure de la moutache est toujours le minimum (en tous cas ici), pour la partie supérieure... c'est plus compliqué. Malheureusement ce n'est pas un quantile standard (ceux à 90% et 95% sont représentés ci-dessus en mauve). Pour comprendre ce que c'est, il faut regarder le code: ici, on rajoute au quartile supérieur (la partie de droite de la boite) un pourcentage de la distance inter-quartile (la longueur de la boite), et ce pourcentage est le suivant
> M=boxplot(X)$stats
> (M[5]-M[4])/(M[4]-M[2])
[1] 1.350628
> 2*qnorm(.75)
[1] 1.34898
Plusieurs sites ou ouvrages suggèrent d'utiliser 1.5 fois la longueur interquartile, mais sous R, on utilise . Il faut le savoir (je l'ai appris un peu par hasard en faisant une formation sur la régression quantile au R Montréal Group au printemps passé, cf. ici). Et effectivement, on retrouve les bornes de la moustache,
> abline(v=quantile(X,.75)+2*qnorm(3/4)*IQR(X),lty=2,col="blue")
> abline(v=min(X),lty=2,col="blue")
et je laisse les quantiles pour montrer que (malheureusement) ce n'est pas ce qui est utilisé ici,
> abline(v=quantile(X,.9),lty=2,col="purple")
> abline(v=quantile(X,.95),lty=2,col="purple")
Cela dit, comme je l'évoquais lors de la formation (ici), beaucoup de monde laisse planer une réelle ambiguité sur ce qui est représenté par ces boites à moustaches... Et le fait que ce ne soit pas un quantile me gene un peu... Par exemple, ici on avait la boite à moustaches suivante

Si je prends les 25 plus petites observations, et que je les divise par 4, on obtient

La partie de gauche bouge (c'est normal, c'est la partie qu'on a modifiée), et la médiane reste identique, ainsi que la partie droite de la boite (ce qui est normal, ce sont des quantiles au delà de 25%). Mais de manière un peu génante, la borne supérieure de la moustache s'est ralongée...  C'est normal, car on utilise une distance inter-quartile. Mais on n'a pas touché aux grandes observations, c'est donc génant de la voir bouger ainsi... non ?

Wednesday, April 25 2012

Short versus long papers, in academic journals

This Monday, during my talk on quantile regressions (at the Montreal R-meeting), we've seen how those nice graphs could be interpreted, with the evolution of the slope of the linear regression, as a function of the probability level. One illustration was on large hurricanes, from Elsner, Kossin & Jagger (2008). The other one was on birthweight, from Abrevaya (2001).

It is also to illustrate that technique to academic publication, e.g. the length of papers, over time. Actually, the data we can extract from Scopus are quite similar to the ones uses on hurricanes. For several journals, it is possible to look at the length of articles. Since Scopus is quite expensive ($60,000 per year for the campus, as far as remember, so I can imagine the penalty I might have to pay for sharing such a dataset)

base=read.table("/home/scopus.csv",
header=TRUE,sep=",")
pages=base$Page.end-base$Page.start
year=base$Year

Again, a first idea can be to look at boxplots, and regression on (nonparametric) quantiles, here for Econometrica,

boxplot(pages~as.factor(year),col="light blue")
Q=function(p=.9) as.vector(by(pages,as.factor(year),
function(x) quantile(x,p)))
u=1:16
points(u,Q(p),pch=19,col="blue")
abline(lm(Q(p)~u,weights=table(year)),lwd=2,col="blue")

Consider now (as in the slides in the previous post) a quantile regression (instead of a regression on quantiles), for instance in the Annals of Probability,

library(quantreg)
u=seq(.05,.95,by=.01)
coefstd=function(u) summary(rq(pages~year,
tau=u))$coefficients[,2]
coefest=function(u) summary(rq(pages~year,
tau=u))$coefficients[,1]
CS=Vectorize(coefstd)(u)
CE=Vectorize(coefest)(u)
k=2
plot(u,CE[k,],ylim=c(min(CE[k,]-2*CS[k,]),
max(CE[k,]+2*CS[k,])))
polygon(c(u,rev(u)),c(CE[k,]+1.96*CS[k,],
rev(CE[k,]-1.96*CS[k,])),
col="light green",border=NA)
lines(u,CE[k,],lwd=2,col="red")
abline(h=0)

We have the following slope, for the year, as a function of the probability level,

The slope is always positive, so size of papers is increasing with time, short and long papers. But the influence of time is much larger for long paper than short one: for short papers (lower decile) every year, the size keeps increasing, with one more page every three years. For long paper (upper decile), it is two more pages every three years.

If we look now at the Annals of Statistics, we have

and for the evolution of the slope of the quantile regression,

Again the impact is positive: papers are longer in 2010 than 15 years ago. But the trend is the reverse: short papers (lower decile) are much longer, almost one more page every year, with long paper increase only by one more page every two years... Initially, I want to run such a study on a much longer term, with quantile regressions and splines to see when there might have been a change, both in lower and upper tails. Unfortunately, as suggested by some colleagues, there might have been some changes in the format of the journal (columns, margins, fonts, etc). That's a shame, because I rediscover nice short papers of 5-10 pages published 20 or 30 years ago. They are nice to read (and also potentially interesting for a post on the blog). 5 pages, that's perfect, but 40 pages, that's way too long. I wonder if I am the only one having this feeling, missing those short but extremely interesting papers....

Tuesday, April 24 2012

Régression médiane et géométrie

Suite à mon exposé d'hier, Pierre me demandait d'argumenter un point que j'avais évoqué oralement sans le justifier: " une régression médiane passe forcément par deux points du nuage ". Par exemple,

x=c(1,2,3)
y=c(3,7,8)
plot(x,y,pch=19,cex=1.5,xlim=c(0,4),ylim=c(0,10))
library(quantreg)
abline(rq(y~x,tau=.5),col="red")

Essayons de le justifier... de manière un peu heuristique. Commençons un peu au hasard, avec une droite qui passe "entre" les points (on admettra que la régression médiane sépare l'espace en deux, avec la moitié des points en dessous, la moitié au dessus, à un près pour des histoires de parité).

plot(x,y,pch=19,cex=1.5,xlim=c(0,4),ylim=c(0,10))
abline(a=-1,b=3.2,col="blue")

c'est joli, mais on peut sûrement faire mieux. En particulier, on va chercher ici à minimiser la somme des valeurs absolue des erreurs (c'est le principe de la régression médiane). Essayons de translater la courbe, vers le haut, ou vers le bas,

plot(x,y,pch=19,cex=1.5,xlim=c(0,4),ylim=c(0,10))
abline(a=-1,b=3.2,col="blue",lwd=2)
for(i in seq(-2,3,by=.5)){
abline(a=i,b=3.2,col="blue",lty=2)}

Si on regarde ce que vaut la somme des valeurs absolues des erreurs, on a

d=function(h) sum(abs(y-(h+3.2*x)))
H=seq(-4,6,by=.01)
D=Vectorize(d)(H)
plot(H,D,type="l")

Formellement, l'optimum est ici
> optimize(d,lower=-5,upper=5)
$minimum
[1] -0.2000091
 
$objective
[1] 2.200009

Bref, retenons cette courbe, et notons qu'elle passe par un des points,

Et c'est assez normal. On commençait avec deux points au dessus, et un en dessous. Soit la somme des valeurs absolues des erreurs . Si on translate de , on passe de à (tant que l'on a toujours deux points au dessus, car celui en dessous sera toujours en dessous). Si on translate de , (là encore tant qu'il n'y a qu'un point en dessous). Bref, on a intérêt à translater vers le haut. Si on dépasse le premier point rencontré, on se retrouve dans la situation inverse, avec un point au dessus et deux au dessous, et on a intérêt à redescendre. Bref, la translation optimale revient a s'arrêter dès qu'on croise un point. Autrement dit, la régression passe forcément par un point. Au moins.

Maintenant, essayons de faire pivoter la courbe autour de ce point, là encore afin de minimiser la somme des valeurs absolues des erreurs,

plot(x,y,pch=19,cex=1.5,xlim=c(0,4),ylim=c(0,10))
abline(a=optimize(d,lower=-5,upper=5)$minimum,b=3.2,
col="blue",lwd=2) points(x[1],y[1],cex=1.8,lwd=2,col="blue") for(i in seq(-1,5,by=.25)){ abline(a=(y[1]-i*x[1]),b=i,col="blue",lty=2)}

La distance est alors, en fonction de la pente de la droite

d2=function(h) sum(abs(y-((y[1]-h*x[1])+h*x)))
H=seq(-4,6,by=.01)
D=Vectorize(d2)(H)
plot(H,D,type="l")

Là encore on peut formaliser un peu

> optimize(d2,lower=-5,upper=5)
$minimum
[1] 2.500018
 
$objective
[1] 1.500018

Et si on regarde cette dernière droite, on passe par deux points,

plot(x,y,pch=19,cex=1.5,xlim=c(0,4),ylim=c(0,10))
h=optimize(d2,lower=-5,upper=5)$minimum
abline(a=(y[1]-h*x[1]),
b=h,col="purple",lwd=2)

Pour comprendre pourquoi, comparons les deux cas,

  • en faisant un pivot vers le bas, pour un des points, la valeur absolue des erreurs augmente alors que pour l'autre, elle diminue

  • en faisant un pivot vers le haut, là encore pour un des points, la valeur absolue des erreurs augmente alors que pour l'autre, elle diminue, mais en sens inverse par rapport au cas précédent,

Et pour faire simple, dans le premier cas, le gain (sur la baisse) compense la perte, alors que dans le second cas, c'est le contraire. Bref, on a intérêt à pivoter vers le bas, ou vers le point à droite. Jusqu'à l'atteindre. Et optimalement, on passera par ce point. Bref, on passera par deux points. Et je laisse les plus courageux regarder avec plus de trois points, mais c'est toujours pareil...

Monday, April 23 2012

Talk on quantiles at the R Montreal group

This afternoon, I will be giving a two-hour talk at McGill on quantiles, quantile regressions, confidence regions, bagplots and outliers. Before defining (properly) quantile regressions, we will mention regression on (local) quantiles, as on the graph below, on hurricanes,

In order to illustrate quantile regression, consider the following natality database,

base=read.table(
"http://freakonometrics.free.fr/natality2005.txt",
header=TRUE,sep=";")

We can use it produce those nice graphs we can find in several papers, modeling weight of newborns,

u=seq(.05,.95,by=.01)
coefstd=function(u) summary(rq(WEIGHT~SEX+
SMOKER+WEIGHTGAIN+BIRTHRECORD+AGE+ BLACKM+
BLACKF+COLLEGE,data=base,tau=u))$coefficients[,2]
coefest=function(u) summary(rq(WEIGHT~SEX+
SMOKER+WEIGHTGAIN+BIRTHRECORD+AGE+ BLACKM+
BLACKF+COLLEGE,data=base,tau=u))$coefficients[,1]
CS=Vectorize(coefstd)(u)
CE=Vectorize(coefest)(u)

The slides can be downloaded on the blog, as well as the R-code.

Friday, February 10 2012

exchangeability, credit risk and risk measures

Exchangeability is an extremely concept, since (most of the time) analytical expressions can be derived. But it can also be used to observe some unexpected behaviors, that we will discuss later on with a more general setting. For instance, in a old post, I discussed connexions between correlation and risk measures (using simulations to illustrate, but in the context of exchangeable risk, calculations can be performed more accurately). Consider again the standard credit risk problem, where the quantity of interest is the number of defaults in a portfolio. Consider an homogeneous portfolio of exchangeable risk. The quantity of interest is here

http://freakonometrics.blog.free.fr/public/perso5/credit-01.gif

or perhaps the quantile function of the sum (since the Value-at-Risk is the standard risk measure). We have seen yesterday that - given the latent factor - http://freakonometrics.blog.free.fr/public/perso5/exch67.gif (either the company defaults, or not), so that

http://freakonometrics.blog.free.fr/public/perso5/exch66.gif

i.e. we can derive the (unconditional) distribution of the sum

http://freakonometrics.blog.free.fr/public/perso5/exch60.gif

so that the probability function of the sum is, assuming that http://freakonometrics.blog.free.fr/public/perso5/exch76.gif

http://freakonometrics.blog.free.fr/public/perso5/exch68.gif

Thus,  the following code can be used to calculate the quantile function
> proba=function(s,a,m,n){
+ b=a/m-a
+ choose(n,s)*integrate(function(t){t^s*(1-t)^(n-s)*
+ dbeta(t,a,b)},lower=0,upper=1,subdivisions=1000,
+ stop.on.error =  FALSE)$value
+ }
> QUANTILE=function(p=.99,a=2,m=.1,n=500){
+ V=rep(NA,n+1)
+ for(i in 0:n){
+ V[i+1]=proba(i,a,m,n)}
+ V=V/sum(V)
+ return(min(which(cumsum(V)>p))) }
Now observe that since variates are exchangeable, it is possible to calculate explicitly correlations of defaults. Here

http://freakonometrics.blog.free.fr/public/perso5/exch70.gif

i.e.

http://freakonometrics.blog.free.fr/public/perso5/exch71.gif

Thus, the correlation between two default indicators is then

http://freakonometrics.blog.free.fr/public/perso5/exch73.gif

http://freakonometrics.blog.free.fr/public/perso5/exch75.gif

Under the assumption that the latent factor is beta distributed

http://freakonometrics.blog.free.fr/public/perso5/exch78.gif

we get

http://freakonometrics.blog.free.fr/public/perso5/exch80.gif

Thus, as a function of the parameter of the beta distribution (we consider beta distributions with the same mean, i.e. the same margin distributions, so we have only one parameter left, with is simply the correlation of default indicators), it is possible to plot the quantile function,
> PICTURE=function(P){
+ A=seq(.01,2,by=.01)
+ VQ=matrix(NA,length(A),5)
+ for(i in 1:length(A)){
+ VQ[i,1]=QUANTILE(a=A[i],p=.9,m=P)
+ VQ[i,2]=QUANTILE(a=A[i],p=.95,m=P)
+ VQ[i,3]=QUANTILE(a=A[i],p=.975,m=P)
+ VQ[i,4]=QUANTILE(a=A[i],p=.99,m=P)
+ VQ[i,5]=QUANTILE(a=A[i],p=.995,m=P)
+ }
+ plot(A,VQ[,5],type="s",col="red",ylim=
+ c(0,max(VQ)),xlab="",ylab="")
+ lines(A,VQ[,4],type="s",col="blue")
+ lines(A,VQ[,3],type="s",col="black")
+ lines(A,VQ[,2],type="s",col="blue",lty=2)
+ lines(A,VQ[,1],type="s",col="red",lty=2)
+ lines(A,rep(500*P,length(A)),col="grey")
+ legend(3,max(VQ),c("quantile 99.5%","quantile 99%",
+ "quantile 97.5%","quantile 95%","quantile 90%","mean"),
+ col=c("red","blue","black",
+"blue","red","grey"),
+ lty=c(1,1,1,2,2,1),border=n)
+}
e.g. with a (marginal) default probability of 15%,
> PICTURE(.15)

On this graph, we observe that the stronger the correlation (the more on the left), the higher the quantile... Note that the same graph can be plotted with on the X-axis the correlation,


Which is quite intuitive, somehow. But if the marginal probability of default decreases, increasing the correlation might decrease the risk (i.e. the quantile function),
> PICTURE(.05)

(with the modified code to visualize the quantile as a function of the underlying default correlation) or even worse,

> PICTURE(.0075)

And it because all the more counterintuitive that the default probability decreases ! So in the case of a portfolio of non-very risky bond issuers (with high ratings), assuming a very strong correlation will lower risk based capital !

Thursday, February 9 2012

MAT8886 from tail estimation to risk measure(s) estimation

This week, we conclude the part on extremes with an application of extreme value theory to risk measures. We have seen last week that, if we assume that above a threshold http://freakonometrics.blog.free.fr/public/perso5/qt01.gif, a Generalized Pareto Distribution will fit nicely, then we can use it to derive an estimator of the quantile function (for percentages such that the quantile is larger than the threshold)

http://freakonometrics.blog.free.fr/public/perso5/qt03.gif

It the threshold is http://freakonometrics.blog.free.fr/public/perso5/qt02.gif, i.e. we keep the http://freakonometrics.blog.free.fr/public/perso5/qt04.gif largest observations to fit a GPD, then this estimator can be written

http://freakonometrics.blog.free.fr/public/perso5/qt06.gif

The code we wrote last week was the following (here based on log-returns of the SP500 index, and we focus on large losses, i.e. large values of the opposite of log returns, plotted below)

> library(tseries)
> X=get.hist.quote("^GSPC")
> T=time(X)
> D=as.POSIXlt(T)
> Y=X$Close
> R=diff(log(Y))
> D=D[-1]
> X=-R
> plot(D,X)
> library(evir)
> GPD=gpd(X,quantile(X,.975))
> xi=GPD$par.ests[1]
> beta=GPD$par.ests[2]
> u=GPD$threshold
> QpGPD=function(p){
+ u+beta/xi*((100/2.5*(1-p))^(-xi)-1)
+ }
> QpGPD(1-1/250)
97.5%
0.04557386
> QpGPD(1-1/2500)
97.5%
0.08925095 

This is similar with the following outputs, with the return period of a yearly event (one observation out of 250 trading days)

> gpd.q(tailplot(gpd(X,quantile(X,.975))), 1-1/250, ci.type =
+ "likelihood", ci.p = 0.95,like.num = 50)
Lower CI   Estimate   Upper CI
0.04172534 0.04557655 0.05086785 

or the decennial one

> gpd.q(tailplot(gpd(X,quantile(X,.975))), 1-1/2500, ci.type =
+ "likelihood", ci.p = 0.95,like.num = 50)
Lower CI   Estimate   Upper CI
0.07165395 0.08925558 0.13636620 

Note that it is also possible to derive an estimator for another population risk measure (the quantile is simply the so-called Value-at-Risk), the expected shortfall (or Tail Value-at-Risk), i.e.

http://freakonometrics.blog.free.fr/public/perso5/qt10.gif

The idea is to write that expression

http://freakonometrics.blog.free.fr/public/perso5/qt11.gif

so that we recognize the mean excess function (discussed earlier). Thus, assuming again that above http://freakonometrics.blog.free.fr/public/perso5/qt01.gif (and therefore above that high quantile) a GPD will fit, we can write

http://freakonometrics.blog.free.fr/public/perso5/qt12.gif

or equivalently

http://freakonometrics.blog.free.fr/public/perso5/qt13.gif

If we substitute estimators to unknown quantities on that expression, we get

http://freakonometrics.blog.free.fr/public/perso5/qt09.gif

The code is here

> EpGPD=function(p){
+ u-beta/xi+beta/xi/(1-xi)*(100/2.5*(1-p))^(-xi)
+ }
> EpGPD(1-1/250)
97.5%
0.06426508
> EpGPD(1-1/2500)
97.5%
0.1215077 

An alternative is to use Hill's approach (used to derive Hill's estimator). Assume here that http://freakonometrics.blog.free.fr/public/perso5/qt20.gif, where http://freakonometrics.blog.free.fr/public/perso5/qt21.gif is a slowly varying function. Then, for all http://freakonometrics.blog.free.fr/public/perso5/qt23.gif,

http://freakonometrics.blog.free.fr/public/perso5/qt24.gif

Since http://freakonometrics.blog.free.fr/public/perso5/qt21.gif is a slowly varying function, it seem natural to assume that this ratio is almost 1 (which is true asymptotically). Thus

http://freakonometrics.blog.free.fr/public/perso5/qt25.gif

i.e. if we invert that function, we derive an estimator for the quantile function

http://freakonometrics.blog.free.fr/public/perso5/qt26.gif

which can also be written

http://freakonometrics.blog.free.fr/public/perso5/qt07.gif

(which is close to the relation we derived using a GPD model). Here the code is

> k=trunc(length(X)*.025)
> Xs=rev(sort(as.numeric(X)))
> xiHill=mean(log(Xs[1:k]))-log(Xs[k+1])
> u=Xs[k+1]
> QpHill=function(p){
+ u+u*((100/2.5*(1-p))^(-xiHill)-1)
+ }

with the following Hill plot

For yearly and decennial events, we have here

> QpHill(1-1/250)
[1] 0.04580548
> QpHill(1-1/2500)
[1] 0.1010204

Those quantities seem consistent since they are quite close, but they are different compared with empirical quantiles,

> quantile(X,1-1/250)
99.6%
0.04743929
> quantile(X,1-1/2500)
99.96%
0.09054039 

Note that it is also possible to use some functions to derive estimators of those quantities,

> riskmeasures(gpd(X,quantile(X,.975)),1-1/250)
p   quantile      sfall
[1,] 0.996 0.04557655 0.06426859
> riskmeasures(gpd(X,quantile(X,.975)),1-1/2500)
p   quantile     sfall
[1,] 0.9996 0.08925558 0.1215137

(in this application, we have assumed that log-returns were independent and identically distributed... which might be a rather strong assumption).

An to conclude that post (and the session on extremes), here is the schedule for next weeks,

Wednesday, February 8 2012

delta method and quantile estimation

An alternative (to profile likelihood techniques) to derive confidence intervals is to use the delta method. Consider an estimator such that

http://freakonometrics.blog.free.fr/public/perso5/delta02.gif

then for any differentiable transformation

http://freakonometrics.blog.free.fr/public/perso5/delta03.gif

The proof of that result is based on Taylor's expansion (see here or there for more details on the theory, or even on this blog - here, in French or there in English - for some codes in R). This can be used to derive an asymptotic confidence interval for a quantile. Consider the following dataset

> base1=read.table(
+ "http://freakonometrics.free.fr/danish-univariate.txt",
+ header=TRUE)
> library(evir)
> X=base1$Loss.in.DKM

It is possible to fit a Generalized Pareto distribution on observations above a given threshold,

http://freakonometrics.blog.free.fr/public/perso5/mef08.gif

In that case, if http://freakonometrics.blog.free.fr/public/perso5/GPD10.gif exceed the threshold out of a sample of size http://freakonometrics.blog.free.fr/public/perso5/GPD11.gif, the estimator of the quantile

http://freakonometrics.blog.free.fr/public/perso5/GPD2.gif

i.e. http://freakonometrics.blog.free.fr/public/perso5/GPD05.gif. Then

http://freakonometrics.blog.free.fr/public/perso5/GPD06.gif

while

http://freakonometrics.blog.free.fr/public/perso5/GPD07.gif

i.e. it is now possible to implement the delta-method to derive the asymptotic variance of the quantile, and also (asymptotic) confidence intervals.
> u=5
> GPD=gpd(X,u)
> theta=GPD$par.ests
> sigma=GPD$varcov
> k=GPD$n.exceed
> n=length(X)
> p=.975
> Q=u+theta[2]/theta[1]*((n*(1-p)/k)^(-theta[1])-1)
> nabla=c(-theta[2]/theta[1]^2*((1-p)^(-theta[1])-1)-
+ theta[2]/theta[1]*(1-p)^(-theta[1]*log(1-p)),
+ 1/theta[1]*((1-p)^(-theta[1])-1))
> variance=t(nabla)%*%sigma%*%nabla

Based on the assumption of normality, it is possible to derive confidence intervals, and to compare them with the one obtained in R,

> c(Q-1.96/sqrt(k)*sqrt(variance),
+   Q+1.96/sqrt(k)*sqrt(variance))
[1] 13.11562 16.82852
+ tailplot(gpd(X,5))
+ gpd.q(tailplot(gpd(X,5)), .975, ci.type =
+ "likelihood", ci.p = 0.95,like.num = 50)
Lower CI Estimate Upper CI
13.33329 14.97207 17.18094 

Tuesday, September 13 2011

Tests multiples, et quantiles, partie 1

L'autre jour, le Docteur Borée parlait sur son blog d'anormale normalité. Il y parlait de « valeurs de référence » dans les analyses sanguines. Pour faire simple, il expliquait à un lectorat de non-statisticien la notion de quantile (en mélangeant d'ailleurs la notion de retour à la moyenne qui est une notion de corrélation ou d'économétrie - comme j'en parlais dans les premiers transparents de mon cours - et la notion de variabilité ou de variance, i.e. de dispersion autour d'une valeur centrale).

Si on dispose d'une mesure d'une certaine quantité (une tension, un taux de sucre dans le sang) que l'on va supposer normalisée, on cherche une quantité que l'on dépasse avec une probabilité faible. Bref, on cherche un quantile,

Jusque là rien de bien nouveau. Mais un moment est évoquée l'idée qu'on peut répéter le test, et qu'il est normal que de temps en temps une personne en bonne santé ait des mesures qui dépassent la valeur de référence. Dit de manière plus claire, si on prend la tension 20 fois de suite à une personne moyenne, il est normal qu'une fois elle dépasse la « valeurs de référence » (le quantile de niveau 95%). On retrouve d'ailleurs ici une notion liée à la période de retour. En effet, si une observation a une chance sur 20 d'atteindre le seuil, il faut en moyenne attendre 20 observations pour que le seuil ne soit dépassé.
A condition que les observations soient indépendantes et identiquement distribuées. Et c'est à mon avis là qu'il y a un soucis.
Supposons que l'on fasse http://freakonometrics.blog.free.fr/public/perso4/anorm01.gif mesures, http://freakonometrics.blog.free.fr/public/perso4/anorm02.gif et que l'on s'intéresse à un dépassement de seuil http://freakonometrics.blog.free.fr/public/perso4/anorm05.gif tel que http://freakonometrics.blog.free.fr/public/perso4/anorm03.gif (comme sur le graphique ci-dessus).
Si les observations sont indépendantes, alors la probabilité de ne jamais dépasser le seuil est
http://freakonometrics.blog.free.fr/public/perso4/anorm04.gif
qui est une jolie fonction décroissante avec le nombre d'observations,

Et effectivement, avec 20 observations, la probabilité qu'aucune ne dépasse le seuil est de l'ordre de 1/3. Mais peut-on continuer à penser que les observations sont indépendantes ?
En fait, un modèle qui semblerait plus pertinent serait peut-être un modèle à facteur, i.e.
http://freakonometrics.blog.free.fr/public/perso4/anorm06.gif
où ici http://freakonometrics.blog.free.fr/public/perso4/anorm07.gif est l'erreur (qu'on pourrait appeler erreur de mesure, ou idosyncratique) qui serait supposée indépendante d'une mesure sur l'autre. http://freakonometrics.blog.free.fr/public/perso4/anorm09.gif est la vraie valeur du taux de sucre, ou de la tension moyenne de l'individu.
Dans ce cas, on a un modèle gaussien multivariée dit échangeable, au sens où la corrélation entre http://freakonometrics.blog.free.fr/public/perso4/anorm10.gif et http://freakonometrics.blog.free.fr/public/perso4/anrom11.gif ne dépend pas des indices.
Commençons par deux observations. Dans ce cas, on a les distributions suivantes, qui vont du cas corrélé négativement en haut à gauche à un cas de dépendance forte (la variance du bruit devient très faible),

Ne jamais dépasser le seuil signifie ne jamais atteindre l'aire hachurée bleue. Cette probabilité croit avec la corrélation. En fait, cette probabilité est aussi liée à la dimension.

Sur le graphique ci-dessus, on a la probabilité qu'aucune des observations ne dépasse le seuil, en fonction de la corrélation entre les observations, et de la dimension ou du nombre d'observations (2 observations en bleu, 3 en vert, 4 en mauve, et 5 en rouge). En supposant l'indépendance (ici une corrélation nulle), on voit qu'avec 5 mesures, la probabilité qu'aucune n'atteigne le quantile à 95% est de l'ordre de 1/4 (ce que nous avions auparavant). Autrement dit, on a environ 25% de chance qu'une (au moins dépasse le seuil). Mais avec une forte corrélation, on peut atteindre 10%, voire 5% dans le cas d'une corrélation parfaite (i.e. un bruit négligeable).
Il convient donc de faire attention quand on fait plusieurs tests, mais je reviendrais plus en détails, par exemple pour trouver des bornes de confiance pour des fonctions, avec la correction de Bonferroni par exemple. Je pourrais aussi renvoyer à l'article que nous avions fait avec David Causeur sur les naissances les jours de pleine lune, qui évoquait ces tests multiples (sur hal). Mais on reviendra sur tout ça dans un billet plus complet...

Friday, May 27 2011

Quand il est optimal de ne rien faire et d'attendre

histoire de reprendre le titre d'un vieux billet mais dans un autre contexte, cf ici.
J'ai eu beaucoup de commentaires ou de réflexions suite à mes billets sur les accidents de la route, en France (ici, , ou encore). Certains me reprochaient de faire simplement de l'analyse statistique de chiffres, sans vraiment proposer de remèdes permettant de baisser le nombre de tués sur les routes. Ma première réponse, un peu simpliste consistait à dire que je ne suis que statisticien, et que faire baisser le nombre de tués sur les routes, c'est un problème politique (au sens étymologique du terme). Mais après réflexion, je me demande si c'est vraiment le cas... et si ce ne serait pas encore et toujours un problème de maths.
Par exemple, pour baisser le nombre de tués, une variable importante est le temps d'intervention des secours. Mais que vaut-il mieux ?

  • que des ambulances (et des services d'urgence) attendent patiemment qu'on les appelle,
  • ou que des ambulances tournent sur les routes, afin d'être au cœur de l'action...
Ceci est un problème de maths.... à condition de le formaliser un peu, bien entendu...
http://freakonometrics.blog.free.fr/public/perso3/animationpompiers.gif
Supposons que ma route soit schématisée par un segment http://freakonometrics.blog.free.fr/public/perso3/pompiers-01.gif (et que mon véhicule de secours peut faire demi-tour quand il le souhaite). Un accident survient à une localisation http://freakonometrics.blog.free.fr/public/perso3/pompiers-02.gif, qui est aléatoire. On pourrait supposer que les accidents se produisent de manière uniforme sur la route, i.e. sur http://freakonometrics.blog.free.fr/public/perso3/pompiers-01.gif. Mais ce n'est peut être pas réaliste. On notera alors http://freakonometrics.blog.free.fr/public/perso3/pompiers-03.gif la distribution de http://freakonometrics.blog.free.fr/public/perso3/pompiers-02.gif sur http://freakonometrics.blog.free.fr/public/perso3/pompiers-01.gif.
Notons http://freakonometrics.blog.free.fr/public/perso3/pompiers-07.gif la localisation de l'ambulance (ou de la voiture des pompiers) qui viendra aider. Dans la première stratégie, il est optimal de ce mettre en 0 (qui est l'endroit moyen où surviennent les accidents), i.e. http://freakonometrics.blog.free.fr/public/perso3/pompiers-04.gif. C'est ma stratégie "ne rien faire": on attend que l'accident survienne avant de bouger.
Pour http://freakonometrics.blog.free.fr/public/perso3/pompiers-06.gif, on peut supposer que la voiture tourne, à vitesse constante, et donc http://freakonometrics.blog.free.fr/public/perso3/pompiers-06.gif sera uniforme sur http://freakonometrics.blog.free.fr/public/perso3/pompiers-01.gif.
La distance à parcourir est alors http://freakonometrics.blog.free.fr/public/perso3/pompiers-08.gif dans le premier cas, et http://freakonometrics.blog.free.fr/public/perso3/pompiers-09.gif  dans le second.
On suppose que dans les deux cas, la vitesse de pointe est la même et donc la seule variable d'intérêt est la distance au lieu d'accident.
Il faut alors se donner un critère de comparaison. Le plus simple est de dire que la stratégie 1 est meilleure que la stratégie 2 si http://freakonometrics.blog.free.fr/public/perso3/pompiers-10.gif.
Mais on pourrait aussi imaginer une stratégie basée sur les quantiles, par exemple, au lieu de dire on souhaite arriver en moyenne plus vite, dire on veut arriver plus vite dans 90% des scénarios. De manière équivalente, on peut aussi se dire que si le temps est trop long (disons http://freakonometrics.blog.free.fr/public/perso3/pompiers-11.gif) alors certaines pathologies ne sont plus curables, i.e. la distance trop longue (que l'on notera http://freakonometrics.blog.free.fr/public/perso3/pompiers-12.gif). On peut alors souhaiter que http://freakonometrics.blog.free.fr/public/perso3/pompiers-13.gif .
Commençons par la comparaison des moyennes,
  • Cas où les accidents se produisent uniformément sur la route
On suppose ici que http://freakonometrics.blog.free.fr/public/perso3/pompiers-02.gif est uniforme sur http://freakonometrics.blog.free.fr/public/perso3/pompiers-01.gif, alors
http://freakonometrics.blog.free.fr/public/perso3/pompiers-14.gif
 alors que si http://freakonometrics.blog.free.fr/public/perso3/pompiers-02.gif est uniforme, et supposé indépendant de http://freakonometrics.blog.free.fr/public/perso3/pompiers-06.gif,
http://freakonometrics.blog.free.fr/public/perso3/pompiers-15.gif
C'est à dire que dans ce cas, la stratégie 1 est meilleure que la stratégie 2.
  • Cas où les accidents se produisent non-uniformément sur la route
et notons http://freakonometrics.blog.free.fr/public/perso3/pompiers-03.gif leur distribution sur http://freakonometrics.blog.free.fr/public/perso3/pompiers-01.gif. Dans ce cas
http://freakonometrics.blog.free.fr/public/perso3/pompiers-16.gif
alors que
http://freakonometrics.blog.free.fr/public/perso3/pompiers-17.gif
i.e.
http://freakonometrics.blog.free.fr/public/perso3/pompiers-18.gif
Aussi, la stratégie 1 sera meilleur que la stratégie 2, au sens http://freakonometrics.blog.free.fr/public/perso3/pompiers-10.gif, si et seulement si
http://freakonometrics.blog.free.fr/public/perso3/pompiers-19.gif
mais comme les termes sous le signe intégral sont positifs, ça sera toujours le cas, et donc la stratégie 1 sera toujours préférable (et ce quelle que soit la distribution de http://freakonometrics.blog.free.fr/public/perso3/pompiers-06.gif). Il est alors toujours préférable de ne rien faire...
  • Comparaison de probabilités (et plus de valeurs moyennes)
Si on utilise l'autre critére de comparaison, et que l'on suppose http://freakonometrics.blog.free.fr/public/perso3/pompiers-02.gif uniformément distribué sur http://freakonometrics.blog.free.fr/public/perso3/pompiers-01.gif,
http://freakonometrics.blog.free.fr/public/perso3/pompiers-20.gif
Ca se visualise sur le dessin ci-dessous.

Et on peut généraliser en dimension 2, avec en abscisse http://freakonometrics.blog.free.fr/public/perso3/pompiers-02.gif (comme au dessus, i.e. le lieu de l'accident), et en ordonnée http://freakonometrics.blog.free.fr/public/perso3/pompiers-06.gif (le lieu où se trouve la voiture de secours lorsque l'accident survient). Dans ce cas la probabilité que l'on cherche est l'aire de l'aire bleue (ramenée à l'aire totale), i.e.

soit numériquement

http://freakonometrics.blog.free.fr/public/perso3/pompiers-21.gif
i.e.
http://freakonometrics.blog.free.fr/public/perso3/pompiers-22.gif
afin de faire ressortir le terme précédant. Aussi,
http://freakonometrics.blog.free.fr/public/perso3/pompiers-23.gif
quelle que soit la valeur http://freakonometrics.blog.free.fr/public/perso3/pompiers-12.gif. Autrement dit, là encore, la meilleure stratégie est encore la première: attendre au milieu de la route que l'accident survienne.
  • Comparaison de probabilités dans le cas général
Si on suppose que http://freakonometrics.blog.free.fr/public/perso3/pompiers-02.gif n'est plus uniformément distribué sur http://freakonometrics.blog.free.fr/public/perso3/pompiers-01.gif, il faut noter que ça se complique. On peut écrire
http://freakonometrics.blog.free.fr/public/perso3/pompiers-24.gif
mais pour la seconde stratégie,
http://freakonometrics.blog.free.fr/public/perso3/pompiers-25.gif
Et là les calculs sont un peu plus pénible... sauf numériquement...
  • si on suppose que les accident arrivent au bout de la route
i.e. plus aux extrémités qu'au centre du segment. On peut considérer une distribution dont la densité serait hyperbolique avec un minimum en 0, i.e.
http://freakonometrics.blog.free.fr/public/perso3/pompiers-26.gif
Le code R serait alors,
a=1
f=function(x){3*x^2/(2*a^3)}
PROB1d=function(d){
1-integrate(f,-a,d)$value+integrate(f,-a,-d)$value}
PROB2d=function(d){
g1=function(x){(a-x-d)*f(x)}
g2=function(x){(x+a-d)*f(x)}
(integrate(g1,-a,a-d)$value+integrate(g2,-a+d,a)$value)/(2*a)}
P1=Vectorize(PROB1d)
P2=Vectorize(PROB2d)
dist=seq(0,1,by=.025)
plot(dist,P1(dist),lwd=3,col="red",type="l")
lines(dist,P2(dist),lwd=3,col="blue")
  • si on suppose que les accident arrivent au centre la route
par exemple avec cette fois une densité hyperbolique avec un maximum en 0, i.e.
http://freakonometrics.blog.free.fr/public/perso3/pompiers-27.gif
Le code R serait alors obtenu en changeant la première ligne
f=function(x){3*(a^2-x^2)/(4*a^3)}
 
et graphiquement on a le figure ci-dessous avec en ordonnée les probabilités, en rouge la stratégie 1 et en bleu la stratégie 2, avec les accidents au bord (à gauche) ou au centre (à droite),

Moralité il est en général optimal de ne rien faire, plutôt que de vouloir en faire trop... Une bonne leçon que je devrais méditer un peu tiens... Une autre leçon serait que la politique ne sert à rien, et les maths à tout... mais je m'avance probablement un peu trop là...

Wednesday, March 9 2011

Playing with quantiles, part 2

It is common to look at best time at the Marathon. Or perhaps the distribution of the top100, as done by John Myles White on his blog here (data can be found there), as the graph below, with the density of the time for the first 100 men (in blue) and the first 100 women (in red).

Hence, men and women are different and men run faster than women. So what...?
A lot of people run those marathon. Almost 40,000 ran (and finished) the one in New York City. Instead of 100, shouldn't we keep more runners, e.g the top 5% ?
The other point is that it might be interesting to correct (or control) with the age. If men and women running the marathon do not have the same age, it might be an explanation for that difference.
Unfortunately, to run a quantile regression properly I need the entire dataset, with 40,000 runners. And on the website of the NY Marathon (here) it is possible to extract some information, but not the entire dataset (and my standard R robots did not work here). So I managed to extract the "worst" 10% runners in 2008, and run a quantile regression to get the 95% quantile regression curve, using the idea mentioned here.

I got the 95% quantile curve for men (in blue) and women (in red), and similarly for top runner, namely the 5% quantile curve.

On those graphs, if we exclude runners under 22, quantile curves for men are usually below the ones for women. Which confirms the first order dominance mentioned by John,
For those willing to play, here is the code (it is dirty since my dataset was dirty)
dataend=read.table("/home/arthur/NY2008-top.csv",header=FALSE,sep="\t")
nrow(dataend)
I=dataend[,5]
I[is.na(dataend[,5])]=dataend[is.na(dataend[,5]),6]
q=which(substr(as.character(I),1,1)%in%c("M","F"))
I=I[q]
age=as.numeric(substr(as.character(I),2,3))
sex=substr(as.character(I),1,1)=="M"
tp=as.character(dataend[,45])
i=which(tp=="");tp[i]=as.character(dataend[i,44])
i=which(tp=="");tp[i]=as.character(dataend[i,43])
i=which(tp=="");tp[i]=as.character(dataend[i,42])
tp=tp[q]
temps=((as.numeric(substr(tp,1,1))+as.numeric(substr(tp,3,4))/60)*26.21875)/60
propend=length(tp)/n2008Men
base=data.frame(age,temps)
base=base[sex==TRUE,]
reg=rq(temps~bs(age,7),data=base,tau=.05/propend)
u=seq(20,80)
bu=data.frame(age=u)
y2008m=predict(reg,newdata=bu)
propend=length(tp)/n2008Women
base=data.frame(age,temps)
base=base[sex==FALSE,]
reg=rq(temps~bs(age,5),data=base,tau=.05/propend)
u=seq(20,80)
bu=data.frame(age=u)
y2008w=predict(reg,newdata=bu)
But looking at archives (here 1983 compared with 2008) I noticed something strange. First, if we compare number of runners (here starters),

Men
Women
1983
12,838
2,553
2008
25,669
13,163
it looks like more and more women run the marathon nowadays. So this might have an impact on the results,

On the graph above, the have a strong line for 2008 and a thin one for 1983, and again men in blue and women in red. It looks like fast runners run as fast as before, but since there are more and more runners, the quantiles are going up, And by that time, women who ran the marathon were performing extremely well compared with men.
Anyway, this is now really a statistical analysis, but more a "how to say something when you cannot access a database entirely". But I still hope someday I will...  

Tuesday, March 8 2011

Playing with quantiles, part 1

A standard idea in extreme value theory (see e.g. here, in French unfortunately) is that to estimate the 99.5% quantile (say), we just need to estimate a quantile of level 95% for observations exceeding the 90% quantile.

In extreme value theory, we assume that the 90% quantile (of the initial distribution) can be obtained easily, e.g. the empirical quantile, and then, for the exceeding observations, we fit a Pareto distribution (a Generalized Pareto one to be precise), and get a parametric quantile for the 95% quantile. I.e.

http://freakonometrics.blog.free.fr/public/perso2/quant01.gif
which can be written
http://freakonometrics.blog.free.fr/public/perso2/quant02.gif
So, an estimation of the cumulative distribution function is
http://freakonometrics.blog.free.fr/public/perso2/quant03.gif
and if we invert it, we get the popular expression for high level quantiles,
http://freakonometrics.blog.free.fr/public/perso2/quant04b.gif
Hence, we do not really care about observations in the core of the distribution.

And I was wondering if this can be transposed with quantile regressions. Hence, I would like to get a quantile regression of level 90% (say) of http://freakonometrics.blog.free.fr/public/perso2/qqq06.gif given http://freakonometrics.blog.free.fr/public/perso2/qqqo5.gif, based on observations http://freakonometrics.blog.free.fr/public/perso2/qqq04.gif's, but all observations such that http://freakonometrics.blog.free.fr/public/perso2/qqq07.gif for some http://freakonometrics.blog.free.fr/public/perso2/qqq08.gif are missing. More precisely, I have the following sample (here half of the observations are missing),

Assume that we know that I have observations below the http://freakonometrics.blog.free.fr/public/perso2/qqq06.gif quantile of level 25%, and above the http://freakonometrics.blog.free.fr/public/perso2/qqq06.gif quantile of level 75%.
If I want to get the 90% quantile regression, and the 10% quantile, the code is simply,
library(mnormt)
library(quantreg)
library(splines)
set.seed(1)
mu=c(0,0)
r=0
Sigma <- matrix(c(1,r,r,1), 2, 2)
Z=rmnorm(2500,mu,Sigma)
X=Z[,1]
Y=Z[,2]
 
base=data.frame(X,Y)
plot(X,Y,col="blue",cex=.7)
I=(Y>qnorm(.25))&(Y<qnorm(.75))
baseI=base[I==FALSE,]
points(X[I],Y[I],col="light blue",cex=.7)
abline(h=qnorm(.25),lty=2,col="blue")
abline(h=qnorm(.75),lty=2,col="blue")
u=seq(-5,5,by=.02)
reg=rq(Y~X,data=base,tau=.05)
lines(u,predict(reg,newdata=data.frame(X=u)),lty=2)
reg=rq(Y~X,data=baseI,tau=.05*2)
lines(u,predict(reg,newdata=data.frame(X=u)))
The graph is the following

Dotted lines - in black - are theoretical lines (if I had all observations), and plain lines are (where half of the sample if missing). Instead of a standard linear quantile regression, it is also possible to try a spline regression,

So obviously, if I miss something in the middle, that's no big deal, doted and plain lines are here extremely close.
But what if observations http://freakonometrics.blog.free.fr/public/perso2/qqqo5.gif and http://freakonometrics.blog.free.fr/public/perso2/qqq06.gif were correlated ? Consider a Gaussian random vector http://freakonometrics.blog.free.fr/public/perso2/qqq09.gif with correlation http://freakonometrics.blog.free.fr/public/perso2/qqq10.gif (here 0.6).

It looks like we overestimate the slope for high quantile, but not for lower quantiles. So if observations are correlated, we have to be cautious with that technique.
But why could that be interesting ? Well, because I wanted to run a quantile regression on marathon results. But I could not get the overall dataset (since I had to import observations manually, and I have to admit that it was a bit boring). So I extracted finish times of the first 10% athletes, and the latest 10%. And I was wondering if it was enough to look at the 5% and 95% quantiles, based on the age of the runner... To be continued.

Saturday, January 15 2011

Itération de calculs de quantiles

Un billet rapide pour répondre à un commentaire de Claire (ici) sur les quantiles, et les régressions quantiles. En probabilité, il est possible d'itérer pour obtenir un quantile. Par exemple, le quantile à 75% est tel que

http://freakonometrics.blog.free.fr/public/perso/quantit1.png
(en supposant la loi continue, afin de simplifier l'exposé). Mais une autre façon de le définir est de prendre la médiane des observations qui dépassent la médiane, i.e. rechercher http://freakonometrics.blog.free.fr/public/perso/quantit3.png tel que
http://freakonometrics.blog.free.fr/public/perso/quantit2.png
Notons que sur une estimation de quantile(s) on peut éventuellement avoir une petite différence.
> s1=.5
> s2=1-(1-.75)/(1-s1)
> X=rexp(100000)
> quantile(X[X>quantile(X,s1)],s2)
50%
1.392084
 
> quantile(X,.75)
75%
1.392062
Regardons maintenant le cas de la régression quantile. Par exemple une régression quantile de niveau 90%
library(quantreg)
plot(cars)
abline(rq(dist~speed,tau=.9,data=cars),
col="red",lwd=2)

On peut tenter de faire une régression quantile à 80% sur les observations dépassant le quantile à 50%
plot(cars)
abline(rq(dist~speed,tau=.9,data=cars),
col="red",lwd=.7)
abline(rq(dist~speed,tau=.5,data=cars),
col="blue",lwd=2)
Xp=predict(rq(dist~speed,tau=.5,data=cars))
I=(cars$dist>Xp)
points(cars[I,],col="blue",pch=19)
abline(rq(dist~speed,tau=.8,data=cars[I,]),
col="red",lwd=2)

ou une régression quantile à 50% sur les observations dépassant le quantile à 80%
plot(cars)
abline(rq(dist~speed,tau=.9,data=cars),
col="red",lwd=.7)
abline(rq(dist~speed,tau=.8,data=cars),
col="blue",lwd=2)
Xp=predict(rq(dist~speed,tau=.8,data=cars))
I=(cars$dist>Xp)
points(cars[I,],col="blue",pch=19)
abline(rq(dist~speed,tau=.5,data=cars[I,]),
col="red",lwd=2)

Manifestement itérer n'est pas neutre (mais comme derrière se cachent des problèmes d'optimisation, on ne devrait pas être surpris). On peut aussi en tenter plein, pour voir tout ce qu'on pourrait obtenir,

plot(cars)
Y=cars$dist
X=cars$speed
for(s1 in seq(.01,.89,by=.01)){
s2=1-(1-.9)/(1-s1)
reg1=rq(Y~X,tau=s1)
I1=(Y>=predict(reg1))
Y1=Y[I1];X1=X[I1]
reg2=rq(Y1~X1,tau=s2)
abline(reg2,col="red")
}

Il est probablement possible d'utiliser le fait que l'estimateur change pour robustifier la régression quantile... mais c'est un autre sujet (ou un sujet trop long pour un billet du samedi soir)....

Wednesday, March 18 2009

Estimation d'un quantile, petit complément

Je poste un complément pour les étudiants qui suivent le cours de Statistique de l'Actuariat I, sur le calcul numérique d'un quantile. Comme je l'avais expliqué oralement en cours, il y a deux méthodes (au moins) pour étudier la distribution (et donc les quantiles) d'une loi composée

  • des méthodes numériques (correspondant à la méthode de discrétisation de Panjer, et ses améliorations, qui sont détaillées sur ce blog, ici ou )
  • des méthodes de simulation (correspondant à ce que je demande d'implémenter pour le DM3).
Pour les méthodes de simulations, il convient de "simuler" ou "générer" un échantillon aussi grand que possible de variables indépendantes, et identiquement distribuées, suivant la même loi que la charge totale (une loi mélange). On utilise pour cela le fait qu'on sait simuler des échantillons i.id. suivant des lois classiques (Poisson, lognormales, exponentielles, Pareto, etc).
Une fois simulé l'échantillon, on utiliser des résultats de statistiques, en particulier de type loi de grands nombres qui garantit - par exemple - que la moyenne empirique (obtenu par la fonction mean() de R) converge vers l'espérance mathématique. C'est ce que vous devez vérifier avec les deux premières questions (la première donnant la valeur théorique de la limite, et la second permettant d'obtenir la moyenne sur un échantillon). La notion de "convergence" se traduit par le fait que "si la taille de l'échantillon est grande, alors la moyenne empirique doit être proche de l'espérance mathématique". Aussi, en simulant un million de valeurs, on peut espérer être proche. Sur le contrôle de la distance entre la valeur empirique et la valeur théorique, on utilise le théorème central limite (si la variance est finie).
Pour estimer un quantile, c'est presque pareil, on peut invoquer le théorème de Glivenko Cantelli, par exemple. Rappelons que la fonction de répartition empirique,
F_n(x) = \frac{ \mathrm{nombre~d'\acute el \acute ements~ dans~ l'\acute echantillon} \leq x}{n} =
\frac{1}{n} \sum_{i=1}^n I(X_i \le x),
converge uniformément vers la vraie fonction de répartition, c'est-à-dire que
\|F_n(x)-F(x)\|_\infty\to 0
Cette convergence de la fonction de répartition peut se traduire par la convergence de la fonction quantile.
Pour obtenir le quantile empirique, c'est un tout petit peu plus compliqué que la moyenne, mais la fonction quantile() fait ça très bien.
En inversant la fonction empirique, on retombe sur un quantile. Mais compte tenu du saut et de la discontinuité, on peut être intéressé par prendre un baricentre entre deux statistiques d'ordre consécutives. Bref, il existe plusieurs estimateurs classiques d'un quantile. R en propose plusieurs via l'option type , i.e. quantile( ,type=7). Pour reprendre l'aide de R,
  1. correspond à l'inverse de la fonction de répartition empirique,
  2. fait une moyenne des statistiques d'ordre pour corriger de la discontinuité,
  3. est la définition de SAS, i.e. prendre la statistique d'ordre la plus proche,
  4. est obtenue par interpolation linéaire entre la kème statistique d'ordre et p(k), où p(k) = k / n, i.e. linear interpolation of the empirical cdf.
  5. est obtenue par interpolation linéaire entre la kème statistique d'ordre et p(k), où p(k) = (k - 0.5) / n, i.e.  piecewise linear function where the knots are the values midway through the steps of the empirical cdf. This is popular amongst hydrologists.
  6. est obtenue par interpolation linéaire entre la kème statistique d'ordre et p(k) = k / (n + 1), i.e.  p(k) = E[F(x[k])]. Utilité par Minitab et SPSS.
  7. est obtenue par interpolation linéaire entre la kème statistique d'ordre et p(k) = (k - 1) / (n - 1), i.e. p(k) = mode[F(x[k])]. Utilisé par S (et R)
  8. est obtenue par interpolation linéaire entre la kème statistique d'ordre et p(k) = (k - 1/3) / (n + 1/3), i.e. p(k) =median[F(x[k])], the resulting quantile estimates are approximately median-unbiased regardless of the distribution.
  9. est obtenue par interpolation linéaire entre la kème statistique d'ordre et p(k) = (k - 3/8) / (n + 1/4), i.e. the resulting quantile estimates are approximately unbiased for the expected order statistics if x is normally distributed.


Par défaut, R retient la méthode 7, comme le justifie le papier de Hyndman, R. J. et Fan, Y. (1996) Sample quantiles in statistical packages, American Statistician, 50, 361–365 (téléchargeable ici).


Il existe des dizaines d'autre méthodes pour estimer ces quantiles, en particulier dans library(quantile), ou encore hdquantile() implémentant l'estimaeur de Harrell et Davis. Pour aller plus loin, on avait fait un papier avec Abder Oulidi (ici) qui propose un comparaison d'un paquet d'estimateurs de quantiles).

Bref, pour résumer, une fois simulé le vecteur de coûts de sinistres S, il suffit d'utiliser quantile(S,.995).

Wednesday, December 3 2008

papier sur l'estimation de quantile par noyau beta


Le papier sur l'estimation de quantile par noyau beta, coécrit avec Abder Oulidi, est accepté pour publication dans Statistics and Computing.

In this paper we propose several nonparametric estimators of quantiles based on Beta kernel and applied to transformed data by the generalized Champernowne distribution initially fitted to the data. A Monte-Carlo based study will show that those estimators improve the efficiency of a traditional ones, not only for light tailed distributions, but also heavy tails, when the probability level is close to 1. We also compare these estimators with the Extreme Value Theory Quantile applying to Danish data on large fire insurance losses.