Calcola manualmente i valori stimati di un'interazione di regressione da un output di regressione
Sto lavorando con un modello di interazione simile a questo di seguito:
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
Sto imparando a calcolare il valore adattato di un'interazione da una tabella di regressione. Nell'esempio, la categoria di base (o la categoria omessa) è x= No
e moderating = No
.
Finora so come calcolare i seguenti valori stimati:
#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 #<- ?
Solo non capisco come X_yes.M_yes
viene calcolata la categoria finale ,,. I miei pensieri iniziali erano X_yes.M_yes <- 52.4000 + -0.1233
, (l'intercetta più il termine di interazione) ma non è corretto. So che la sua causa non corretta, usando la funzione, il valore stimato di prevedere X_yes.M_yes = 49.29032
, non 52.2767
come 52.4000 + -0.1233
è uguale a.
Come calcolo, a mano, il valore previsto della X_yes.M_yes
categoria?
Ecco i valori previsti generati dalla predict
funzione in 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
Risposte
Nei modelli con termini di interazione, penso che sia sempre istruttivo scrivere il modello di regressione con cui stai lavorando. Indichiamo i tuoi valori "X" a$X$ e come chiami il tuo "moderatore" $M$. In questo caso, il modello è scritto come:
$\hat{Y} = \hat{\beta_0}+X\hat{\beta_1}+M\hat{\beta_2}+XM\hat{\beta_{3}}$
Dai tuoi risultati in R
, questo diventa:
$\hat{Y} = 52.4000+X8.4571-M11.4435-XM0.1233$
Ora, devi capire come R
codifica i tuoi valori Sì / No categoriali / binari nelle tue variabili$X$ e $M$. Per impostazione predefinita, R
codificherà il tuo$X$ valori come segue (in ordine lessicografico):
\ begin {eqnarray *} X & = & \ begin {cases} 1 & \ text {if X is Yes} \\ 0 & \ text {if X is No} \ end {cases} \ end {eqnarray *}
e
R
codificherà in modo simile il tuo $M$valori come: \ begin {eqnarray *} M & = & \ begin {cases} 1 & \ text {if Moderator is Yes} \\ 0 & \ text {if Moderator is No} \ end {cases} \ end {eqnarray * }
Quindi, come hai correttamente identificato, se $X$ è Sì, e $M$ è No, l'equazione di regressione sopra diventa:
$\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*}$
Ora, nel caso in cui Both $X$ è Sì, e $M$ è Sì, i valori codificati di entrambi $X$ e $M$ sono uguali a 1 e l'equazione di regressione diventa:
$\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*}$
e quest'ultimo termine è quello che cerchi dove hai scritto
X_yes.M_yes #<- ?
NOTA:
Una cosa da notare come menzionato da @Roland, tutto ciò che ho scritto sopra presuppone che tu stia utilizzando la codifica predefinita in R per le variabili binarie. Per impostazione predefinita, R codifica i tuoi valori "Sì" come 1 e i tuoi valori "No" come 0 come ho detto in precedenza (0 è usato per No in questo caso perché è il primo livello della variabile fattore in ordine lessicografico). Tuttavia, ci sono schemi di codifica alternativi che possono essere usati (es. Sì = 1 e No = -1). Ma dal tuo codice R e dall'output, posso dire che stai effettivamente usando la codifica binaria 0/1 come ho fornito nella mia risposta. È possibile verificare che lo schema di codifica 0/1 sia utilizzato nella sessione R immettendo il seguente comando:
model.matrix(Results)
Visualizza la "matrice di progettazione" o la "matrice del modello" e le codifiche "dietro" ciascuna delle tue categorie:
(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
.
.
.