¿Cómo hacer la regresión con la codificación de efectos en lugar de la codificación ficticia en R?

14

Actualmente estoy trabajando en un modelo de regresión donde solo tengo variables categóricas / factoriales como variables independientes. Mi variable dependiente es una relación transformada logit.

Es bastante fácil ejecutar una regresión normal en R, ya que R sabe automáticamente cómo codificar dummies tan pronto como son del tipo "factor". Sin embargo, este tipo de codificación también implica que una categoría de cada variable se utiliza como línea de base, lo que dificulta su interpretación.

Mi profesor me ha dicho que solo use la codificación de efectos en su lugar (-1 o 1), ya que esto implica el uso de la gran media para la intercepción.

¿Alguien sabe cómo manejar eso?

Hasta ahora he intentado:

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
fuente
1
Mire los contrastes, creo que es una prueba para contrastar con la gran media - verifique los archivos de ayuda de R
user20650

Respuestas:

13

En principio, hay dos tipos de codificación de contraste, con los cuales la intersección estimará la Gran Media. Estos son contrastes de suma y contrastes repetidos (diferencias deslizantes).

Aquí hay un conjunto de datos de ejemplo:

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))

Las condiciones significan:

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

La gran media:

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

Puede especificar el tipo de codificación de contraste con el contrastsparámetro en lm.

Suma contrastes

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

Coefficients:
(Intercept)           b1           b2  
     0.9782       1.0543      -0.0657 

La intersección es la gran media. La primera pendiente es la diferencia entre el primer nivel de factor y la Gran Media. La segunda pendiente es la diferencia entre el segundo nivel de factor y la Gran Media.

Contrastes repetidos

La función para crear contrastes repetidos es parte del MASSpaquete.

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

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

La intersección es la gran media. Las pendientes identifican las diferencias entre los niveles de factores consecutivos (2 vs. 1, 3 vs. 2).

Sven Hohenstein
fuente
Hmm, acabo de probar lo que sugirió, pero no estoy seguro de que ninguno de los códigos haga lo que quiero. El caso es que tengo años {1998, ..., 2007} en un IV y meses {Jan, ..., Dec} en otro IV. Como ahora es la función lm, automáticamente permite que April se convierta en la intercepción, así como en 1998. En cambio, solo quiero que la intercepción sea un medio general ... Realmente no sé si tiene sentido al pensar en eso ...
Kasper Christensen
@KasperChristensen Si especifica los contrastes como en los ejemplos, la intersección será la gran media. Proporcione un ejemplo reproducible de lo que ha intentado.
Sven Hohenstein
@SvenHohenstein ¿por qué no hay un coeficiente b3 para el valor categórico de C en los contrastes de suma? Debería ser -0.9885891.
Vivaldi
@Vivaldi El valor de b3 está determinado por la intersección y b1, b2. No queda ningún grado de libertad para otro contraste.
Sven Hohenstein
@SvenHohenstein ¿No es esto más un problema de colinealidad ya que b3 se puede expresar directamente como una combinación lineal de otras variables: (3 * gran media - b1 - b2)?
Vivaldi
6

Nitpicking: si tu profesor te dijo que codificaras tus variables (-1, 1), te dijo que usaras la codificación de efectos , no los tamaños de efectos . En cualquier caso, @ user20650 tiene razón. Como de costumbre, el sitio web de ayuda de estadísticas de UCLA tiene una página útil que explica cómo hacer esto con R.

gung - Restablece a Monica
fuente