Freakonometrics

To content | To menu | To search

Wednesday, October 10 2012

Le modèle simple de régression linéaire

Je vais reprendre ici le code tapé au tableau ce matin, mais sur une autre base de données. On va revenir sur des données qui ont donné le nom de méthodes de "régression" aux techniques que nous abordons en cours. Pour rappel, le mot régression apparaît dans le titre de l'article de Galton (1886) "regression towards mediocrity in hereditary stature". Mais on va plutôt travailler sur les données collectées dans Pearson (1903) sur la taille des pères et de leurs fils, à l'âge adulte (pour les personnes qui voudraient travailler sur la taille des mères et de leurs filles, je renvoie à Pearson & Lee (1903)).

> father.son=read.table(
+ "http://stat-www.berkeley.edu/users/juliab/141C/pearson.dat",
+ sep=" ")
> attach(father.son)

On va chercher à prévoir la taille d'un fils, conditionnellement à la taille de son père,

> Y=father.son$V3
> X1=father.son$V2

Les estimateurs par moindres carrés sont obtenus en estimant d'abord la pente (à partir de la corrélation entre les deux variables)

> (r=cor(X1,Y))
[1] 0.5013383
> (sx=sd(X1))
[1] 2.744868
> (sy=sd(Y))
[1] 2.814702
> (b1=r*sy/sx)
[1] 0.514093

et ensuite, on fixe la constante de manière à passer par le barycentre du nuage de points,

> (b0=mean(Y)-b1*mean(X1))
[1] 33.8866

Visuellement, on obtient

> plot(X1,Y)
> abline(a=b0,b=b1,col="red")
> abline(h=mean(Y),lty=2)
> abline(v=mean(X1),lty=2)

(le barycentre étant ici à l'intersection des lignes horizontale et verticale, la droite bleue étant la première bissectrice). On retrouve des deux valeurs en faisant la régression sous R

> lm(Y~X1)
 
Call:
lm(formula = Y ~ X1)
 
Coefficients:
(Intercept)           X1
33.8866       0.5141  

Maintenant, on peut aussi faire un peu de calcul matriciel, pour estimer la droite de régression

> X=cbind(1,X1)
> (B=solve(t(X)%*%X)%*%t(X)%*%Y)
[,1]
33.886604
X1  0.514093

mais aussi la variance de la série des résidus,

> n=length(Y)
> E=Y-X%*%B
> (s2=sum(E^2)/(n-2))
[1] 5.936804

On peut alors aller un peu plus loin, en estimant la variance de nos estimateurs obtenus par moindres carrés,

> VB=s2*solve(t(X)%*%X)
> sqrt(diag(VB))
X1
1.83235382 0.02704874 

On retrouve ces valeurs sur la sortie détaillée de la régression,

> reg=lm(Y~X1)
> summary(reg)
 
Call:
lm(formula = Y ~ X1)
 
Residuals:
Min      1Q  Median      3Q     Max
-8.8772 -1.5144 -0.0079  1.6285  8.9685
 
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 33.88660    1.83235   18.49   <2e-16 ***
X1           0.51409    0.02705   19.01   <2e-16 ***
---
Signif. codes:  0***0.001**0.01*0.05 ‘.’ 0.1 ‘ ’ 1
 
Residual standard error: 2.437 on 1076 degrees of freedom
Multiple R-squared: 0.2513,	Adjusted R-squared: 0.2506
F-statistic: 361.2 on 1 and 1076 DF,  p-value: < 2.2e-16 

Pour retrouver la valeur du http://latex.codecogs.com/gif.latex?R^2,

> sum((X%*%B-mean(Y))^2)/
+ sum((Y-mean(Y))^2)
[1] 0.2513401

Si on regarde la statistique du test de Student de significativité de la variable explicative (i.e. test pour savoir si la pente de la régression pourrait être nulle, ou pas)

> (T=(B[2]-0)/sqrt(VB[2,2]))
[1] 19.00618

Tomber sur une telle valeur avec une loi de Student est rare, très rare... Pour s'en convaincre, on peut simuler quelques valeurs pour voir ce que peut être un tirage suivant une telle loi,

> rt(50,n-2)
[1]  1.08379425 -0.17139018  0.36563361 -0.11331197
[5] -1.43101846  1.36197766  0.62777125 -0.86627679
[9] -0.69083285  1.40111081  0.19765215 -0.29186439
[13]  1.41921424 -0.38485241 -0.90524764 -0.58007929
[17]  0.20974133  0.93225320  1.30109930  0.67961650
[21]  0.45066183  0.19906039 -0.75011473 -1.50135529
[25] -0.20852248 -0.81572301 -0.38352095 -2.06752958
[29] -0.39492703  1.35945460 -0.36081938 -0.56273880
[33] -0.57315938 -0.87391435 -0.30124439 -0.55463941
[37] -0.08113229 -0.35297047 -0.81998094 -1.11087831
[41]  0.71881538 -0.08276505  1.14767768  1.85126104
[45]  0.14713420 -0.03935444 -0.92559603 -0.80283654
[49] -0.10799174 -2.16898630

Autrement dit, on n'atteint jamais de telles valeurs. On peut aussi regarder la densité de cette loi, pour voir qu'en moyenne, on est plutôt autour de 0, entre -2 et +2 dans 95% des cas,

> u=seq(-5,5,by=.1)
> plot(u,dt(u,n-2),type="l")
> lines(u,dnorm(u),col="red")

Si on essaye de calculer la http://latex.codecogs.com/gif.latex?p-value, on voit qu'il est improbable d'obtenir une telle valeur avec une loi de Student, donc on va rejeter l'hypothèse que la pente puisse être nulle,

> 2*pt(-T,n-2)
[1] 1.121268e-69

Cela dit, si on testait si la pente pouvait être 1/2, on aurait un résultat totalement différent,

> (T=(B[2]-.5)/sqrt(VB[2,2]))
[1] 0.5210239
> 2*pt(-T,n-2)
[1] 0.6024573

car avec une http://latex.codecogs.com/gif.latex?p-value de l'ordre de 60%, on va accepter l'hypothèse de pente valant 1/2.

Thursday, February 23 2012

Visualization in regression analysis

Visualization is a key to success in regression analysis. This is one of the (many) reasons I am also suspicious when I read an article with a quantitative (econometric) analysis without any graph. Consider for instance the following dataset, obtained from http://data.worldbank.org/, with, for each country, the GDP per capita (in some common currency) and the infant mortality rate (deaths before the age of 5),
> library(gdata)
> XLS1=read.xls("http://api.worldbank.org/datafiles
/NY.GDP.PCAP.PP.CD_Indicator_MetaData_en_EXCEL.xls", sheet = 1)
> data1=XLS1[-(1:28),c("Country.Name","Country.Code","X2010")]
> names(data1)[3]="GDP"
> XLS2=read.xls("http://api.worldbank.org/datafiles
/SH.DYN.MORT_Indicator_MetaData_en_EXCEL.xls", sheet = 1)
> data2=XLS2[-(1:28),c("Country.Code","X2010")]
> names(data2)[2]="MORTALITY"
> data=merge(data1,data2)
> head(data)
Country.Code         Country.Name       GDP MORTALITY
1          ABW                Aruba        NA        NA
2          AFG          Afghanistan  1207.278     149.2
3          AGO               Angola  6119.930     160.5
4          ALB              Albania  8817.009      18.4
5          AND              Andorra        NA       3.8
6          ARE United Arab Emirates 47215.315       7.1

If we estimate a simple linear regression - http://freakonometrics.blog.free.fr/public/perso5/logormal01.gif  - we get
> regBB=lm(MORTALITY~GDP,data=data)
> summary(regBB)
 
Call:
lm(formula = MORTALITY ~ GDP, data = data)
 
Residuals:
Min     1Q Median     3Q    Max
-45.24 -29.58 -12.12  16.19 115.83
 
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 67.1008781  4.1577411  16.139  < 2e-16 ***
GDP         -0.0017887  0.0002161  -8.278 3.83e-14 ***
---
Signif. codes:  0***0.001**0.01*0.05 ‘.’ 0.1 ‘ ’ 1
 
Residual standard error: 39.99 on 167 degrees of freedom
(47 observations deleted due to missingness)
Multiple R-squared: 0.2909,	Adjusted R-squared: 0.2867
F-statistic: 68.53 on 1 and 167 DF,  p-value: 3.834e-14 
We can look at the scatter plot, including the linear regression line, and some confidence bounds,
> plot(data$GDP,data$MORTALITY,xlab="GDP per capita",
+ ylab="Mortality rate (under 5)",cex=.5)
> text(data$GDP,data$MORTALITY,data$Country.Name,pos=3)
> x=seq(-10000,100000,length=101)
> y=predict(regBB,newdata=data.frame(GDP=x),
+ interval="prediction",level = 0.9)
> lines(x,y[,1],col="red")
> lines(x,y[,2],col="red",lty=2)
> lines(x,y[,3],col="red",lty=2)

We should be able to do a better job here. For instance, if we look at the Box-Cox profile likelihood,

> boxcox(regBB)

it looks like taking the logarithm of the mortality rate should be better, i.e. http://freakonometrics.blog.free.fr/public/perso5/lognormal02.gif or http://freakonometrics.blog.free.fr/public/perso5/lognormal05.gif:

> regLB=lm(log(MORTALITY)~GDP,data=data)
> summary(regLB)
 
Call:
lm(formula = log(MORTALITY) ~ GDP, data = data)
 
Residuals:
Min      1Q  Median      3Q     Max
-1.3035 -0.5837 -0.1138  0.5597  3.0583
 
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept)  3.989e+00  7.970e-02   50.05   <2e-16 ***
GDP         -6.487e-05  4.142e-06  -15.66   <2e-16 ***
---
Signif. codes:  0***0.001**0.01*0.05 ‘.’ 0.1 ‘ ’ 1
 
Residual standard error: 0.7666 on 167 degrees of freedom
(47 observations deleted due to missingness)
Multiple R-squared: 0.5949,	Adjusted R-squared: 0.5925
F-statistic: 245.3 on 1 and 167 DF,  p-value: < 2.2e-16
 
> plot(data$GDP,data$MORTALITY,xlab="GDP per capita",
+ ylab="Mortality rate (under 5) log scale",cex=.5,log="y")
> text(data$GDP,data$MORTALITY,data$Country.Name)
> x=seq(300,100000,length=101)
> y=exp(predict(regLB,newdata=data.frame(GDP=x)))*
+ exp(summary(regLB)$sigma^2/2)
> lines(x,y,col="red")
> y=qlnorm(.95, meanlog=predict(regLB,newdata=data.frame(GDP=x)),
+ sdlog=summary(regLB)$sigma^2)
> lines(x,y,col="red",lty=2)
> y=qlnorm(.05, meanlog=predict(regLB,newdata=data.frame(GDP=x)),
+ sdlog=summary(regLB)$sigma^2)
> lines(x,y,col="red",lty=2)

on the log scale or

> plot(data$GDP,data$MORTALITY,xlab="GDP per capita",
+ ylab="Mortality rate (under 5) log scale",cex=.5)

on the standard scale. Here we use quantiles of the log-normal distribution to derive confidence intervals.

But why shouldn't we take also the logarithm of the GDP ? We can fit a model http://freakonometrics.blog.free.fr/public/perso5/lognormal03.gif or equivalently http://freakonometrics.blog.free.fr/public/perso5/lognormal04.gif.


> regLL=lm(log(MORTALITY)~log(GDP),data=data)
> summary(regLL)
 
Call:
lm(formula = log(MORTALITY) ~ log(GDP), data = data)
 
Residuals:
Min       1Q   Median       3Q      Max
-1.13200 -0.38326 -0.07127  0.26610  3.02212
 
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 10.50192    0.31556   33.28   <2e-16 ***
log(GDP)    -0.83496    0.03548  -23.54   <2e-16 ***
---
Signif. codes:  0***0.001**0.01*0.05 ‘.’ 0.1 ‘ ’ 1
 
Residual standard error: 0.5797 on 167 degrees of freedom
(47 observations deleted due to missingness)
Multiple R-squared: 0.7684,	Adjusted R-squared: 0.767
F-statistic:   554 on 1 and 167 DF,  p-value: < 2.2e-16
 
> plot(data$GDP,data$MORTALITY,xlab="GDP per capita ",
+ ylab="Mortality rate (under 5)",cex=.5,log="xy")
> text(data$GDP,data$MORTALITY,data$Country.Name)
> x=exp(seq(1,12,by=.1))
> y=exp(predict(regLL,newdata=data.frame(GDP=x)))*
+ exp(summary(regLL)$sigma^2/2)
> lines(x,y,col="red")
> y=qlnorm(.95, meanlog=predict(regLL,newdata=data.frame(GDP=x)),
+ sdlog=summary(regLL)$sigma^2)
> lines(x,y,col="red",lty=2)
> y=qlnorm(.05, meanlog=predict(regLL,newdata=data.frame(GDP=x)),
+ sdlog=summary(regLL)$sigma^2)
> lines(x,y,col="red",lty=2)

on the log scales or

> plot(data$GDP,data$MORTALITY,xlab="GDP per capita ",
+ ylab="Mortality rate (under 5)",cex=.5)

on the standard scale. If we compare the last two predictions, we have

with in blue is the log model, and in red is the log-log model (I did not include the first one for obvious reasons).

Monday, January 30 2012

calculs des sorties de régression

Avec un peu de calcul matriciel (et en utilisant les fonctions de répartition des lois usuelles) on peut calculer à la main toute les grandeurs obtenues lorsque l'on fait une régression linéaire. Utilisons la base de donnée avec le poids d'une personne (qui sera notre variable d'intérêt, et que l'on essayera d'inférer), la taille et le sexe de la personne,

> TP = read.table(
"http://freakonometrics.free.fr/taillepoids.txt",
header=TRUE,sep=";") > tail(TP) indice sexe poids1 taille1 poids2 taille2 195 195 F 62 164 61 161 196 196 M 74 175 71 175 197 197 M 83 180 80 180 198 198 M 81 175 NA NA 199 199 M 90 181 91 178 200 200 M 79 177 81 178 > Y=TP$poids1 > X1=TP$sexe > X2=TP$taille1 > base=data.frame(Y,X1,X2) > tail(base) Y X1 X2 195 62 F 164 196 74 M 175 197 83 M 180 198 81 M 175 199 90 M 181 200 79 M 177

La régression linéaire donne ici

> regression=lm(Y~X1+X2)
> summary(regression)
 
Call:
lm(formula = Y ~ X1 + X2)
 
Residuals:
Min      1Q  Median      3Q     Max
-24.718  -7.159  -1.472   5.487  74.726
 
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 109.11420   14.20513   7.681 7.22e-13 ***
X1M          22.49801    2.08690  10.781  < 2e-16 ***
X2           -0.31298    0.08649  -3.619 0.000376 ***
---
Signif. codes:  0***0.001**0.01*0.05 ‘.’ 0.1 ‘ ’ 1
 
Residual standard error: 11.81 on 197 degrees of freedom
Multiple R-squared: 0.3937,	Adjusted R-squared: 0.3875
F-statistic: 63.95 on 2 and 197 DF,  p-value: < 2.2e-16

On peut commencer par (re)calculer les estimateurs par moindres carrés ordinaires, en notant que de la variable associée au sexe, seul le sexe masculin a été retenu ici.

> n=length(Y)
> X=matrix(c(rep(1,n),(X1=="M")*1,X2),n,3)
> X[1:5,]
[,1] [,2] [,3]
[1,]    1    1  182
[2,]    1    0  161
[3,]    1    0  161
[4,]    1    1  177
[5,]    1    0  157
> (beta=solve(t(X)%*%X)%*%t(X)%*%Y)
[,1]
[1,] 109.1141967
[2,]  22.4980107
[3,]  -0.3129827
> summary(regression)$coefficients
Estimate  Std. Error   t value     Pr(>|t|)
(Intercept) 109.1141967 14.20512536  7.681326 7.222037e-13
X1M          22.4980107  2.08690147 10.780581 1.347214e-21
X2           -0.3129827  0.08648531 -3.618912 3.760466e-04

On retrouve ici est estimation indiquée. Notons que si la modalité de référence était le sexe féminin, nous aurions,

> Xbis=matrix(c(rep(1,n),(X1=="F")*1,X2),n,3)
> Xbis[1:5,]
[,1] [,2] [,3]
[1,]    1    0  182
[2,]    1    1  161
[3,]    1    1  161
[4,]    1    0  177
[5,]    1    1  157
> solve(t(Xbis)%*% Xbis)%*%t(Xbis)%*%Y
[,1]
[1,] 131.6122073
[2,] -22.4980107
[3,]  -0.3129827

Si on compare les deux constantes, entre ces deux modèles, on retrouve la valeur du coefficient associé au sexe de l'individu,

> (solve(t(X)%*%X)%*%t(X)%*%Y)[1]-
+ (solve(t(Xbis)%*% Xbis)%*%t(Xbis)%*%Y)[1]
[1] -22.49801
> (solve(t(X)%*%X)%*%t(X)%*%Y)[2]
[1] 22.49801

Continuons un peu... L'estimateur de la volatilité des résidus est ici

> residus=Y-X%*%beta
> t(residus)%*%residus
[,1]
[1,] 27493.32
> sum(residus^2)
[1] 27493.32
>
> (sigma=sqrt(sum(residus^2)/(n-ncol(X))))
[1] 11.81355
> summary(regression)$sigma
[1] 11.81355

On peut utiliser cette grandeur pour estimer la matrice de variance-covariance de notre estimateur,

> (varbeta=sigma^2*solve(t(X)%*%X))
[,1]       [,2]         [,3]
[1,] 201.785586 16.2312631 -1.224735573
[2,]  16.231263  4.3551577 -0.106737634
[3,]  -1.224736 -0.1067376  0.007479709
> vcov(regression)
(Intercept)        X1M           X2
(Intercept)  201.785586 16.2312631 -1.224735573
X1M           16.231263  4.3551577 -0.106737634
X2            -1.224736 -0.1067376  0.007479709

Le terme diagonal est celui qui est utilisé pour calculer l'écart-type des estimateurs de chacun des coefficients.

> (sigbeta=sqrt(diag(varbeta)))
[1] 14.20512536  2.08690147  0.08648531
> summary(regression)$coefficients
Estimate  Std. Error   t value     Pr(>|t|)
(Intercept) 109.1141967 14.20512536  7.681326 7.222037e-13
X1M          22.4980107  2.08690147 10.780581 1.347214e-21
X2           -0.3129827  0.08648531 -3.618912 3.760466e-04

En faisant une hypothèse de normalité des résidus (ou en supposant le nombre d'observations grand, i.e. suffisamment grand pour invoquer des théorèmes asymptotiques), on peut faire un test de significativité des variables explicatives,

> (beta/sigbeta)
[,1]
[1,]  7.681326
[2,] 10.780581
[3,] -3.618912
> 2*(1-pt(abs(beta/sigbeta),df=n-ncol(X)))
[,1]
[1,] 7.220891e-13
[2,] 0.000000e+00
[3,] 3.760466e-04

avec respectivement la statistique de Student, et la p-value associé au test de nullité. Pour juger de la qualité de l'ajustement, on peut calculer

> (R2=cor(Y,X%*%beta)^2)
[,1]
[1,] 0.3936724
> summary(regression)$r.squared
[1] 0.3936724
>
> (R2a=1-(n-1)/(n-(ncol(X)))*(1-R2))
[,1]
[1,] 0.3875168
> summary(regression)$adj.r.squared
[1] 0.3875168

et enfin, le test de significativité global (de Fisher) donne ici

> (F=R2/(ncol(X)-1)/((1-R2)/(n-ncol(X))))
[,1]
[1,] 63.95343
> summary(regression)$fstatistic
value     numdf     dendf
63.95343   2.00000 197.00000
> 1-pf(F,(ncol(X)-1),(n-ncol(X)))
[,1]
[1,]    0

Bref, avec un peu de calcul, on peut retrouver toutes les valeurs données sous R. Une fois les calculs compris, on pourra passer à la géométrie, et à l'interprétation...

Friday, January 13 2012

ACT6420 Méthodes de prévision, introduction à R

Cet après midi, j'assurerais la démonstration, en salle informatique à 14h30, PK S1 590, au sous sol (salle L). On fera une introduction à R, afin de présenter les rudiments du langage. Je mets en ligne quelques lignes de code,

> X=cars$speed
> Y=cars$dist
> n=length(X)
> (mx=mean(X))
[1] 15.4
> sum(X)/n
[1] 15.4
> s=0
> for(i in 1:n){s=s+X[i]}
> print(s/n)
[1] 15.4
>
> my=mean(Y)
> (sx=sd(X))
[1] 5.287644
> sqrt(sum((X-mx)^2)/(n-1))
[1] 5.287644
> sy=sd(Y)
> (r=cor(X,Y))
[1] 0.8068949
> sum((X-mx)*(Y-my))/((n-1)*sx*sy)
[1] 0.8068949
>
> X<=15
[1]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
[9]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
[17]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
[25]  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE
[33] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[41] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[49] FALSE FALSE
> sum(X<=15)
[1] 26
> X[X<=15]
[1]  4  4  7  7  8  9 10 10 10 11 11 12 12 12 12 13 13
[18] 13 13 14 14 14 14 15 15 15
> mean(Y[X<=15])
[1] 27.5
> mean(Y[X>15])
[1] 59.75
>
> (b1=r*sy/sx)
[1] 3.932409
> (b0=my-b1*mx)
[1] -17.57909
On peut aussi faire quelques graphiques afin de visualiser la régression,
> plot(X,Y)
> plot(X,Y,xlab="Vitesse de la voiture",
+ ylab="Distance de freinage",pch=4,
+ xlim=c(0,30),axes=FALSE)
> axis(1);axis(2)
> abline(a=b0,b=b1,col="red",lty=2)
> Yh=b0+b1*X
> points(X,Yh,pch=19,col="blue")

Si on continue à créer et manipuler des objets (qui seront utiles pour analyser la régression),
> (SCT=sum((Y-my)^2))
[1] 32538.98
> (SCR=sum((Y-Yh)^2))
[1] 11353.52
> (SCE=sum((Yh-my)^2))
[1] 21185.46
> SCR+SCE
[1] 32538.98
>
> (s=sqrt(sum((Y-Yh)^2)/(n-2)))
[1] 15.37959
>
> (sb1=s/(sx*sqrt(n-1)))
[1] 0.4155128
> t=(b1-0)/sb1
> 2*(1-pt(t,df=n-2))
[1] 1.489919e-12
>
> lm(Y~X)
 
Call:
lm(formula = Y ~ X)
 
Coefficients:
(Intercept)            X
-17.579        3.932
 
> regression=lm(dist~speed,data=cars)
> names(regression)
[1] "coefficients"  "residuals"     "effects"
[4] "rank"          "fitted.values" "assign"
[7] "qr"            "df.residual"   "xlevels"
[10] "call"          "terms"         "model"
> regression$coefficient
(Intercept)       speed
-17.579095    3.932409
> summary(regression)
 
Call:
lm(formula = dist ~ speed, data = cars)
 
Residuals:
Min      1Q  Median      3Q     Max
-29.069  -9.525  -2.272   9.215  43.201
 
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -17.5791     6.7584  -2.601   0.0123 *
speed         3.9324     0.4155   9.464 1.49e-12 ***
---
Signif. codes:  0***0.001**0.01*0.05 ‘.’ 0.1 ‘ ’ 1
 
Residual standard error: 15.38 on 48 degrees of freedom
Multiple R-squared: 0.6511,	Adjusted R-squared: 0.6438
F-statistic: 89.57 on 1 and 48 DF,  p-value: 1.49e-12
 
> summary(regression)$sigma
[1] 15.37959
On approfondira ces codes cet après midi.

Monday, October 3 2011

ACT2040, introduction aux modèles linéaires généralisés

On commencera ce mardi les GLM, après avoir introduit les lois exponentielles (qui ont du être revues en démonstration vendredi dernier). La notation utilisée sera que la loi (densité ou fonction de probabilité) de http://freakonometrics.blog.free.fr/public/perso4/Yi-ltx.gif sera de la forme

http://freakonometrics.blog.free.fr/public/perso4/loi-exponentielle.gif
Pour un complément plus exhaustif, je renvoie au chapitre en ligne.
  • Le modèle linéaire (Gaussien)
Le modèle de base est le modèle Gaussien que l'on avait revu au dernier cours,
> X=c(1,2,3,4)
> Y=c(1,2,5,6)
> base=data.frame(X,Y)
> reg1=lm(Y~1+X,data=base)
> nbase=data.frame(X=seq(0,5,by=.1))
> Y1=predict(reg1,newdata=nbase)
Pour une prédiction (unique), on obtient la prédiction suivante

Le code pour une telle représentation est le suivant
> plot(X,Y,pch=3,cex=1.5,lwd=2,xlab="",ylab="")
> lines(nbase$X,Y1,col="red",lwd=2)
> u=2
> mu=predict(reg1)[2]
> sigma=summary(reg1)$sigma
> y=seq(0,7,.05)
> loi=dnorm(y,mu,sigma)
> segments(u,y,loi+u,y,col="light green")
> lines(loi+u,y)
> abline(v=u,lty=2)
> points(X[2],Y[2],pch=3,cex=1.5,lwd=2)
> points(X[2],predict(reg1)[2],pch=19,col="red")
> arrows(u-.2,qnorm(.05,mu,sigma),
+ u-.2,qnorm(.95,mu,sigma),length=0.1,code=3,col="blue")
On peut multiplier les prédictions, en se basant sur l'hypothèse d'homoscédasticité (la variance sera alors constante)

Mais on peut aller plus loin
  • Le modèle linéaire généralisé
Plusieurs modèles peuvent etre estimés, en changeant la loi de la variable à expliquer, et la fonction lien,
> reg2=glm(Y~1+X,data=base,family=poisson(link="identity"))
> Y2=predict(reg2,newdata=nbase,type="response")
> reg3=glm(Y~1+X,data=base,family=poisson(link="log"))
> Y3=predict(reg3,newdata=nbase,type="response")
> reg4=glm(Y~1+X,data=base,family=gaussian(link="log"))
> Y4=predict(reg4,newdata=nbase,type="response")
> sigma=sqrt(summary(reg4)$dispersion)
Pour le modèle Poissonnien avec un lien identité, on obtient

On obtient ainsi une variance qui augmente avec la prédiction,

Pour une régression de Poisson avec un lien logarithmique,

i.e. pour nos quatre prédictions

On peut comparer avec une prédiction d'un modèle Gaussien avec un lien logarithmique,

i.e. pour les quatre prédictions

Thursday, April 10 2008

Econométrie de l'assurance, un rapide survol


Rapide exposé dans le cadre d'une rencontre entre les économistes et les statisticiens rennais: glm, gam, gnm et données de panels.