¿Cómo aplicar el término coeficiente para factores y términos interactivos en una ecuación lineal?

9

Usando R, he ajustado un modelo lineal para una variable de respuesta única a partir de una combinación de predictores continuos y discretos. Esto es súper básico, pero tengo problemas para comprender cómo funciona un coeficiente para un factor discreto.

Concepto: Obviamente, el coeficiente de la variable continua 'x' se aplica en la forma, y = coefx(varx) + interceptpero ¿cómo funciona eso para un factor z si el factor no es numérico?y = coefx(varx) + coefz(factorz???) + intercept

Específico: He ajustado un modelo en R como lm(log(c) ~ log(d) + h + a + f + h:a)donde hy fson factores discretos, no numéricos. Los coeficientes son:

Coefficients:
              Estimate 
(Intercept)  -0.679695 
log(d)        1.791294 
h1            0.870735  
h2           -0.447570  
h3            0.542033   
a             0.037362  
f1           -0.588362  
f2            0.816825 
f3            0.534440
h1:a         -0.085658
h2:a         -0.034970 
h3:a         -0.040637

¿Cómo los uso para crear la ecuación predictiva?

log(c) =  1.791294(log(d)) + 0.037362(a) + h??? + f???? + h:a???? + -0.679695

¿O lo estoy haciendo mal?

Creo que ese concepto es si el sujeto cae en categoría h1y f2la ecuación se convierte en:

log(c) =  1.791294(log(d)) + 0.037362(a) +  0.870735  + 0.816825  + h:a???? + -0.679695

Pero realmente no tengo claro cómo h:ase analiza el término interactivo. Gracias por ser fácil conmigo.

Árboles4el bosque
fuente

Respuestas:

14

Este no es un problema específico de R. R utiliza una visualización convencional de coeficientes.

Cuando lee dicha salida de regresión (en un documento, libro de texto o software estadístico), necesita saber qué variables son "continuas" y cuáles son "categóricas":

  • Los "continuos" son explícitamente numéricos y sus valores numéricos se usaron tal cual en el ajuste de regresión.

  • Las variables "categóricas" pueden ser de cualquier tipo, ¡ incluidas las que son numéricas! Lo que los hace categóricos es que el software los trató como "factores": es decir, cada valor distinto que se encuentra se considera un indicador de algo distinto.

    La mayoría del software tratará los valores no numéricos (como las cadenas) como factores. Se puede persuadir a la mayoría del software para que también trate los valores numéricos como factores. Por ejemplo, un código de servicio postal (código postal en los EE. UU.) Parece un número, pero realmente es solo un código para un conjunto de buzones; ¡No tendría sentido sumar, restar y multiplicar códigos postales por otros números! (Esta flexibilidad es la fuente de un error común: si no tiene cuidado, o no lo sabe, su software puede tratar una variable que considera categórica como continua, o viceversa. ¡Tenga cuidado!)

    Sin embargo, las variables categóricas deben representarse de alguna manera como números para aplicar los algoritmos de ajuste. Hay muchas formas de codificarlos . Los códigos se crean utilizando "variables ficticias". Obtenga más información sobre la codificación de variables ficticias buscando en este sitio; Los detalles no importan aquí.

En la pregunta nos dicen eso hy fsomos valores categóricos ("discretos"). Por defecto, log(d)y ason continuos. Eso es todo lo que necesitamos saber. El modelo es

y=0.679695+1.791294 log(d)+0.870735 if h=h10.447570 if h=h2+0.542033 if h=h3+0.037362 a0.588362 if f=f1+0.816825 if f=f2+0.534440 if f=f30.085658 a if h=h10.034970 a if h=h20.040637 a if h=h3

Las reglas aplicadas aquí son:

  • El término "intercepción", si aparece, es una constante aditiva (primera línea).

  • Las variables continuas se multiplican por sus coeficientes, incluso en "interacciones" como el h1:a, h2:ay h3:atérminos. (Esto responde a la pregunta original).

  • Cualquier variable categórica (o factor) se incluye solo para los casos en que aparece el valor de ese factor.

log(d)=2h=h3a=1f=f2

y^=0.6797+1.7913×(2)+0.5420+0.0374×(1)+0.81680.0406×(1).

hh1h2h3(0.870735,0.447570,0.542033)h(0.085658,0.034970,0.040637)ah:aInteracción; de manera similar, solo se aplica un coeficiente fen cualquier caso particular.

whuber
fuente
8

Esto es solo un comentario, pero no cabe como tal en los cuadros de edición limitada que tenemos a nuestra disposición.

LATEX

Simulemos algunos datos primero,

n <- 200
x1 <- runif(n)
x2 <- runif(n)
x3 <- runif(n)
g1 <- gl(2, 100, n, labels=letters[1:2])
g2 <- cut2(runif(n), g=4)
y <- x1 + x2 + rnorm(200)

luego ajusta un modelo de regresión,

f <- ols(y ~ x1 + x2 + x3 + g1 + g2 + x1:g1)

que produce los siguientes resultados:

Linear Regression Model

ols(formula = y ~ x1 + x2 + x3 + g1 + g2 + x1:g1)

                Model Likelihood     Discrimination    
                   Ratio Test           Indexes        
Obs      200    LR chi2     35.22    R2       0.161    
sigma 0.9887    d.f.            8    R2 adj   0.126    
d.f.     191    Pr(> chi2) 0.0000    g        0.487    

Residuals

    Min      1Q  Median      3Q     Max 
-3.1642 -0.7109  0.1015  0.7363  2.7342 

                   Coef    S.E.   t     Pr(>|t|)
Intercept           0.0540 0.2932  0.18 0.8541  
x1                  1.1414 0.3642  3.13 0.0020  
x2                  0.8546 0.2331  3.67 0.0003  
x3                 -0.0048 0.2472 -0.02 0.9844  
g1=b                0.2099 0.2895  0.73 0.4692  
g2=[0.23278,0.553)  0.0609 0.1988  0.31 0.7598  
g2=[0.55315,0.777) -0.2615 0.1987 -1.32 0.1896  
g2=[0.77742,0.985] -0.2107 0.1986 -1.06 0.2901  
x1 * g1=b          -0.2354 0.5020 -0.47 0.6396  

Luego, para imprimir la ecuación de regresión correspondiente, simplemente use la latexfunción genérica , como esta:

latex(f)

Al convertir el dvi a png, deberías obtener algo así

ingrese la descripción de la imagen aquí

En mi opinión, esto tiene el mérito de mostrar cómo calcular los valores pronosticados en función de los valores reales o elegidos para los predictores numéricos y categóricos. Para este último, los niveles de factor se indican entre paréntesis cerca del coeficiente correspondiente.

chl
fuente
1
+0.2099013{b}g1{b}g1=bbb01
1
@whuber La imagen de arriba se ha recortado pero hay una especie de nota al pie que recuerda que "{c} = 1 si el sujeto está en el grupo c, 0 de lo contrario" (la elección de cpuede ser confusa en este caso particular, porque elijo dos letras para representan niveles de g1, pero por lo general es bastante intuitivo, y eso es texto puro, por lo que aún podemos editar el archivo fuente después). Adjunto hay otro resumen donde lo modifiqué g1para que ahora sea un factor de cuatro niveles. Sin embargo, con 0/1 etiquetas que podrían ser más confusas .
chl
5

Puede comprobar que sus "contrastes" son los predeterminados options()y buscando:

$contrasts
        unordered           ordered 
"contr.treatment"      "contr.poly" 

Si sus contrastes desordenados se establecen como contr.treatment(como deberían ser a menos que los haya cambiado), entonces el primer nivel de cada uno de sus factores se establecerá como una línea de base. Solo se le darán estimaciones para los coeficientes frente a las variables ficticias creadas para otros niveles del factor. En efecto, esos coeficientes serán "cuán diferente en promedio es la variable de respuesta en este nivel del factor, en comparación con el nivel de referencia del factor, habiendo controlado todo lo demás en el modelo".

Supongo que de su salida hay un h0y f0cuáles son los niveles de referencia para h y f (a menos que tenga una opción no predeterminada para contrastes, en cuyo caso hay varias posibilidades; intente ?contr.treatmentobtener ayuda).

Es similar con la interacción. Si mi párrafo anterior es correcto, la estimación dada aserá realmente la pendiente de acuándo h=h0. Las estimaciones dadas en el resumen que se aplican a las interacciones son cuánto cambia esa pendiente para diferentes niveles de h.

Entonces, en su ejemplo donde h = h1 yf = f2, intente:

log(c) =  1.791294(log(d)) + (0.037362 - 0.085658) (a) +  0.870735  + 0.816825  -0.679695

Ah, y también puedes predict()hacer muchas cosas útiles ... si realmente quieres predecir algo (en lugar de escribir la ecuación para un informe). Intenta ?predict.lmver qué le predict()hace a un objeto creado por lm.

Peter Ellis
fuente
+1 (en realidad, voté por esto hace un mes y estoy volviendo a releerlo ahora) de todos modos, se me ocurre que recomiendas verificar el tipo de contraste options(). Tendrás que desplazarte por un montón de basura para encontrar lo que necesitas. Puede intentarlo options()$contrasts, que solo generará lo que desea.
gung - Restablecer Monica
buena sugerencia, mi cerebro debe haber estado dormido.
Peter Ellis
Sabes, a menudo respondo preguntas de CV justo antes de irme a la cama ...
gung - Vuelva a instalar a Monica