La codificación de variables cualitativas en regresión conduce a "singularidades"

17

Tengo una variable independiente llamada "calidad"; Esta variable tiene 3 modalidades de respuesta (mala calidad; calidad media; alta calidad). Quiero introducir esta variable independiente en mi regresión lineal múltiple. Cuando tengo una variable independiente binaria (variable ficticia, puedo codificar 0/ 1) es fácil introducirla en un modelo de regresión lineal múltiple.

Pero con 3 modalidades de respuesta, he intentado codificar esta variable de esta manera:

Bad quality      Medium quality      High quality

     0                1                  0
     1                0                  0
     0                0                  1
     0                1                  0

Pero hay un problema cuando trato de hacer mi regresión lineal múltiple: la modalidad Medium qualityme da NA:

Coefficients: (1 not defined because of singularities) 

¿Cómo puedo codificar esta variable "calidad" con 3 modalidades? ¿Tengo que crear una variable como factor ( factorin R) pero luego puedo introducir este factor en una regresión lineal múltiple?

varin sacha
fuente
2
Tal vez estoy malinterpretando la pregunta, pero no puede incluir todos los niveles de una variable categórica en una regresión lineal debido a la colinealidad perfecta. Una de sus categorías se eliminará para proporcionar un grupo base con el que se comparan los otros grupos.
RickyB
1
Hay una explicación sobresaliente en un contexto estadístico de lo que constituye una matriz singular aquí: ¿qué-correlación-hace-una-matriz-singular?
gung - Restablece a Monica

Respuestas:

23

El problema que tiene (es decir, "singularidades") puede considerarse como una instancia de multicolinealidad . La multicolinealidad a menudo se define como:

Una o más variables predictoras son una combinación lineal de otras variables predictoras.

Esta es, de hecho, una definición bastante estricta; es multicolinealidad perfecta , y puede tener fácilmente un problema con multicolinealidad sin que ninguna de sus variables sea una combinación lineal perfecta de otras. Además, rara vez se produce una multicolinealidad perfecta. Sin embargo, se ha topado con un caso en el que puede ocurrir. Veamos cómo podemos predecir perfectamente amedium quality partir de nuestro conocimiento de las otras dos categorías (haremos esto con un modelo de regresión donde medium qualityes , y & son X 1 y X 2 , respectivamente): Y = β 0 + β 1Ybad qualityhigh qualityX1X2
Tenga en cuenta que no hay un término de error, ε , especificado, porque podemos predecir esto perfectamente. Para hacerlo, establecemos β 0 = 1 , β 1 = - 1 y β 2 = - 1 . Ahora, cuando tienes, entonces X 1 = 1 , que cancela β 0 (

Y=β0+β1X1+β2X2
εβ0=1β1=1β2=1bad qualityX1=1β0 ), y X 2 = 0, por lo que ese término también se cancela ( - 1 × 0 ). Por lo tanto, nos queda un valor predicho de 0 para Y (), que es exactamente correcto. Te dejaré que descubras las otras posibilidades (siempre funciona, en tu caso). 1+1×1X2=01×00Ymedium quality

0R , puede usar un factoryR hará todo esto por usted: se hará correctamente y es mucho más conveniente; sin embargo, vale la pena entender que esto es lo que está sucediendo 'detrás de escena'.

gung - Restablece a Monica
fuente
Gracias por todos sus comentarios ! Estoy usando R, así que si entendí bien, con un factor R hará todo, ¡no necesito hacer nada! Perfecto ! ¡Tanques una vez más!
varin sacha
Si establece la intersección en cero en la lmfórmula ( + 0), ¿funcionaría?
Firebug
1
@Firebug, si está utilizando el nivel significa codificación (es decir, tiene una variable separada para cada nivel), entonces puede establecer la intersección en cero y debería funcionar bien. Aunque el significado de los coeficientes variables y las pruebas de hipótesis serán diferentes.
gung - Restablece a Monica
10

@gung ha explicado la teoría claramente. Aquí hay un ejemplo práctico para ilustrar:

set.seed(1)
pred1 <- factor(c("bad", "med", "high"), levels=c("bad", "med", "high"))
df1 <- data.frame(y=20*abs(runif(6)),
                  x=rnorm(6),
                  q=sample(pred1, 6, replace=TRUE)
                  )
l1 <- lm(y ~ x, data=df1)
### add variable q    
l2 <- lm(y ~ x + q, data=df1)
### look at dummy variables generated in creating model
model.matrix(l2)

Esto nos muestra que el nivel de referencia (todos 0 0s) es badcomo se ve aquí en la fila 4:

  (Intercept)          x qmed qhigh
1           1  1.5952808    1     0
2           1  0.3295078    0     1
3           1 -0.8204684    0     1
4           1  0.4874291    0     0
5           1  0.7383247    1     0
6           1  0.5757814    0     0

Ahora, si codificamos las variables ficticias nosotros mismos e intentamos ajustar un modelo con todas ellas:

df1 <- within(df1, {
       qbad <- ifelse(q=="bad", 1, 0)
       qmed <- ifelse(q=="med", 1, 0)
       qhigh <- ifelse(q=="high", 1, 0)
       })    
lm(y ~ x + qbad + qmed + qhigh, data=df1, singular.ok=FALSE)

Obtenemos el error esperado: singular fit encountered

Dardisco
fuente
1
Placer. Espero que todo esté claro ahora. factorgeneralmente se encargará de la codificación variable ficticia para usted, pero es bueno estar al tanto de lo que está sucediendo 'bajo el capó'.
dardisco