Coeficiente de interpretación en un modelo de regresión lineal con variables categóricas

8

Daré mis ejemplos con llamadas R. Primero, un ejemplo simple de una regresión lineal con una variable dependiente 'vida útil', y dos variables explicativas continuas.

data.frame(height=runif(4000,160,200))->human.life
human.life$weight=runif(4000,50,120)
human.life$lifespan=sample(45:90,4000,replace=TRUE)
summary(lm(lifespan~1+height+weight,data=human.life))

Call:
lm(formula = lifespan ~ 1 + height + weight, data = human.life)

Residuals:
Min       1Q   Median       3Q      Max 
-23.0257 -11.9124  -0.0565  11.3755  23.8591 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept) 63.635709   3.486426  18.252   <2e-16 ***
height       0.007485   0.018665   0.401   0.6884    
weight       0.024544   0.010428   2.354   0.0186 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1 

Residual standard error: 13.41 on 3997 degrees of freedom
Multiple R-squared: 0.001425,   Adjusted R-squared: 0.0009257 
F-statistic: 2.853 on 2 and 3997 DF,  p-value: 0.05781

Para encontrar la estimación de 'vida útil' cuando el valor de 'peso' es 1, agrego (Intercepción) + altura = 63.64319

Ahora, ¿qué pasa si tengo un marco de datos similar, pero uno donde una de las variables explicativas es categórica?

data.frame(animal=rep(c("dog","fox","pig","wolf"),1000))->animal.life
animal.life$weight=runif(4000,8,50)
animal.life$lifespan=sample(1:10,replace=TRUE)
summary(lm(lifespan~1+animal+weight,data=animal.life))

Call:
lm(formula = lifespan ~ 1 + animal + weight, data = animal.life)

Residuals:
Min      1Q  Median      3Q     Max 
-4.7677 -2.7796 -0.1025  3.1972  4.3691 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept) 5.565556   0.145851  38.159  < 2e-16 ***
animalfox   0.806634   0.131198   6.148  8.6e-10 ***
animalpig   0.010635   0.131259   0.081   0.9354    
animalwolf  0.806650   0.131198   6.148  8.6e-10 ***
weight      0.007946   0.003815   2.083   0.0373 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1 

Residual standard error: 2.933 on 3995 degrees of freedom
Multiple R-squared: 0.01933,    Adjusted R-squared: 0.01835 
F-statistic: 19.69 on 4 and 3995 DF,  p-value: 4.625e-16

En este caso, para encontrar la estimación de 'vida útil' cuando el valor de 'peso' es 1, ¿debo agregar cada uno de los coeficientes para 'animal' a la intersección: (Intercepción) + animalfox + animalpig + animalwolf? ¿O cuál es la forma correcta de hacer esto?

Gracias Sverre

Sverre
fuente
los signos de dólar te hacen entrar en un entorno de ecuaciones y es por eso que las cosas se ponen en cursiva al azar.
Macro
formato: para obtener code, sangría por 4 espacios.
wolf.rauch
si usa la sangría de 4 espacios, puede poner estrellas y signos de dólar allí y aparecerán como tales. si los usa fuera del formato del código, se tratarán como marcas. Si no desea una codelínea completa , use las líneas de retroceso:this is code with a $ and *
wolf.rauch
1
Es bueno que hayas usado un ejemplo reproducible. Puede hacer que el ejemplo sea aún mejor si incluye set.seed(1)(o el número que desee) antes de ejecutar la generación de números aleatorios, de modo que todos obtengan exactamente los mismos resultados que usted (aunque no importa mucho en este caso).
wolf.rauch
Solo dos pequeños comentarios. Usted escribió "Para encontrar la estimación de 'vida útil' cuando el valor de 'peso' es 1, agrego (Intercepción) + altura = 63.64319". Tenga en cuenta que esta es la vida útil promedio estimada cuando el peso es = 1 y la altura = 0 . Eso probablemente no sea muy significativo. Además, las predicciones fuera del rango de los valores observados de las variables independientes deben tratarse con precaución (el peso está entre 50 y 120, por lo que el peso = 1 tampoco es muy significativo). Solo algunas notas al margen y probablemente cosas que ya sabías. Pero por si acaso ...
Wolfgang

Respuestas:

12

No, no debes sumar todos los coeficientes juntos. Básicamente tienes el modelo

lifespan=β0+β1fox+β2pig+β3wolf+β4weight+ε

donde, por ejemplo, si el animal era un cerdo y 0 en caso contrario. Entonces, para calcular como ha sugerido para obtener el promedio general cuando es como decir "si fueras un cerdo, un lobo y un zorro y tu peso fuera 1, ¿cuál es tu esperanza de vida esperada?". Claramente, dado que cada animal es solo una de esas cosas, eso no tiene mucho sentido.pig=1β0+β1+β2+β3+β4weight=1

Tendrá que hacer esto por separado para cada animal. Por ejemplo, es la vida útil esperada de un cerdo cuando su peso es 1.β0+β2+β4

Macro
fuente
Macro: entiendo. ¿Tendría sentido, entonces, encontrar el coeficiente promedio para los niveles en 'animal'? En otras palabras, hacer (Interceptar) + (animalfox + animalpig + animalwolf) / 3. ¿O es válido solo cuando hay un número igual de observaciones para cada animal en el conjunto de datos?
Sverre
Creo que tienes razón: eso solo sería válido si hay un número igual en cada grupo. Podría ponderarlos proporcionalmente a la importancia de cada grupo en la muestra si insiste en resumirlo en un número.
Macro
¿Cuál sería la forma correcta de pesarlos? La razón por la que estoy "insistiendo" en resumirlo en un número es porque quiero dibujar la línea de regresión para solo una de las variables en un diagrama de dispersión. Por ejemplo, en el ejemplo de human.life anterior, dibujaría la línea de regresión para 'peso' especificando la intersección de la línea ((Intercepción) + altura = 63.64319) con su coeficiente (0.024544). Eso es un poco más complicado en el caso animal.life.
Sverre
Pensando más en ello, no sé cómo cualquier tipo de promedio sería interpretable. Podrías dibujar tres líneas de regresión paralelas en una parcela, ¿no? Además, me parece que el efecto del "peso" sería diferente para cada animal, en cuyo caso debería tener un animal que interactúe con el peso, lo que llevaría a tres líneas de regresión completamente diferentes para cada animal.
Macro
Pero en un caso donde la variable para 'animal' y la variable para 'peso' son significativas, pero su interacción no lo es, ni siquiera incluiría la interacción en el modelo. La regresión múltiple estima el efecto del 'peso' independientemente de cuál sea el valor para 'animal'.
Sverre
4

Lo más simple es usar la función de predicción en el objeto lm, luego se ocupa de muchos de los detalles, como convertir un factor a los valores correctos para sumarlos. Si está tratando de comprender las piezas que entran en la predicción, configure type='terms'y mostrará las piezas individuales que se suman para hacer su predicción.

Tenga en cuenta también que la forma en que un factor se convierte en variables depende de algunas opciones, el valor predeterminado elegirá un grupo de referencia para comparar los otros grupos, pero también puede establecerlo en un promedio y las diferencias de ese promedio (u otras comparaciones de interés) .

Greg Snow
fuente
Usar predict.lm () es una buena solución para un objeto lm. Desafortunadamente, en realidad estoy ajustando un objeto lmer a mis datos, para lo cual no existe una función predict () que extraiga términos individuales. ¿Comprendí correctamente que el método alternativo que sugiere sugiere que la intersección sea el valor promedio, en lugar de una línea de base (donde todos los predictores continuos se establecen en 0 y se elige un valor de predictores categóricos)? Si es así, me gustaría saber cómo hacerlo. Entonces podría dibujar mi línea de regresión como la intersección del modelo + el coeficiente de mi predictor.
Sverre
Mire “contrastes”, “C”, “contr.sum” y la parte de contrastes de las opciones.
Greg Snow
2

Si desea el promedio de vida útil cuando el peso es 1, entonces puede sacar "animal" en esta llamada:

lm(formula = lifespan ~ 1 + animal + weight, data = animal.life)
Peter Flom
fuente
No entiendo cómo esto puede ser correcto. Si elimino uno de los predictores ('animal'), la intercepción, el coeficiente de 'peso' y el error estiman todos los cambios. Además, no estoy tratando de averiguar cuál es la vida útil promedio real para el peso 1 en los datos, solo cuál es el modelo que predice que debería ser.
Sverre