3 votos

Matriz inversa para la codificación del contraste

Estoy tratando de entender cómo funciona la "codificación de contraste definida por el usuario". Mi pregunta se refiere al ejemplo de http://www.ats.ucla.edu/stat/r/library/contrast_coding.htm#User :

#initial contrast matrix including the constant term
mat = matrix(c(1/4, 1/4, 1/4, 1/4, 1, 0, -1, 0, -1/2, 1, 0, -1/2, -1/2, -1/2, 1/2, 1/2), ncol = 4)
mat
     [,1] [,2] [,3] [,4]
[1,] 0.25    1 -0.5 -0.5
[2,] 0.25    0  1.0 -0.5
[3,] 0.25   -1  0.0  0.5
[4,] 0.25    0 -0.5  0.5

mymat = solve(t(mat))
mymat
     [,1] [,2] [,3] [,4]
[1,]    1 -0.5   -1 -1.5
[2,]    1  0.5    1  0.5
[3,]    1 -1.5   -1 -1.5
[4,]    1  1.5    1  2.5

#remove the intercept (constant) term
my.contrasts<-mymat[,2:4]
contrasts(hsb2$race.f) = my.contrasts

Pregunta:

  • ¿Por qué es necesario calcular la inversa de la matriz transpuesta? Todos los demás ejemplos de la página no utilizan álgebra matricial (por ejemplo, "Codificación ficticia").

3voto

Ben Page Puntos 815

Bien, creo que tengo una respuesta. Tenga en cuenta que no soy un matemático, por lo que esto no es una prueba.

Supongamos que hemos cotejado un conjunto de datos y queremos comparar grupos.

Nuestros grupos: a, b, c

Las comparaciones que queremos hacer

  • Primer contraste: a vs b
  • Segundo contraste: b vs c

Como equotación esto debería verse así:

\begin{equation*} c_1 = a - b \\ c_2 = b - c \end{equation*}

Como una matriz: \begin{equation*} \begin{pmatrix} c_1 \\ c_2 \end{pmatrix} = \begin{pmatrix} 1 & -1 & 0\\ 0 & 1 & -1 \end{pmatrix} \cdot \begin{pmatrix} a \\ b \\ c \end{pmatrix} \fin{ecuación*}

O:

\begin{equation*} c = A \cdot v \end{equation*}

Pero estos no son los droides que buscábamos ;-) Lo que realmente queremos es una ecuación como esto:

\begin{equation*} v = X \cdot c \end{equation*}

O:

\begin{equation*} \begin{pmatrix} a \\ b \\ c \end{pmatrix} = \begin{pmatrix} ? & ? \\ ? & ? \\ ? & ? \end{pmatrix} \cdot \begin{pmatrix} c_1 \\ c_2 \end{pmatrix} \fin{ecuación*} Podemos conseguirlo multiplicando con la matriz inversa (A'):

\begin{equation*} c = A \cdot v \\ A^{-1} \cdot c = A^{-1} \cdot A \cdot v \\ A^{-1} \cdot c = v \\ v = A^{-1} \cdot c \end{equation*}

Así, para nuestro ejemplo esto sería:

\begin{equation*} \begin{pmatrix} a \\ b \\ c \end{pmatrix} = \begin{pmatrix} 2/3 & 1/3 \\ -1/3 & 1/3 \\ -1/3 & -2/3 \end{pmatrix} \cdot \begin{pmatrix} c_1 \\ c_2 \end{pmatrix} \fin{ecuación*}

Ten en cuenta que para tomar la inversa de una matriz necesitas una matriz cuadrada. Si no tienes una matriz cuadrada tú (o tu PC) tiene que resolver el problema numéricamente. En r esto se puede hacer con la función ginv() del paquete MASS

3voto

eddy147 Puntos 1709

[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!

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X