20 votos

Cualitativa de código variable en la regresión conduce a la "singularidades"

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

Pero con 3 modalidades de respuesta, he tratado de código de esta variable como esta :

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 quality me da NA:

Coefficients: (1 not defined because of singularities) 

¿Cómo puedo código de esta variable "calidad" con 3 modalidades? ¿Tengo que crear una variable como un factor (factor en R) pero, a continuación, puede introducir este factor en una regresión lineal múltiple?

26voto

Sean Hanley Puntos 2428

El problema que tiene (es decir, "singularidades") puede ser pensado como una instancia de la multicolinealidad. La multicolinealidad es a menudo definido como:

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

Este es, de hecho, una definición estricta; es perfecta multicolinealidad, y usted fácilmente puede tener un problema con la multicolinealidad sin ninguna de sus variables perfecta combinación lineal de los otros. Por otra parte, perfecta multicolinealidad rara vez se produce. Sin embargo, se han tropezado a través de un caso donde puede ocurrir. Vamos a ver cómo podemos perfectamente predecir medium quality a partir de nuestro conocimiento de las otras dos categorías (vamos a hacerlo con un modelo de regresión donde medium quality es $Y$, e bad quality & high quality son $X_1$ & $X_2$, respectivamente):
$$ Y = \beta_0 + \beta_1X_1 + \beta_2X_2 $$ Nota que no es un término de error, $\varepsilon$, especifica, ya que podemos predecir perfectamente. Para ello, hemos establecido $\beta_0 = 1$, $\beta_1 = -1$, y $\beta_2 = -1$. Ahora, cuando usted tiene bad quality,, a continuación,$X_1=1$, lo que cancela $\beta_0$ ($1\; + \;-1\!\times\! 1$), y $X_2=0$, por lo que el plazo se cancela fuera así ($-1\times 0$). Por lo tanto, nos quedamos con un valor de predicción de $0$ $Y$ (medium quality), que es exactamente correcto. Yo se lo dejo a usted para trabajar las otras posibilidades (siempre funciona, en su caso).

Entonces, ¿qué debe hacer? Cuando se representa a una variable categórica, por lo general, el uso de la celda de referencia de codificación (a menudo llamado " el maniquí de codificación). Para ello, se escoge un nivel de nuestra variable categórica como el nivel de referencia; que el nivel de no conseguir su propio código ficticio, sino que simplemente es indicado por tener todos los $0$'s en las maquetas de los códigos para todos los otros niveles. Los otros niveles de la variable categórica están representados por ficticia de los códigos de la misma como ya lo ha hecho. (Para más información sobre esto, puedes ver mi respuesta aquí: Regresión basado por ejemplo en los días de la semana.) Si usted está usando R, se puede utilizar un factor y R va a hacer todo esto para usted-será realizado correctamente, y es mucho más conveniente-no obstante, vale la pena comprender que esto es lo que está pasando detrás de las escenas".

10voto

Magnus Nordlander Puntos 161

@gung ha explicado la teoría de la claridad. He aquí 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 los $0$s) bad como 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 bien, si el código de las variables ficticias de nosotros y tratar de ajustar un modelo con todos ellos:

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)

Llegamos a la espera de error: singular fit encountered

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