Calcular, a mano, valores ajustados de una interacción de regresión a partir de un resultado de regresión

Aug 21 2020

Estoy trabajando con un modelo de interacción similar al siguiente:

set.seed(1993)

moderating <- sample(c("Yes", "No"),100, replace = T)
x <- sample(c("Yes", "No"), 100, replace = T)
y <- sample(1:100, 100, replace = T)

df <- data.frame(y, x, moderating)

Results <- lm(y ~ x*moderating)
summary(Results)
Call:
lm(formula = y ~ x * moderating)

Residuals:
    Min      1Q  Median      3Q     Max 
-57.857 -29.067   3.043  22.960  59.043 

Coefficients:
                   Estimate Std. Error t value Pr(>|t|)    
(Intercept)         52.4000     6.1639   8.501 2.44e-13 ***
xYes                 8.4571     9.1227   0.927    0.356    
moderatingYes      -11.4435     8.9045  -1.285    0.202    
xYes:moderatingYes  -0.1233    12.4563  -0.010    0.992    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 30.82 on 96 degrees of freedom
Multiple R-squared:  0.04685,   Adjusted R-squared:  0.01707 
F-statistic: 1.573 on 3 and 96 DF,  p-value: 0.2009

Estoy aprendiendo a calcular el valor ajustado de una interacción a partir de una tabla de regresión. En el ejemplo, la categoría base (o la categoría omitida) es x= Noy moderating = No.

Hasta ahora, sé cómo calcular los siguientes valores ajustados:

#Calulate Fitted Value From a Regression Interaction by hand
#Omitted Variable = X_no.M_no

X_no.M_no <- 52.4000
X_yes.M_no <- 52.4000 + 8.4571 
X_no.M_yes <- 52.4000 + -11.4435
X_yes.M_yes #<- ?

Simplemente no entiendo cómo X_yes.M_yesse calcula la categoría final . Mis pensamientos iniciales fueron X_yes.M_yes <- 52.4000 + -0.1233, (la intersección más el término de interacción) pero eso es incorrecto. Sé que es incorrecto porque, usando la función de predicción, el valor ajustado de X_yes.M_yes = 49.29032, no 52.2767como 52.4000 + -0.1233es igual a.

¿Cómo calculo, a mano, el valor previsto de la X_yes.M_yescategoría?

Aquí están los valores predichos generados a partir de la predictfunción en R

#Validated Here Using the Predict Function:
newdat <- NULL
for(m in na.omit(unique(df$moderating))){ for(i in na.omit(unique(df$x))){
    moderating <- m
    x <- i
    
    newdat<- rbind(newdat, data.frame(x, moderating))
    
  }
}

Prediction.1 <- cbind(newdat, predict(Results, newdat, se.fit = TRUE))
Prediction.1

Respuestas

3 StatsStudent Aug 21 2020 at 12:16

En modelos con términos de interacción, creo que siempre es instructivo escribir el modelo de regresión con el que está trabajando. Denotemos sus valores "X" a$X$ y lo que llama su "moderador" como $M$. En este caso, el modelo se escribe como:

$\hat{Y} = \hat{\beta_0}+X\hat{\beta_1}+M\hat{\beta_2}+XM\hat{\beta_{3}}$

De sus resultados en R, esto se convierte en:

$\hat{Y} = 52.4000+X8.4571-M11.4435-XM0.1233$

Ahora, debe comprender cómo Rse codifican sus valores categóricos / binarios Sí / No en sus variables$X$ y $M$. Por defecto, Rcodificará su$X$ valores de la siguiente manera (en orden lexicográfico):

\ begin {eqnarray *} X & = & \ begin {cases} 1 & \ text {si X es Sí} \\ 0 & \ text {si X es No} \ end {cases} \ end {eqnarray *}

y

R codificará de manera similar su $M$valores como: \ begin {eqnarray *} M & = & \ begin {cases} 1 & \ text {si el moderador es Sí} \\ 0 & \ text {si el moderador es No} \ end {cases} \ end {eqnarray * }

Entonces, como identificó correctamente, si $X$ es sí, y $M$ es No, la ecuación de regresión anterior se convierte en:

$\begin{eqnarray*}\hat{Y} & = & 52.4000+(1)8.4571-(0)11.4435-(1)(0)0.1233 \\ & =& 52.4000+8.4571-(0)-0\\ & =& 52.4000+8.4571 \end{eqnarray*}$

Ahora, en el caso donde Ambos $X$ es sí, y $M$ es Sí, los valores codificados de ambos $X$ y $M$ son iguales a 1 y la ecuación de regresión se convierte en:

$\begin{eqnarray*}\hat{Y} & = & 52.4000+(1)8.4571-(1)11.4435-(1)(1)0.1233 \\ & =& 52.4000+8.4571-11.4435-0.1233\\\end{eqnarray*}$

y este último término es lo que buscas donde escribiste

X_yes.M_yes #<- ?

NOTA:

Una cosa a tener en cuenta, como mencionó @Roland, todo lo que he escrito anteriormente asume que está utilizando la codificación predeterminada en R para variables binarias. Por defecto, R codifica sus valores "Sí" como 1 y sus valores "No" como 0, como mencioné anteriormente (0 se usa para No en este caso porque es el primer nivel de la variable de factor en orden lexicográfico). Sin embargo, existen esquemas de codificación alternativos que se pueden utilizar (por ejemplo, Sí = 1 y No = -1). Pero a partir de su código R y su salida, puedo decir que, de hecho, está utilizando la codificación binaria 0/1 como proporcioné en mi respuesta. Puede verificar que el esquema de codificación 0/1 se esté utilizando en su sesión de R emitiendo el siguiente comando:

model.matrix(Results)

Esto muestra la "matriz de diseño" o la "matriz de modelo" y muestra los códigos "detrás" de cada una de sus categorías:

   (Intercept) xYes moderatingYes xYes:moderatingYes
1             1    1             1                  1
2             1    0             1                  0
3             1    0             1                  0
4             1    1             1                  1
5             1    0             1                  0
6             1    0             1                  0
7             1    1             1                  1
.
.
.