Un petit billet aujourd’hui sur une question qui m’a été posée (et qui m’a permis de découvrir des nouvelles fonctions sous R). On suppose que l’on a un modèle économétrique de la forme
où
que l’on peut encore écrire
Supposons que ce soit la formulation en terme de ces derniers coefficients qui nous intéresse, et que l’on cherche un intervalle de confiance.
La Delta Method nous dit que si on dispose d’un estimateur asymptotiquement gaussien (mais c’est le cas pour la plupart des estimateurs que l’on construit en pratique), tout transformation bijective de cet estimateur reste asymptotiquement Gaussien. Bref, on va pouvoir utiliser ces résultats pour en déduire un intervalle de confiance (asymptotique) pour le nouveau paramètre. En effet, l’estimateur par moindre carrés vérifie la normalité asymptotique (sous quelques hypothèses)
ce qui donne avec les notations précédentes
Autrement dit, on peut facilement en déduire un intervalle de confiance (asymptotique). Pour cela, on a trois méthodes (au moins) avec R. Pour la suite, je vais considerer la régression sur la base de données cars (comme toujours), et on s’intéresse à l’estimation de
(ne me demandez pas pourquoi, il me fallait un exemple numérique, j’ai pris un truc nonlinéaire pour qu’au moins ça puisse avoir un vague intérêt).
- En faisant un peu de calcul formel
Pour les calculs symboliques, il y a la fonction D dans le package de base,
> f <- expression(sin(cos(x + y^2))) > ( Dfx <- D(f, "x") ) -(cos(cos(x + y^2)) * sin(x + y^2))
ce qui pourra alors être utilisé pour faire les calculs de la variance asymptotique.
> x=c(0,1,2); y=1 > eval(D.sc) [1] -0.7216061 -0.8316919 -0.0774320
On peut également utiliser cette fonction pour faire plein de jolis dessins,
> x <-seq(-5, 5, length=100) > fx=x^2 > Df <-D(expression(x^2), "x") > Dfx<-eval(Df) > plot(x, fx, type = "l", las = 1,ylim=c(-2,2)) > for (i in 1:length(x)) { + abline(a = fx[i] - Dfx[i] * x[i], b = Dfx[i], + col = rainbow(100)[i]) + }
Mais bon, c’était juste pour rigoler un peu… On peut utiliser cette fonction pour calculer l’écart type de l’estimateur de la grandeur qui nous intéresse.
> reg1 = lm(dist~speed, data = cars) > estmean = coef(reg1) > estvar = summary(reg1)$cov.unscaled * summary(reg1)$sigma^2 > f = function(x,y){ + -y/(x+y) + } > X=f(estmean[1],estmean[2]) > g=expression(-y/(x+y)) > x<-as.numeric(estmean[1]); y<-as.numeric(estmean[2]) > V=eval(c(eval(D(g, "x")),eval(D(g, "y")))) > sqrt(t(V) %*% estvar %*% V) [,1] [1,] 0.1063255
Voilà pour la première méthode. Petite remarque: pour faire le calcul symbolique de la dérivée, j’utilise expression et non pas function.
- En utilisant la fonction deltamethod de la librarie msm
Ici on commence comme avant, sauf que la phase de calcul est immédiat…
> reg2 <- lm(dist~speed, data = cars) > estmean = coef(reg2) > estvar = summary(reg2)$cov.unscaled * summary(reg2)$sigma^2 > deltamethod (~ -x2 / (x1 + x2), estmean, estvar) [1] 0.1063255
et d’ailleurs, ça peut s’appliquer pour un paramètre en dimension 2
> deltamethod (list(~ -x2 / (x1 + x2), ~ x1+x2), estmean, estvar) [1] 0.1063255 6.3664368
En revanche, on obtient des estimateur des écart-types, et pas de la matrice de variance-covariance des estimateurs. Autrement dit on ne peut pas en déduire l’ellipse de confiance, seulement des intervalles de confiance marginaux (en utilisant la normalité asymptotique).
- En utilisant la fonction delta.method de librarie alr3
Pour finir, une dernière fonction. La seule chose qui change c’est la synthaxe. Mais la sortie est plus élégante,
> reg3 = lm(dist~speed, data = cars) > delta.method(reg3, "-b1/(b1+b0)") Functions of parameters: expression(-b1/(b1+b0)) Estimate = 0.2881585 with se = 0.1063255
En fait, l’écart-type indiqué ici est précisément celui qui est utilisé pour écrire l’intervalle de confiance. Dans cet exemple, l’intervalle de confiance approché (car on suppose que la normalité – en théorie seulement asymptotique – est vérifiée) et estimé (car les paramètres sont inconnus et estimés) est de la forme suivant, pour un seuil de confiance à 95%
> DM=delta.method(reg3, "-b1/(b1+b0)") Functions of parameters: expression(-b1/(b1+b0)) Estimate = 0.2881585 with se = 0.1063255 > DM$estimate+qt(.975,df=nrow(cars)-1)*DM$se [1] 0.5018277 > DM$estimate+qt(.025,df=nrow(cars)-1)*DM$se [1] 0.07448936
C’est à dire qu’on a un intervalle de confiance de la forme [0.074;0.502].