Después de muchos años de aprendizaje sobre los contrastes en los modelos lineales, tengo curiosidad por la utilidad relativa de la codificación de la desviación, tal y como la define este sitio web . Agradecería que alguien me informara de algunas cosas. He aquí un ejercicio de simulación de datos para poner de manifiesto el origen de mi confusión. Quiero simular datos en los que hay un predictor categórico de dos niveles ( group
) y un predictor continuo ( pred
). He programado en las diferencias entre grupos la relación de ambos predictores con la variable de resultado ( outcome
).
# toy data
set.seed(0001)
# two variables with a .7 correlation, where mean of outcome variable is 0
mu1 <- c(0,0)
Sigma1 <- matrix(.7, nrow=2, ncol=2) + diag(2)*.3
rawvars1 <- as.data.frame(MASS::mvrnorm(n=100, mu=mu1, Sigma=Sigma1))
names(rawvars1) <- c("pred", "outcome")
# two variables with a .3 correlation where mean of outcome variable is 4
mu2 <- c(0,4)
Sigma2 <- matrix(.3, nrow = 2, ncol = 2) + diag(2)*.7
rawvars2 <- as.data.frame(MASS::mvrnorm(n=100, mu=mu2, Sigma=Sigma2))
names(rawvars2) <- c("pred", "outcome")
# bind dataframes and add a grouping variable
df <- rbind(rawvars1, rawvars2)
df$group <- factor(rep(letters[1:2], each = 100))
Comprobemos que hemos hecho lo que pretendíamos obteniendo el pred-outcome
correlaciones en cada nivel de grupo
by(df, df$group, function (i) cor.test(i$outcome, i$pred))
Bien. Las correlaciones de r \= .666 en el grupo a
y r \= .3 en el grupo b
. Muy cerca de las correlaciones que programamos en los dos conjuntos de datos antes de ligarlos. ¿Y las medias de los resultados?
tapply(df$outcome, df$group, mean)
Medias de ~0 para el resultado en el grupo a
y ~4 en el grupo b
. Así que nuestro dataframe se comporta como le hemos dicho. Ahora vamos a intentar la regresión con un esquema de codificación diferente
Codificación del tratamiento
lm(outcome ~ pred*group, df, contrasts = list(group = c(0,1)))
# Coefficients:
# (Intercept) pred group1 pred:group1
# 0.009227 0.665201 4.047715 -0.288114
Bien, aquí el intercepto es la media del resultado en el grupo a
, que es aproximadamente 0. A continuación, el pred
El coeficiente es la cantidad que pred
predice el resultado en el grupo a
sólo, más o menos lo mismo que la correlación que extrajimos antes, así que bien. A continuación, el group1
es la diferencia en el valor medio del resultado (es decir, el intercepto) entre el grupo b
en comparación con el grupo a
. Una vez más, esto es correcto, una diferencia prevista de ~4. Por último, el pred:group1
El coeficiente es la diferencia de pendiente entre el grupo b
y el grupo a
= 0,665 + -,288 = 0,377, lo que, una vez más, es aproximadamente la correlación entre el predictor y el resultado en el grupo b
. Este esquema de codificación ha recuperado los parámetros con precisión. Siguiente codificación simple
Codificación simple
lm(outcome ~ pred*group, df, contrasts = list(group = c(-.5,.5)))
# Coefficients:
# (Intercept) pred group1 pred:group1
# 2.0331 0.5211 4.0477 -0.2881
Aquí el intercepto debe ser la media general
mean(df$outcome)
[1] 2.070099
...lo suficientemente cerca. Y el pred
el coeficiente debe ser la pendiente/correlación promediada entre los grupos
mean(c(.665, .377))
[1] 0.521
El group
coeficiente también es correcto, una diferencia media de cuatro, y el pred:group1
El coeficiente, una vez más, es la diferencia de pendiente entre los grupos: -2,88. Al igual que la codificación del tratamiento, la codificación simple nos proporciona información precisa. Su beneficio incremental sobre la codificación de tratamiento es que produce algo así como un contraste de "efecto principal", el pred
coeficiente, que es la cantidad que el pred
predice el resultado, promediado entre los grupos.
Codificación de la desviación
lm(outcome ~ pred*group, df, contrasts = list(group = c(-1,1)))
# Coefficients:
# (Intercept) pred group1 pred:group1
# 2.0331 0.5211 2.0239 -0.1441
Estoy confundido sobre lo que los coeficientes nos dan aquí. Aquí el intercepto es una vez más la media general, el pred
es la pendiente media de todos los grupos, pero los coeficientes de los group1
y pred:group1
son exactamente la mitad de lo que son en el esquema de codificación simple
Así es el group
¿El coeficiente es simplemente la mitad de la diferencia real entre grupos, la mitad del coeficiente obtenido por el esquema de codificación simple, es decir, incorrecto?
2 * 2.0239
[1] 4.0478
¿O es la diferencia entre el grupo b
resultado medio y la media general?
2.0331 + 2.0239
[1] 4.057 # not quite right but close
¿Y cuál es el pred:group1
¿coeficiente, si no me equivoco?
¿Y cómo se relaciona todo esto con las sumas de cuadrados de tipo 1 y 3? La codificación de la desviación es lo que obtenemos si especificamos options(contrasts = c("contr.sum", "contr.poly))
que se supone que es de tipo 3 (según la codificación por defecto del SPSS). Pero no recupera los parámetros correctos, a no ser que me equivoque e interprete mal la salida de la regresión.