Comprender la creación de variables ficticias (manuales o automatizadas) en GLM

13

Si se usa una variable de factor (por ejemplo, género con los niveles M y F) en la fórmula glm, se crean variables ficticias, y se pueden encontrar en el resumen del modelo glm junto con sus coeficientes asociados (por ejemplo, genderM)

Si, en lugar de confiar en R para dividir el factor de esta manera, el factor se codifica en una serie de variables numéricas 0/1 (por ejemplo, genderM (1 para M, 0 para F), genderF (1 para F, 0 para M) y estas variables se usan como variables numéricas en la fórmula glm, ¿el resultado del coeficiente sería diferente?

Básicamente, la pregunta es: ¿utiliza R un cálculo de coeficiente diferente cuando trabaja con variables de factores versus variables numéricas?

Pregunta de seguimiento (posiblemente respondida por lo anterior): además de la eficiencia de dejar que R cree variables ficticias, ¿hay algún problema con la codificación de factores como una serie de variables numéricas 0,1 y con el uso de las del modelo?

Bryan
fuente
2
Los coeficientes serán los mismos, la codificación predeterminada de R para los factores es exactamente como la describió (esto se denomina codificación "ficticia"). Si hace esto manualmente, deberá conocer la "trampa de variable ficticia": no puede incluir todas las variables creadas, pero solo puede incluir (alternativamente, excluir la intercepción); de lo contrario, su modelo está sobreidentificado. También hay otros métodos para codificar variables de factores. NN1
Affine
@Affine, supongo que si alimentara tanto en genderM como genderF, uno de ellos devolvería NA para los coeficientes (con el mensaje de que una variable fue excluida debido a singularidades). Esto tiene sentido porque están perfectamente relacionados linealmente en este caso. Pero usted dice que no puedo incluir todos los N; ¿eso significa que, aunque genderF esté configurado en NA, daría lugar a diferencias / problemas para el coeficiente genderM? O, más simplemente, si GLM / LM excluye variables debido a singularidades, ¿es un problema utilizar un modelo sobreidentificado? (Estoy de acuerdo con su punto, solo preguntando las ramificaciones prácticas)
Bryan

Respuestas:

22

Las variables categóricas (llamadas " factores " en R) deben representarse mediante códigos numéricos en modelos de regresión múltiple. Hay muchas maneras posibles de construir códigos numéricos de manera apropiada (vea esta gran lista en el sitio de ayuda de estadísticas de UCLA). De manera predeterminada, R usa la codificación de nivel de referencia (que R llama "contr.treatment"), y que es prácticamente la estadística predeterminada. Esto se puede cambiar para todos los contrastes para toda su sesión de R usando las opciones? O para análisis / variables específicas usando ? Contrastes o ? C (tenga en cuenta el capital). Si necesita más información sobre la codificación del nivel de referencia, lo explico aquí: Regresión basada, por ejemplo, en los días de la semana..

Algunas personas encuentran confusa la codificación de nivel de referencia, y no tiene que usarla. Si lo desea, puede tener dos variables para hombre y mujer; esto se llama nivel significa codificación. Sin embargo, si hace eso, tendrá que suprimir la intersección o la matriz del modelo será singular y la regresión no puede ajustarse como @Affine observa arriba y como explico aquí: la codificación de variables cualitativas conduce a singularidades . Para suprimir la intersección, modifique su fórmula agregando -1o +0como así: y~... -1o y~... +0.

El uso de nivel significa codificación en lugar de codificación de nivel de referencia cambiará los coeficientes estimados y el significado de las pruebas de hipótesis que se imprimen con su salida. Cuando tiene un factor de dos niveles (p. Ej., Masculino frente a femenino) y utiliza una codificación de nivel de referencia, verá la intercepción llamada (constant)y solo una variable listada en la salida (tal vez sexM). La intersección es la media del grupo de referencia (quizás las mujeres) y sexMes la diferencia entre la media de los hombres y la media de las mujeres. El valor p asociado con la intersección es una prueba una muestra de si el nivel de referencia tiene una media de y el valor p asociado cont0sexMle dice si los sexos difieren en su respuesta. Pero si utiliza la codificación de nivel significa, tendrá dos variables enumeradas y cada valor p corresponderá a una prueba una muestra de si la media de ese nivel es . Es decir, ninguno de los valores p será una prueba de si los sexos difieren. t0

set.seed(1)
y    = c(    rnorm(30), rnorm(30, mean=1)         )
sex  = rep(c("Female",  "Male"          ), each=30)
fem  = ifelse(sex=="Female", 1, 0)
male = ifelse(sex=="Male", 1, 0)

ref.level.coding.model   = lm(y~sex)
level.means.coding.model = lm(y~fem+male+0)

summary(ref.level.coding.model)
# ...
# Coefficients:
#             Estimate Std. Error t value Pr(>|t|)    
# (Intercept)  0.08246    0.15740   0.524    0.602    
# sexMale      1.05032    0.22260   4.718 1.54e-05 ***
#   ---
#   Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
# ...
summary(level.means.coding.model)
# ...
# Coefficients:
#      Estimate Std. Error t value Pr(>|t|)    
# fem   0.08246    0.15740   0.524    0.602    
# male  1.13277    0.15740   7.197 1.37e-09 ***
#   ---
#   Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
# ...
gung - Restablece a Monica
fuente
1
Gracias por la adición del código: esto demuestra claramente que la intercepción en la codificación de la celda de referencia = sexFemale en la celda significa la codificación (también estaba confundido por "lo que sucedió" con la variable N-1 ...) Tal vez necesite otra pregunta, pero Esto es fácil de entender con una variable, ¿qué pasa con 2 o más? por ejemplo, edad: "viejo", "joven". En la codificación de la celda de referencia, ¿se mostrarían los coeficientes para sexMale, ageYoung (por ejemplo) y la cuenta de intercepción para AMBOS sexFemale y ageOld?
Bryan
1
Si tiene un factor con 3 niveles, la intersección es la media del nivel de referencia, y los otros 2 estarán representados en la salida. Sus coeficientes serán la diferencia entre ellos y el nivel de referencia y su ps será el significado de esas diferencias. Si tiene 2 factores, ambos tendrán niveles de referencia, y la intersección será la media de las personas que se encuentran en ambos grupos de referencia (por ejemplo, young F) y los otros niveles serán diferentes del nivel dado del factor 1 w / el nivel de referencia del otro factor y el grupo de ambos niveles de referencia. Por ejemplo, oldes old F- `joven F , & M` es young M- young F.
gung - Restablece a Monica
1
Jugué un poco con esto y experimenté una R^2diferencia sustancial entre ambos enfoques. Sé que es solo un R^2, pero ¿hay alguna explicación para eso?
hans0l0
@ hans0l0, no tengo idea. No debería haber diferencia.
gung - Restablece a Monica
1
@confused, puedes encontrar eso en la documentación,? glm .
Gung - Reinstale a Monica
2

Los coeficientes estimados serían los mismos sujetos a la condición en la que crea sus variables ficticias (es decir, las numéricas) consistentes con R. Por ejemplo: creemos datos falsos y ajustemos un factor de uso de Poisson glm. Tenga en cuenta que la glfunción crea una variable de factor.

> counts <- c(18,17,15,20,10,20,25,13,12)
> outcome <- gl(3,1,9)
> outcome
[1] 1 2 3 1 2 3 1 2 3
Levels: 1 2 3
> class(outcome)
[1] "factor"
> glm.1<- glm(counts ~ outcome, family = poisson())
> summary(glm.1)

Call:
glm(formula = counts ~ outcome, family = poisson())

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-0.9666  -0.6713  -0.1696   0.8471   1.0494  

Coefficients:
            Estimate Std. Error z value Pr(>|z|)    
(Intercept)   3.0445     0.1260  24.165   <2e-16 ***
outcome2     -0.4543     0.2022  -2.247   0.0246 *  
outcome3     -0.2930     0.1927  -1.520   0.1285    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1

(Dispersion parameter for poisson family taken to be 1)

    Null deviance: 10.5814  on 8  degrees of freedom
Residual deviance:  5.1291  on 6  degrees of freedom
AIC: 52.761

Number of Fisher Scoring iterations: 4

Como el resultado tiene tres niveles, creo dos variables ficticias (ficticio.1 = 0 si el resultado = 2 y ficticio.2 = 1 si el resultado = 3) y lo reacondiciono usando estos valores numéricos:

> dummy.1=rep(0,9)
> dummy.2=rep(0,9)
> dummy.1[outcome==2]=1
> dummy.2[outcome==3]=1
> glm.2<- glm(counts ~ dummy.1+dummy.2, family = poisson())
> summary(glm.2)

Call:
glm(formula = counts ~ dummy.1 + dummy.2, family = poisson())

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-0.9666  -0.6713  -0.1696   0.8471   1.0494  

Coefficients:
            Estimate Std. Error z value Pr(>|z|)    
(Intercept)   3.0445     0.1260  24.165   <2e-16 ***
dummy.1      -0.4543     0.2022  -2.247   0.0246 *  
dummy.2      -0.2930     0.1927  -1.520   0.1285    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1

(Dispersion parameter for poisson family taken to be 1)

    Null deviance: 10.5814  on 8  degrees of freedom
Residual deviance:  5.1291  on 6  degrees of freedom
AIC: 52.761

Number of Fisher Scoring iterations: 4

Como puede ver, los coeficientes estimados son los mismos. Pero debe tener cuidado al crear sus variables ficticias si desea obtener el mismo resultado. Por ejemplo, si creo dos variables ficticias como (ficticio.1 = 0 si resultado = 1 y ficticio.2 = 1 si resultado = 2), los resultados estimados son diferentes de la siguiente manera:

> dummy.1=rep(0,9)
> dummy.2=rep(0,9)
> dummy.1[outcome==1]=1
> dummy.2[outcome==2]=1
> glm.3<- glm(counts ~ dummy.1+dummy.2, family = poisson())
> summary(glm.3)

Call:
glm(formula = counts ~ dummy.1 + dummy.2, family = poisson())

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-0.9666  -0.6713  -0.1696   0.8471   1.0494  

Coefficients:
            Estimate Std. Error z value Pr(>|z|)    
(Intercept)   2.7515     0.1459   18.86   <2e-16 ***
dummy.1       0.2930     0.1927    1.52    0.128    
dummy.2      -0.1613     0.2151   -0.75    0.453    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1

(Dispersion parameter for poisson family taken to be 1)

    Null deviance: 10.5814  on 8  degrees of freedom
Residual deviance:  5.1291  on 6  degrees of freedom
AIC: 52.761

Number of Fisher Scoring iterations: 4

Esto se debe a que cuando agrega outcomevariables en glm.1, R por defecto crea dos variables ficticias, a saber, outcome2y outcome3y las define de manera similar a dummy.1y dummy.2en glm.2, es decir, el primer nivel de resultado es cuando todas las demás variables ficticias ( outcome2y outcome3) están configuradas para ser cero.

Stat
fuente
Gracias por la prueba de código de los coeficientes estimados que son los mismos. También es útil la advertencia de crear la mía propia: quería crear la mía propia porque una variable modelo se vincularía directamente a una columna de la base de datos por su nombre (lo que podría ser útil en sentido descendente), pero parece que necesito entender los problemas con la forma Voy a hacer esto.
Bryan