Calcola manualmente i valori stimati di un'interazione di regressione da un output di regressione

Aug 21 2020

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= Noe 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_yesviene 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.2767come 52.4000 + -0.1233è uguale a.

Come calcolo, a mano, il valore previsto della X_yes.M_yescategoria?

Ecco i valori previsti generati dalla predictfunzione 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

3 StatsStudent Aug 21 2020 at 12:16

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 Rcodifica i tuoi valori Sì / No categoriali / binari nelle tue variabili$X$ e $M$. Per impostazione predefinita, Rcodificherà 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
.
.
.