[Nota: para todas las personas que llegaron aquí confundidas después de leer la sección 9 del post de UCLA sobre las matrices de contraste, esto ayudará.]
El post anterior es correcto. En realidad hay que hacer la inversa de la transformación. De hecho, si te fijas bien, eso ocurre para todos los demás tipos de codificación de contraste que se comentan en ese post. Cubriré los tres más comunes: codificación ficticia, simple y de desviación.
Por favor, utilice las siguientes demostraciones para convencerse de las similitudes / diferencia / relación entre los contrastes [como normalmente los escribimos para la comprensión humana] y lo que se ve en R [matriz de contraste].
En primer lugar, veamos la codificación ficticia o de tratamiento
hsb2 = read.table('http://www.ats.ucla.edu/stat/data/hsb2.csv', header=T, sep=",")
#creating the factor variable race.f
hsb2$race.f = factor(hsb2$race, labels=c("Hispanic", "Asian", "African-Am", "Caucasian"))
#================================================================
# =: Dummy Coding [normal intercept] :=
#================================================================
# This is just a quick way to create what you would normally consider
# a simple "treatment" coding or "dummy coding" matrix
dummy.coding <- rbind(c(1,-1,-1,-1),
c(0, 1, 0, 0),
c(0, 0, 1, 0),
c(0, 0, 0, 1))
rownames(dummy.coding) <- c("control", "L1","L2","L3")
colnames(dummy.coding) <- c("intercept", "L1 vs Control","L2 vs Control","L3 vs Control")
# Column 2:4 is what you would normally consider the contrast
# And, as you can see, they add to zero
dummy.coding
# Now, to get the coding matrix that R will use,
# you need to take the inverse of the transpose of this matrix
# and, drop the first column
coding.matrix <- solve(t(dummy.coding))[,-1]
coding.matrix
# To convince yourself, this is correct, compare it to the
# inbuilt R function:
contr.treatment(4)
# Now, using the dataset that you cited from the UCLA page
# You can see the what R is doing under the hood:
# First, we assign
contrasts(hsb2$race.f) = coding.matrix
# Now, we look at the model matrix
View(cbind(as.character(hsb2$race.f), model.matrix(~race.f, data=hsb2)))
# So, essentially, R took that coding matrix and
# generated dummy variables
# Now, see the linear model:
summary(lm(formula = write ~ race.f, data = temp.hsb2))
Bien, una vez hecho el caso básico, vamos a ampliarlo. En el ejemplo anterior, el intercepto del modelo era la variable de "control".
Obsérvese que la matriz de codificación final no incluye una columna para el intercepto. Esto se debe a que la inversa de la transposición del contraste(dummy.coding) lo ha cocido en el resultado final: coding.matrix.
Codificación simple
Así que, ahora, vamos a ver un caso en el que queremos que el intercepto represente la media general (es decir, la media de las medias). Esto se llama a veces codificación simple.
En este caso, sólo se ajusta la primera columna de la matriz de contraste al mismo valor.
#============================================================
#=: Dummy Coding [grand mean intercept i.e. simple coding] :=
#============================================================
dummy.coding.GM.intercept <- rbind(c(1,-1,-1,-1),
c(1, 1, 0, 0),
c(1, 0, 1, 0),
c(1, 0, 0, 1))
rownames(dummy.coding.GM.intercept) <- c("control", "L1","L2","L3")
colnames(dummy.coding.GM.intercept) <- c("intercept: GM", "L1 vs Control","L2 vs Control","L3 vs Control")
dummy.coding.GM.intercept
coding.matrix <- solve(t(dummy.coding.GM.intercept))[,-1]
coding.matrix
contrasts(hsb2$race.f) = coding.matrix
# Now, see the linear model and compare the intercepts:
summary(lm(formula = write ~ race.f, data = temp.hsb2))
Codificación de la desviación o de los efectos
Por último, veamos otro caso común. En este caso, queremos tener contrastes que comparen un nivel determinado de un factor con la media general de la variable. Esto se denomina a veces codificación de efectos, codificación de desviaciones o contrastes de suma.
#=======================================================
# =: Deviation Coding [intercept: grand mean] :=
#=======================================================
deviation.coding <- cbind(c( 0.25, 0.25, 0.25, 0.25),
c( 0.75, -0.25, -0.25, -0.25),
c(-0.25, 0.75, -0.25, -0.25),
c(-0.25, -0.25, 0.75, -0.25))
rownames(deviation.coding) <- c("L1","L2","L3", "L4")
colnames(deviation.coding) <- c("intercept: GM", "L1 vs GM","L2 vs GM","L3 vs GM")
deviation.coding
# Now, to get the coding matrix that R will use,
# you need to take the inverse of the transpose of this matrix
# and, drop the first column
coding.matrix <- solve(t(deviation.coding))[,-1]
coding.matrix
# To convince yourself, this is correct, compare it to the
# inbuilt R function:
contr.sum(4)
# Now, using the dataset that you cited from the UCLA page
# You can see the what R is doing under the hood:
# First, we assign
contrasts(hsb2$race.f) = coding.matrix
# Now, we look at the model matrix
View(cbind(as.character(hsb2$race.f), model.matrix(~race.f, data=hsb2)))
# So, essentially, R took that coding matrix and
# generated variables with EFFECTS CODING
Así que, ahí está eso. ¡Espero que esto ayude!