Comment faire une régression avec un codage d'effet au lieu d'un codage factice dans R?

15

Je travaille actuellement sur un modèle de régression où je n'ai que des variables catégorielles / factorielles comme variables indépendantes. Ma variable dépendante est un rapport transformé logit.

Il est assez facile d'exécuter une régression normale dans R, car R sait automatiquement coder les nuls dès qu'ils sont du type "facteur". Cependant, ce type de codage implique également qu'une catégorie de chaque variable est utilisée comme référence, ce qui rend son interprétation difficile.

Mon professeur m'a dit de simplement utiliser le codage d'effet à la place (-1 ou 1), car cela implique l'utilisation de la grande moyenne pour l'interception.

Est-ce que quelqu'un sait comment gérer cela?

Jusqu'à présent, j'ai essayé:

gm <- mean(tapply(ds$ln.crea, ds$month,  mean))
model <- lm(ln.crea ~ month + month*month + year + year*year, data = ds, contrasts = list(gm = contr.sum))

Call:
lm(formula = ln.crea ~ month + month * month + year + year * 
    year, data = ds, contrasts = list(gm = contr.sum))

Residuals:
     Min       1Q   Median       3Q      Max 
-0.89483 -0.19239 -0.03651  0.14955  0.89671 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept) -3.244493   0.204502 -15.865   <2e-16 ***
monthFeb    -0.124035   0.144604  -0.858   0.3928    
monthMar    -0.365223   0.144604  -2.526   0.0129 *  
monthApr    -0.240314   0.144604  -1.662   0.0993 .  
monthMay    -0.109138   0.144604  -0.755   0.4520    
monthJun    -0.350185   0.144604  -2.422   0.0170 *  
monthJul     0.050518   0.144604   0.349   0.7275    
monthAug    -0.206436   0.144604  -1.428   0.1562    
monthSep    -0.134197   0.142327  -0.943   0.3478    
monthOct    -0.178182   0.142327  -1.252   0.2132    
monthNov    -0.119126   0.142327  -0.837   0.4044    
monthDec    -0.147681   0.142327  -1.038   0.3017    
year1999     0.482988   0.200196   2.413   0.0174 *  
year2000    -0.018540   0.200196  -0.093   0.9264    
year2001    -0.166511   0.200196  -0.832   0.4073    
year2002    -0.056698   0.200196  -0.283   0.7775    
year2003    -0.173219   0.200196  -0.865   0.3887    
year2004     0.013831   0.200196   0.069   0.9450    
year2005     0.007362   0.200196   0.037   0.9707    
year2006    -0.281472   0.200196  -1.406   0.1625    
year2007    -0.266659   0.200196  -1.332   0.1855    
year2008    -0.248883   0.200196  -1.243   0.2164    
year2009    -0.153083   0.200196  -0.765   0.4461    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 

Residual standard error: 0.3391 on 113 degrees of freedom
Multiple R-squared: 0.3626, Adjusted R-squared: 0.2385 
F-statistic: 2.922 on 22 and 113 DF,  p-value: 0.0001131 
Kasper Christensen
la source
1
Regardez les contrastes, je pense que sa somme de contrôle est à comparer avec la moyenne générale - consultez les fichiers d'aide R
user20650
2
Cela pourrait être utile: unc.edu/courses/2006spring/ecol/145/001/docs/lectures/…
mark999

Réponses:

13

En principe, il existe deux types de codage de contraste, avec lesquels l'ordonnée à l'origine estimera le Grand Mean. Ce sont des contrastes de somme et des contrastes répétés (différences glissantes).

Voici un exemple d'ensemble de données:

set.seed(42)
x <- data.frame(a = c(rnorm(100,2), rnorm(100,1),rnorm(100,0)),
                b = rep(c("A", "B", "C"), each = 100))

Les conditions »signifient:

tapply(x$a, x$b, mean)
         A           B           C 
2.03251482  0.91251629 -0.01036817 

Le Grand Mean:

mean(tapply(x$a, x$b, mean))
[1] 0.978221

Vous pouvez spécifier le type de codage de contraste avec le contrastsparamètre dans lm.

Contrastes de somme

lm(a ~ b, x, contrasts = list(b = contr.sum))

Coefficients:
(Intercept)           b1           b2  
     0.9782       1.0543      -0.0657 

L'ordonnée à l'origine est le Grand Mean. La première pente est la différence entre le premier niveau de facteur et le Grand Mean. La deuxième pente est la différence entre le deuxième niveau de facteur et le Grand Mean.

Contrastes répétés

La fonction de création de contrastes répétés fait partie du MASSpackage.

lm(a ~ b, x, contrasts = list(b = MASS::contr.sdif))

Coefficients:
(Intercept)         b2-1         b3-2  
     0.9782      -1.1200      -0.9229 

L'ordonnée à l'origine est le Grand Mean. Les pentes indiquent les différences entre les niveaux de facteurs consécutifs (2 contre 1, 3 contre 2).

Sven Hohenstein
la source
Hmm, viens d'essayer ce que vous avez suggéré, mais je ne suis pas sûr que l'un des codes fasse ce que je veux. Le fait est que j'ai des années {1998, ..., 2007} dans une IV et des mois {Jan, ..., Dec} dans une autre IV. Comme c'est maintenant la fonction lm qui laisse automatiquement April devenir l'interception ainsi que 1998. Au lieu de cela, je veux juste que l'interception soit un moyen global ... Je ne sais pas vraiment si cela a du sens quand on y pense ...
Kasper Christensen
@KasperChristensen Si vous spécifiez les contrastes comme dans les exemples, l'ordonnée à l'origine sera le Grand Mean. Veuillez fournir un exemple reproductible de ce que vous avez essayé.
Sven Hohenstein
@SvenHohenstein pourquoi n'y a-t-il pas de coefficient b3 pour la valeur catégorielle C dans les contrastes de somme? Il devrait être de -0,9885891.
Vivaldi
@Vivaldi La valeur de b3 est déterminée par l'ordonnée à l'origine et b1, b2. Il n'y a plus aucun degré de liberté pour un autre contraste.
Sven Hohenstein
@SvenHohenstein N'est-ce pas davantage un problème de colinéarité puisque b3 peut être directement exprimé comme une combinaison linéaire d'autres variables: (3 * moyenne grande - b1 - b2)?
Vivaldi
6

Nitpicking: si votre professeur vous a dit de coder vos variables avec (-1, 1), il vous a dit d'utiliser le codage d' effet , pas les tailles d' effet . En tout cas, @ user20650 a raison. Comme d'habitude, le site Web d'aide des statistiques UCLA a une page utile qui explique comment procéder avec R.

gung - Réintégrer Monica
la source