Interpréter le coefficient dans un modèle de régression linéaire avec des variables catégorielles

8

Je vais donner mes exemples avec les appels R. D'abord un exemple simple de régression linéaire avec une variable dépendante «durée de vie» et deux variables explicatives continues.

data.frame(height=runif(4000,160,200))->human.life
human.life$weight=runif(4000,50,120)
human.life$lifespan=sample(45:90,4000,replace=TRUE)
summary(lm(lifespan~1+height+weight,data=human.life))

Call:
lm(formula = lifespan ~ 1 + height + weight, data = human.life)

Residuals:
Min       1Q   Median       3Q      Max 
-23.0257 -11.9124  -0.0565  11.3755  23.8591 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept) 63.635709   3.486426  18.252   <2e-16 ***
height       0.007485   0.018665   0.401   0.6884    
weight       0.024544   0.010428   2.354   0.0186 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1 

Residual standard error: 13.41 on 3997 degrees of freedom
Multiple R-squared: 0.001425,   Adjusted R-squared: 0.0009257 
F-statistic: 2.853 on 2 and 3997 DF,  p-value: 0.05781

Afin de trouver l'estimation de la «durée de vie» lorsque la valeur de «poids» est 1, j'ajoute (Intercept) + hauteur = 63,64319

Maintenant, que se passe-t-il si j'ai une trame de données similaire, mais une où une des variables explicatives est catégorique?

data.frame(animal=rep(c("dog","fox","pig","wolf"),1000))->animal.life
animal.life$weight=runif(4000,8,50)
animal.life$lifespan=sample(1:10,replace=TRUE)
summary(lm(lifespan~1+animal+weight,data=animal.life))

Call:
lm(formula = lifespan ~ 1 + animal + weight, data = animal.life)

Residuals:
Min      1Q  Median      3Q     Max 
-4.7677 -2.7796 -0.1025  3.1972  4.3691 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept) 5.565556   0.145851  38.159  < 2e-16 ***
animalfox   0.806634   0.131198   6.148  8.6e-10 ***
animalpig   0.010635   0.131259   0.081   0.9354    
animalwolf  0.806650   0.131198   6.148  8.6e-10 ***
weight      0.007946   0.003815   2.083   0.0373 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1 

Residual standard error: 2.933 on 3995 degrees of freedom
Multiple R-squared: 0.01933,    Adjusted R-squared: 0.01835 
F-statistic: 19.69 on 4 and 3995 DF,  p-value: 4.625e-16

Dans ce cas, pour trouver l'estimation de la `` durée de vie '' lorsque la valeur de `` poids '' est 1, dois-je ajouter chacun des coefficients pour `` animal '' à l'interception: (Interception) + animalfox + animalpig + animalwolf? Ou quelle est la bonne façon de procéder?

Merci Sverre

Sverre
la source
les signes dollar vous font entrer dans un environnement d'équation et c'est pourquoi les choses sont mises en italique au hasard.
Macro
mise en forme: pour obtenir code, indentation de 4 espaces.
wolf.rauch
si vous utilisez les 4 espaces en retrait, vous pouvez y mettre des étoiles et des signes dollar et ils apparaîtront comme tels. si vous les utilisez en dehors de la mise en forme du code, ils seront traités comme du balisage. Si vous ne voulez pas d'une codeligne complète , utilisez des astuces:this is code with a $ and *
wolf.rauch
1
Il est bon que vous ayez utilisé un exemple reproductible. Vous pouvez rendre l'exemple encore meilleur en incluant set.seed(1)(ou le nombre que vous voulez) avant d'exécuter la génération de nombres aléatoires, de sorte que tout le monde obtienne exactement les mêmes résultats que vous (mais cela n'a pas beaucoup d'importance dans ce cas, cependant).
wolf.rauch
Juste deux petits commentaires. Vous avez écrit "Afin de trouver l'estimation de la" durée de vie "lorsque la valeur de" poids "est 1, j'ajoute (Interception) + hauteur = 63,64319". Notez qu'il s'agit de la durée de vie moyenne estimée lorsque le poids est = 1 et la taille = 0 . Ce n'est probablement pas très significatif. De plus, les prédictions en dehors de la plage des valeurs observées des variables indépendantes doivent être traitées avec prudence (le poids est compris entre 50 et 120, donc le poids = 1 n'est pas non plus très significatif). Juste quelques notes et probablement des choses que vous saviez déjà. Mais juste au cas où ...
Wolfgang

Réponses:

12

Non, vous ne devez pas additionner tous les coefficients ensemble. Vous avez essentiellement le modèle

lifespan=β0+β1fox+β2pig+β3wolf+β4weight+ε

où, par exemple, pig=1si l'animal était un porc et 0 sinon. Donc, pour calculerβ0+β1+β2+β3+β4 comme vous l'avez suggéré pour obtenir la moyenne globale lorsque weight=1c'est comme dire "si vous étiez un cochon, un loup et un renard, et que votre poids était de 1, quelle est votre durée de vie prévue?". Il est clair que chaque animal n'est qu'une de ces choses, cela n'a pas beaucoup de sens.

Vous devrez le faire séparément pour chaque animal. Par exemple,β0+β2+β4 est la durée de vie attendue d'un porc lorsque son poids est de 1.

Macro
la source
Macro: je comprends. Serait-il donc logique de trouver le coefficient moyen des niveaux dans «animal»? En d'autres termes, faites (Intercept) + (animalfox + animalpig + animalwolf) / 3. Ou est-ce valable uniquement lorsqu'il y a un nombre égal d'observations pour chaque animal dans l'ensemble de données?
Sverre
Je pense que vous avez raison - cela ne serait valable que s'il y a un nombre égal dans chaque groupe. Vous pouvez les pondérer proportionnellement à la façon dont chaque groupe est représenté dans l'échantillon si vous insistez pour le résumer en un seul nombre.
Macro
Quelle serait la bonne façon de les pondérer? La raison pour laquelle j'insiste pour le résumer en un seul nombre est que je veux tracer la droite de régression pour une seule des variables d'un nuage de points. Par exemple, dans l'exemple human.life ci-dessus, je tracerais la ligne de régression pour le `` poids '' en spécifiant l'interception de la ligne ((Intercept) + hauteur = 63,64319) avec son coefficient (0,024544). C'est juste un peu plus délicat dans le cas de la vie animale.
Sverre
En y réfléchissant davantage, je ne sais pas comment une sorte de moyenne serait interprétable. Vous pourriez simplement tracer trois droites de régression parallèles sur un seul tracé, n'est-ce pas? De plus, il me semble que l'effet du "poids" serait différent pour chaque animal, auquel cas vous devriez avoir un animal interagissant avec le poids, ce qui conduirait à trois lignes de régression complètement différentes pour chaque animal.
Macro
Mais dans le cas où la variable pour «animal» et la variable pour «poids» sont toutes deux significatives, mais leur interaction ne l'est pas, je n'inclurais même pas l'interaction dans le modèle. La régression multiple estime l'effet du «poids» indépendamment de la valeur de «animal».
Sverre
4

La chose la plus simple à faire est d'utiliser la fonction de prédiction sur l'objet lm, puis de gérer de nombreux détails comme la conversion d'un facteur aux bonnes valeurs à additionner. Si vous essayez de comprendre les éléments qui entrent dans la prédiction, définissez-le type='terms'et il montrera les éléments individuels qui s'ajoutent pour faire votre prédiction.

Notez également que la façon dont un facteur est converti en variables dépend de certaines options, la valeur par défaut choisira un groupe de référence pour comparer les autres groupes, mais vous pouvez également le définir sur une moyenne et des différences par rapport à cette moyenne (ou d'autres comparaisons d'intérêt) .

Greg Snow
la source
L'utilisation de predire.lm () est une bonne solution pour un objet lm. Malheureusement, je suis en train d'adapter un objet lmer à mes données, pour lequel il n'existe aucune fonction Predict () d'extraction de termes individuels. Vous ai-je bien compris que la méthode alternative que vous proposez définirait l'interception comme étant la valeur moyenne, au lieu d'une ligne de base (où tous les prédicteurs continus sont définis sur 0, et une valeur de prédicteurs catégoriques est choisie)? Si c'est le cas, j'aimerais savoir comment procéder. Ensuite, je pouvais simplement tracer ma droite de régression comme l'ordonnée à l'origine du modèle + le coefficient de mon prédicteur.
Sverre
Regardez les «contrastes», «C», «contr.sum» et la partie des contrastes des «options».
Greg Snow
2

Si vous voulez la durée de vie moyenne lorsque le poids est de 1, vous pouvez simplement supprimer "animal" dans cet appel:

lm(formula = lifespan ~ 1 + animal + weight, data = animal.life)
Peter Flom
la source
Je ne comprends pas comment cela peut être juste. Si je retire l'un des prédicteurs («animal»), alors l'ordonnée à l'origine, le coefficient de «poids» et les estimations d'erreur changent tous. De plus, je n'essaie pas de savoir quelle est la durée de vie moyenne réelle du poids 1 dans les données, mais ce que le modèle prédit qu'elle devrait être.
Sverre