Calcular, a mano, valores ajustados de una interacción de regresión a partir de un resultado de regresión
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= No
y 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_yes
se 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.2767
como 52.4000 + -0.1233
es igual a.
¿Cómo calculo, a mano, el valor previsto de la X_yes.M_yes
categoría?
Aquí están los valores predichos generados a partir de la predict
funció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
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 R
se codifican sus valores categóricos / binarios Sí / No en sus variables$X$ y $M$. Por defecto, R
codificará 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
.
.
.