2009-09-08 11 views
15

Nel tentativo di compilare il tag R qui, sto postando alcune domande che ho ricevuto spesso dagli studenti. Ho sviluppato le mie risposte a questi nel corso degli anni, ma forse ci sono modi migliori di fluttuare che non conosco.Il modo migliore per tracciare gli effetti di interazione da un modello lineare

La domanda: Ho appena eseguito una regressione con continuo y e x ma fattore f (dove levels(f) produce c("level1","level2"))

thelm <- lm(y~x*f,data=thedata) 

Ora vorrei tracciare i valori previsti di y da x suddivisi per gruppi definito da f. Tutte le trame che ottengo sono brutte e mostrano troppe righe.

La mia risposta: Prova la funzione predict().

##restrict prediction to the valid data 
##from the model by using thelm$model rather than thedata 

thedata$yhat <- predict(thelm, 
     newdata=expand.grid(x=range(thelm$model$x), 
          f=levels(thelm$model$f))) 

plot(yhat~x,data=thethedata,subset=f=="level1") 
lines(yhat~x,data=thedata,subset=f=="level2") 

Vi sono altre idee là fuori che sono (1) più facile da capire per un nuovo arrivato e/o (2) meglio da qualche altro punto di vista?

risposta

17

Il pacchetto di effetti ha buoni metodi di plottaggio per visualizzare i valori previsti delle regressioni.

thedata<-data.frame(x=rnorm(20),f=rep(c("level1","level2"),10)) 
thedata$y<-rnorm(20,,3)+thedata$x*(as.numeric(thedata$f)-1) 

library(effects) 
model.lm <- lm(formula=y ~ x*f,data=thedata) 
plot(effect(term="x:f",mod=model.lm,default.levels=20),multiline=TRUE) 
3

Huh - ancora cercando di avvolgere la mia mente intorno expand.grid(). Solo per la causa di paragone, questo è come mi piacerebbe farlo (usando ggplot2):

thedata <- data.frame(predict(thelm), thelm$model$x, thelm$model$f) 

ggplot(thedata, aes(x = x, y = yhat, group = f, color = f)) + geom_line() 

Il ggplot() logica è abbastanza intuitivo, credo - di gruppo e il colore delle linee di f. Con un numero crescente di gruppi, non è necessario specificare un livello per ciascuno è sempre più utile.

+2

Si noti che 'ggplot2' ha una funzione' fortify.lm' che integra i dati con un numero di statistiche di adattamento del modello lineare – mnel

2

non sono un esperto in R. Ma io uso:

xyplot(y ~ x, groups= f, data= Dat, type= c('p','r'), 
    grid= T, lwd= 3, auto.key= T,) 

Questa è anche un'opzione:

interaction.plot(f,x,y, type="b", col=c(1:3), 
      leg.bty="0", leg.bg="beige", lwd=1, pch=c(18,24), 
      xlab="", 
      ylab="", 
      trace.label="", 
      main="Interaction Plot") 
0

Ecco una piccola modifica al eccellente suggerimento di Matt e una soluzione simile a Helgi ma con ggplot. L'unica differenza è che ho usato geom_smooth (method = 'lm) che traccia direttamente le linee di regressione.

set.seed(1) 
y = runif(100,1,10) 
x = runif(100,1,10) 
f = rep(c('level 1','level 2'),50) 
thedata = data.frame(x,y,f) 
library(ggplot2) 
ggplot(thedata,aes(x=x,y=y,color=f))+geom_smooth(method='lm',se=F)