2009-09-08 13 views
15

Aby pomóc wypełnić tutaj tag R, publikuję kilka pytań, które często otrzymywałem od studentów. Na przestrzeni lat rozwinąłem na nie swoje własne odpowiedzi, ale być może są lepsze sposoby na poruszanie się, o których nie wiem.Najlepszy sposób na wykreślenie efektów interakcji z liniowego modelu

Pytanie: Właśnie prowadził regresji z ciągłym y i x ale czynnik f (gdzie levels(f) produkuje c("level1","level2"))

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

teraz chciałbym wykreślić przewidywanych wartości y przez x podziale na grupy zdefiniowane przez f. Wszystkie wątki, które otrzymuję, są brzydkie i pokazują zbyt wiele linii.

Moja odpowiedź: wypróbuj funkcję 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") 

Czy są jakieś inne pomysły, które obecnie nie są (1) łatwiejsze do zrozumienia dla początkującego i/lub (2) lepsza od innej perspektywy?

Odpowiedz

17

Pakiet efektów zawiera dobre metody drukowania w celu wizualizacji przewidywanych wartości regresji.

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 - nadal próbuję zawinąć mój mózg wokół expand.grid(). Wystarczy dla porównania, to jak zrobiłbym to (za pomocą 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() 

ggplot() logika jest dość intuicyjny, myślę - grupę i kolor linii przez F. Wraz ze wzrostem liczby grup, nie zawsze konieczne jest określenie warstwy dla każdego z nich.

+2

Zauważ, że 'ggplot2' ma funkcję' fortyfikacja.lm', która uzupełnia dane o szereg statystyk dopasowania modelu liniowego – mnel

2

Nie jestem ekspertem w R. Ale używam:

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

Jest także opcja:

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

Oto mała zmiana doskonałej sugestią Matt i rozwiązania podobnego do Helgi, ale z ggplotem. Jedyną różnicą od powyższego jest to, że użyłem funkcji geom_smooth (method = 'lm), która bezpośrednio kreśli linie regresji.

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) 
Powiązane problemy