r regression linear-regression lm

El resumen `lm` no muestra todos los niveles de factores



regression linear-regression (1)

Estoy ejecutando una regresión lineal en varios atributos, incluidos dos atributos categóricos, B y F , y no obtengo un valor de coeficiente para cada nivel de factor que tengo.

B tiene 9 niveles y F tiene 6 niveles. Cuando inicialmente ejecuté el modelo (con intersecciones), obtuve 8 coeficientes para B y 5 para F que entendí como el primer nivel de cada uno incluido en la intersección.

Quiero clasificar los niveles dentro de B y F función de su coeficiente, por lo que agregué -1 después de cada factor para bloquear la intersección en 0 y poder obtener coeficientes para todos los niveles.

Call: lm(formula = dependent ~ a + B-1 + c + d + e + F-1 + g + h, data = input) Coefficients: Estimate Std. Error t value Pr(>|t|) a 2.082e+03 1.026e+02 20.302 < 2e-16 *** B1 -1.660e+04 9.747e+02 -17.027 < 2e-16 *** B2 -1.681e+04 9.379e+02 -17.920 < 2e-16 *** B3 -1.653e+04 9.254e+02 -17.858 < 2e-16 *** B4 -1.765e+04 9.697e+02 -18.202 < 2e-16 *** B5 -1.535e+04 1.388e+03 -11.059 < 2e-16 *** B6 -1.677e+04 9.891e+02 -16.954 < 2e-16 *** B7 -1.644e+04 9.694e+02 -16.961 < 2e-16 *** B8 -1.931e+04 9.899e+02 -19.512 < 2e-16 *** B9 -1.722e+04 9.071e+02 -18.980 < 2e-16 *** c -6.928e-01 6.977e-01 -0.993 0.321272 d -3.288e-01 2.613e+00 -0.126 0.899933 e -8.384e-01 1.171e+00 -0.716 0.474396 F2 4.679e+02 2.176e+02 2.150 0.032146 * F3 7.753e+02 2.035e+02 3.810 0.000159 *** F4 1.885e+02 1.689e+02 1.116 0.265046 F5 5.194e+02 2.264e+02 2.295 0.022246 * F6 1.365e+03 2.334e+02 5.848 9.94e-09 *** g 4.278e+00 7.350e+00 0.582 0.560847 h 2.717e-02 5.100e-03 5.328 1.62e-07 ***

Esto funcionó en parte, lo que llevó a la visualización de todos los niveles de B , sin embargo, F1 todavía no se muestra. Como ya no hay una intersección, estoy confundido por qué F1 no está en el modelo lineal.

Cambiar el orden de la llamada para que + F - 1 preceda a + B - 1 resulta en coeficientes de todos los niveles de F visibles pero no B1 .

¿Alguien sabe cómo mostrar todos los niveles de B y F , o cómo evaluar el peso relativo de F1 comparación con otros niveles de F de las salidas que tengo?


Este problema se plantea una y otra vez, pero desafortunadamente no se ha recibido una respuesta satisfactoria que pueda ser un objetivo duplicado apropiado. Parece que necesito escribir uno.

La mayoría de la gente sabe que esto está relacionado con los "contrastes", pero no todos saben por qué es necesario y cómo entender su resultado. Tenemos que mirar la matriz modelo para poder digerir completamente esto.

Supongamos que estamos interesados ​​en un modelo con dos factores: ~ f + g (las covariables numéricas no importan, por lo que no incluyo ninguna de ellas; la respuesta no aparece en la matriz del modelo, así que suéltela también). Considere el siguiente ejemplo reproducible:

set.seed(0) f <- sample(gl(3, 4, labels = letters[1:3])) # [1] c a a b b a c b c b a c #Levels: a b c g <- sample(gl(3, 4, labels = LETTERS[1:3])) # [1] A B A B C B C A C C A B #Levels: A B C

Comenzamos con una matriz modelo sin contrastes en absoluto:

X0 <- model.matrix(~ f + g, contrasts.arg = list( f = contr.treatment(n = 3, contrasts = FALSE), g = contr.treatment(n = 3, contrasts = FALSE))) # (Intercept) f1 f2 f3 g1 g2 g3 #1 1 0 0 1 1 0 0 #2 1 1 0 0 0 1 0 #3 1 1 0 0 1 0 0 #4 1 0 1 0 0 1 0 #5 1 0 1 0 0 0 1 #6 1 1 0 0 0 1 0 #7 1 0 0 1 0 0 1 #8 1 0 1 0 1 0 0 #9 1 0 0 1 0 0 1 #10 1 0 1 0 0 0 1 #11 1 1 0 0 1 0 0 #12 1 0 0 1 0 1 0

Tenga en cuenta que tenemos:

unname( rowSums(X0[, c("f1", "f2", "f3")]) ) # [1] 1 1 1 1 1 1 1 1 1 1 1 1 unname( rowSums(X0[, c("g1", "g2", "g3")]) ) # [1] 1 1 1 1 1 1 1 1 1 1 1 1

Entonces span{f1, f2, f3} = span{g1, g2, g3} = span{(Intercept)} . En esta especificación completa, 2 columnas no son identificables. X0 tendrá un rango de columna 1 + 3 + 3 - 2 = 5 :

qr(X0)$rank # [1] 5

Entonces, si ajustamos un modelo lineal con este X0 , 2 coeficientes de 7 parámetros serán NA :

y <- rnorm(12) ## random `y` as a response lm(y ~ X - 1) ## drop intercept as `X` has intercept already #X0(Intercept) X0f1 X0f2 X0f3 X0g1 # 0.32118 0.05039 -0.22184 NA -0.92868 # X0g2 X0g3 # -0.48809 NA

Lo que esto realmente implica es que tenemos que agregar 2 restricciones lineales en 7 parámetros, para obtener un modelo de rango completo. Realmente no importa cuáles son estas 2 restricciones, pero debe haber 2 restricciones linealmente independientes. Por ejemplo, podemos hacer cualquiera de los siguientes:

  • soltar 2 columnas de X0 ;
  • agregue dos restricciones de suma a cero en los parámetros, como si requiriéramos coeficientes para f1 , f2 y f3 suma a 0, y lo mismo para g1 , g2 y g3 .
  • use la regularización, por ejemplo, agregando penalización de cresta a f y g .

Tenga en cuenta que estas tres formas terminan con tres soluciones diferentes:

  • contrastes
  • mínimos cuadrados restringidos;
  • modelos lineales mixtos o mínimos cuadrados penalizados.

Los dos primeros todavía están dentro del alcance del modelado de efectos fijos. Por "contrastes", reducimos el número de parámetros hasta obtener una matriz de modelo de rango completo; mientras que los otros dos no reducen el número de parámetros, sino que efectivamente reducen el grado efectivo de libertad.

Ahora, ciertamente buscas la forma de "contrastes". Entonces, recuerde, tenemos que soltar 2 columnas. Ellos pueden ser

  • una columna de f y una columna de g , dando a un modelo ~ f + g , con f y g contraste;
  • interceptar, y una columna de f o g , dando a un modelo ~ f + g - 1 .

Ahora debe tener claro que, en el marco de la caída de columnas, no hay forma de que pueda obtener lo que desea, porque espera soltar solo 1 columna. La matriz del modelo resultante seguirá siendo deficiente en rango.

Si realmente desea tener todos los coeficientes allí, use mínimos cuadrados restringidos o regresión penalizada / modelos mixtos lineales.

Ahora, cuando tenemos interacción de factores, las cosas son más complicadas pero la idea sigue siendo la misma. Pero dado que mi respuesta ya es lo suficientemente larga, no quiero continuar.