Les tests classiques en économétrie (2)
By arthur charpentier on Wednesday, October 28 2009, 19:06 - économétrie 1 - M1 - 09/10 - Permalink
- Le test de Student (significativité d'un coefficient)


Dans le test de Student, on cherche à tester
contre 



> REG0=lm(Fire~X_1+X_2+X_3,data=dodge)
> summary(REG0)
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 22.07525 6.19447 3.564 0.000910 ***
X_1 -0.62764 5.28130 -0.119 0.905953
X_2 0.22378 0.06161 3.632 0.000744 ***
X_3 -1.55059 0.38195 -4.060 0.000204 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Sur la sortie on note que la statistique de test pour la variable X2 vaut 3.632. On a deux méthodes pour interpréter cette statistique
- construire la région d'acceptation du test à partir des quantiles théorique de la loi de Student (en lisant dans les tables, ou en demandant les quantiles au logiciel)
- en calculant la p-value, ie. la probabilité qu'une loi de Student atteigne une telle valeur.
> qt(.025,df=43)
[1] -2.016692
> qt(.975,df=43)
[1] 2.016692
Autrement dit, les deux dernières statistiques de Student ne sont pas dans cet intervalle: on rejette l'hypothèse de nullité des deux derniers coefficients. L'autre possibilité est de calculer la probabilité qu'en valeur absolue, une loi de Student dépasse la valeur absolue de la grandeur observée. Ici, ces probabilités sont
> (1-pt(abs(-0.119),df=43))*2
[1] 0.9058296
> (1-pt(abs(3.632),df=43))*2
[1] 0.0007442971
On retrouve les grandeurs données dans la dernière colonne du tableau.
- Le test de Fisher (significativité de plusieurs coefficients)




Ce test est en fait un cas très particulier d'un test beaucoup plus général proposé par Fisher. De manière beaucoup plus générale, on se demande si les deux modèles suivants sont vraiment différents, entre







Pour le test de Fisher global, le résultat figure dans le tableau de la régression
F-statistic: 11.34 on 3 and 43 DF, p-value: 1.314e-05
Mais il est possible de retrouver cette grandeur en utilisant la fonction anova(),
> REG0=lm(Fire~X_1+X_2+X_3,data=dodge)
> REG0c=lm(Fire~1,data=dodge)
> anova(REG0,REG0c)
Analysis of Variance Table
Model 1: Fire ~ X_1 + X_2 + X_3
Model 2: Fire ~ 1
Res.Df RSS Df Sum of Sq F Pr(>F)
1 43 1831.8
2 46 3280.8 -3 -1449.0 11.339 1.314e-05 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
On peut aussi faire des tests de modèles contraints. Le plus simple est d'enlever une variable explicative dans le modèle, par exemple la troisième
> REG0c=lm(Fire~X_1+X_2,data=dodge)
> anova(REG0,REG0c)
Analysis of Variance Table
Model 1: Fire ~ X_1 + X_2 + X_3
Model 2: Fire ~ X_1 + X_2
Res.Df RSS Df Sum of Sq F Pr(>F)
1 43 1831.75
2 44 2533.84 -1 -702.09 16.481 0.0002039 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
On retrouve que cette variable est significative dans le modèle (ce qui confirme la conclusion du test de Student). Pour des tests avec des contraintes plus complexes, on peut utiliser library(lmtest), ou library(AER). En particulier, on peut se demander si les coefficients associés aux variables X2 et X3 sont identiques.
> linear.hypothesis(REG0,"X_2=X_3")
Linear hypothesis test
Hypothesis:
X_2 - X_3 = 0
Model 1: Fire ~ X_1 + X_2 + X_3
Model 2: restricted model
Res.Df RSS Df Sum of Sq F Pr(>F)
1 43 1831.75
2 44 2652.77 -1 -821.01 19.273 7.245e-05 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Ce test peut se faire de manière équivalente en faisant directement une anova,
> REG0c=lm(Fire~X_1+I(X_2+X_3),data=dodge)
> anova(REG0,REG0c)
Analysis of Variance Table
Model 1: Fire ~ X_1 + X_2 + X_3
Model 2: Fire ~ X_1 + I(X_2 + X_3)
Res.Df RSS Df Sum of Sq F Pr(>F)
1 43 1831.75
2 44 2652.77 -1 -821.01 19.273 7.245e-05 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
ce qui donne (tout naturellement) la même chose.
- Tests de normalités (des résidus)
> source("http://blogperso.univ-rennes1.fr/arthur.charpentier/public/R/fonctions-nortest.R")







Comments
j'ai entendu dire qu'il existait une fonction pour faire un dessin des estimateurs, au lieu de présenter les sorties de la régression. Connaissez vous cette fonction ?
Merci beacoup
REPONSE: pour répondre à ta question, oui, il est possible de ne pas mettre de tableau pour présenter une régression. En fait, dans library(arm) on a une jolie fonction pour visualiser les estimations des coefficients
> library(arm)
> dodge<-read.table("http://perso.univ-rennes1.fr/arthur.charpentier/dodge.csv",header=TRUE,sep=",")
> reg<-lm(Fire~.,data=dodge)
> coefplot(reg,col="red")
ce qui donne le graphique suivant,

On ne voit pas grand chose, compte tenu des ordres de grandeur des coefficients. On peut toutefois les transformer (de manière affine),> dodge2<-dodge
> for(k in 2:4){dodge2[,k]=(dodge2[,k]-mean(dodge2[,k]))/sd(dodge2[,k])}
> reg<-lm(Fire~.,data=dodge2)
> coefplot(reg,col="blue")
Autrement dit, la première variable ne semble pas significative.
> reg2<-glm((Fire>12)~.,data=dodge2,family=binomial("probit"))
Message d'avis :
In glm.fit(x = X, y = Y, weights = weights, start = start, etastart = etastart, :
des probabilités ont été ajustées numériquement à 0 ou 1
> reg3<-glm((Fire>12)~.,data=dodge2,family=binomial("logit"))
> coefplot(reg2,col="blue")
> coefplot(reg3,add=TRUE,col="red")
Je reviens sur un ancien billet... car je viens de voir via google que tu as rencontré un problème que j'ai...
Message d'avis :
In glm.fit(x = X, y = Y, weights = weights, start = start, etastart = etastart, :
des probabilités ont été ajustées numériquement à 0 ou 1
Kesako ? Ca ne te pose pas de problème ? Bon, ok, c'est par l'objet de ton billet mais as-tu une idée sur la question ? Merci.