Regresión múltiple con predictores categóricos y numéricos.

11

Soy relativamente nuevo en R, y estoy tratando de ajustar un modelo a los datos que consisten en una columna categórica y una columna numérica (entera). La variable dependiente es un número continuo.

Los datos tienen el siguiente formato:

predCateg, predIntNum, ResponseVar

Los datos se parecen a esto:

ranking, age_in_years, wealth_indicator
category_A, 99, 1234.56
category_A, 21, 12.34
category_A, 42, 234.56
....
category_N, 105, 77.27

¿Cómo modelaría esto (presumiblemente, usando un GLM), en R?

[[Editar]]

Se me acaba de ocurrir (después de analizar los datos más a fondo) que la variable independiente categórica está de hecho ordenada. Por lo tanto, he modificado la respuesta proporcionada anteriormente de la siguiente manera:

> fit2 <- glm(wealth_indicator ~ ordered(ranking) + age_in_years, data=amort2)
> 
> fit2

Call:  glm(formula = wealth_indicator ~ ordered(ranking) + age_in_years, 
    data = amort2)

Coefficients:
      (Intercept)  ordered(ranking).L  ordered(ranking).Q  ordered(ranking).C      age_in_years  
        0.0578500         -0.0055454         -0.0013000          0.0007603          0.0036818  

Degrees of Freedom: 39 Total (i.e. Null);  35 Residual
Null Deviance:      0.004924 
Residual Deviance: 0.00012      AIC: -383.2
> 
> fit3 <- glm(wealth_indicator ~ ordered(ranking) + age_in_years + ordered(ranking)*age_in_years, data=amort2)
> fit3

Call:  glm(formula = wealth_indicator ~ ordered(ranking) + age_in_years + 
    ordered(ranking) * age_in_years, data = amort2)

Coefficients:
                    (Intercept)                ordered(ranking).L                ordered(ranking).Q  
                      0.0578500                       -0.0018932                       -0.0039667  
              ordered(ranking).C                    age_in_years  ordered(ranking).L:age_in_years  
                      0.0021019                        0.0036818                       -0.0006640  
ordered(ranking).Q:age_in_years  ordered(ranking).C:age_in_years  
                      0.0004848                       -0.0002439  

Degrees of Freedom: 39 Total (i.e. Null);  32 Residual
Null Deviance:      0.004924 
Residual Deviance: 5.931e-05    AIC: -405.4

Estoy un poco confundido por lo que ordered(ranking).C, ordered(ranking).Qy ordered(ranking).Lmedia en la salida, y agradecería un poco de ayuda en la comprensión de esta salida, y cómo lo uso para predecir la variable de respuesta.

Homunculus Reticulli
fuente

Respuestas:

11

Prueba esto:

fit <- glm(wealth_indicator ~ 
           factor(ranking) + age_in_years + factor(ranking) * age_in_years)

El factor()comando se asegurará de que R sepa que su variable es categórica. Esto es especialmente útil si sus categorías están indicadas por enteros; de lo contrario, glm interpretará la variable como continua.

El factor(ranking) * age_in_yearstérmino le permite a R saber que desea incluir el término de interacción.

P Schnell
fuente
1
¿Por qué factor(ranking)no as.factor(ranking)?
Peter Flom
1
Lo uso habitualmente factor(x)para poder incluir el levelsargumento si lo deseo. También puede usarlo as.factor(x)si lo desea, y de hecho puede ser más rápido, pero creo que necesitaría un conjunto de datos bastante grande para que la velocidad de estas funciones sea importante.
P Schnell
@PSchnell +1 para una respuesta concisa y una buena explicación. Sin embargo, una cosa es que me he dado cuenta de que el factor está ordenado. Modifiqué un poco la fórmula que proporcionó para reflejar el hecho de esto (consulte mi pregunta editada). Sin embargo, no estoy seguro de entender el resultado del modelo (específicamente ordered(ranking).C, ordered(ranking).Qy ordered(ranking).L, ¿qué significan y cómo lo uso para predecir la variable de respuesta?), Cualquier ayuda será muy apreciada. Gracias
Homunculus Reticulli
1
.L,, .Qy .Cson, respectivamente, los coeficientes para el factor ordenado codificado con contrastes lineales, cuadráticos y cúbicos. El comando contr.poly(4)le mostrará la matriz de contraste para un factor ordenado con 4 niveles (3 grados de libertad, razón por la cual obtiene un polinomio de tercer orden). contr.poly(4)[2, '.L']le dirá qué conectar para el segundo nivel ordenado en el término lineal. Tenga en cuenta que esto supone que tiene sentido considerar los niveles como igualmente espaciados. Si no es así, codifique su propia matriz de contraste.
P Schnell
2
De acuerdo con ats.ucla.edu/stat/r/library/contrast_coding.htm#ORTHOGONAL , en R, cuando una variable continua se modela en respuesta a una variable de factor ordenado, el contraste predeterminado aplicado es la codificación polinómica ortogonal onlinecourses.science.psu .edu / stat502 / node / 203 . stats.stackexchange.com/a/206345/90600 tiene una explicación bastante extensa. stats.stackexchange.com/a/207128/90600 va aún más allá .
Paul de Barros
2

Recientemente respondí Variable dependiente continua con variable ordinal independiente , recomendando la ordSmoothfunción en el ordPenspaquete. Utiliza la regresión penalizada para suavizar los coeficientes ficticios en los niveles de una variable ordinal para que no varíen demasiado de un nivel a otro. Por ejemplo, probablemente no desee que category_Ael coeficiente sea mucho más diferente de category_Bque de category_N. Probablemente desee que los coeficientes aumenten o disminuyan monotónicamente, o al menos cambien gradualmente entre los rangos. Mi respuesta a la pregunta vinculada enumera referencias para obtener más información.

ordSmoothtambién puede acomodar variables continuas (y nominales); en su caso, el código podría ser:

SmoothFit=with(amort2,
ordSmooth(as.numeric(ordered(ranking)),wealth_indicator,z=age_in_years,lambda=.001))

ordSmoothrequiere entrada numérica para datos ordinales, de ahí el as.numeric(ordered())formateo. zes para un vector numérico / matriz / data.framede predictores continuos. lambdaes el coeficiente de suavizado: los valores mayores empujarán sus coeficientes más cerca de cero. Puede ser prudente comenzar de a poco aquí. La impresión SmoothFitle dará coeficientes y valores ajustados, pero me temo que le deja el resto a usted.

En su método, los coeficientes ordered(ranking).C/ .Q/ .Lparecen estar etiquetados como cúbicos, cuadráticos y lineales, respectivamente. Si lo intentas glm(rnorm(10)~ordered(rep(1:5,2))), también obtendrás un coeficiente ordered(rep(1:5, 2))^4. No estoy realmente seguro de por qué estos se denotan con exponentes; No creo que los esté modelando como términos polinómicos, porque los coeficientes son diferentes glm(y~x+I(x^2)+I(x^3)+I(x^4))y las variantes escaladas de esto. Deben ser códigos ficticios básicos .

Nick Stauner
fuente