2009-09-08 5 views
15

En un esfuerzo por ayudar a poblar la etiqueta R aquí, estoy publicando algunas preguntas que a menudo he recibido de los estudiantes. He desarrollado mis propias respuestas a lo largo de los años, pero tal vez haya formas mejores flotando que no conozco.La mejor manera de trazar los efectos de interacción de un modelo lineal

La pregunta: Me acaba de ejecutar una regresión con la continua y y x pero el factor f (donde levels(f) produce c("level1","level2"))

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

Ahora me gustaría trazar los valores predichos de y por x desglosado por grupos definido por f. Todas las tramas que recibo son feas y muestran demasiadas líneas.

Mi respuesta: Pruebe la función 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") 

¿Hay otras ideas por ahí que son (1) más fácil de entender para un recién llegado y/o (2) una mejor perspectiva de algún otro?

Respuesta

17

El paquete de efectos tiene buenos métodos de trazado para visualizar los valores predichos de las regresiones.

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 - todavía tratando de envolver mi cerebro alrededor expand.grid(). Sólo para efectos de comparación, esta es la forma en que lo haría (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() 

El ggplot() lógica es bastante intuitivo, creo - grupo y el color de las líneas de f. Con un número creciente de grupos, no tener que especificar una capa para cada uno es cada vez más útil.

+2

Tenga en cuenta que 'ggplot2' tiene una función' fortify.lm' que los datos del suplemento con una serie de estadísticas de ajuste modelo lineal – mnel

2

No soy experto en R. Pero yo uso:

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

Esta es también una opción:

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

Aquí hay un pequeño cambio a la excelente sugerencia de Matt y una solución similar a Helgi pero con ggplot. La única diferencia de arriba es que he usado geom_smooth (method = 'lm) que traza líneas de regresión directamente.

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) 
Cuestiones relacionadas