2009-09-08 24 views
15

Trong nỗ lực giúp điền thẻ R vào đây, tôi đăng một số câu hỏi mà tôi thường nhận được từ sinh viên. Tôi đã phát triển câu trả lời của riêng mình cho những năm qua, nhưng có lẽ có những cách tốt hơn trôi nổi xung quanh mà tôi không biết.Cách tốt nhất để vẽ các hiệu ứng tương tác từ một mô hình tuyến tính

Câu hỏi đặt ra: Tôi chỉ cần chạy một hồi quy với liên tục yx nhưng yếu tố f (nơi levels(f) sản xuất c("level1","level2"))

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

Bây giờ tôi muốn vẽ các giá trị dự đoán của y bởi x bị phá vỡ bởi các nhóm được xác định bởi f. Tất cả các ô tôi nhận được đều xấu xí và hiển thị quá nhiều dòng.

Câu trả lời của tôi: Thử chức năng 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") 

Có những ý tưởng nào khác ngoài đó (1) dễ hiểu hơn đối với người mới và/hoặc (2) tốt hơn từ một viễn cảnh khác không?

Trả lời

17

Gói hiệu ứng có phương pháp đánh giá tốt để hình dung các giá trị dự đoán của hồi quy.

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 - vẫn đang cố gắng bọc não của tôi xung quanh expand.grid(). Chỉ vì lợi ích so sánh, đây là cách tôi muốn làm điều đó (sử dụng 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() 

Các ggplot() logic là khá trực quan, tôi nghĩ - nhóm và tô màu cho các dòng bằng f. Với số lượng ngày càng tăng của các nhóm, không phải chỉ định một lớp cho mỗi nhóm ngày càng hữu ích.

+2

Lưu ý rằng 'ggplot2' có hàm' fortify.lm' bổ sung dữ liệu với một số thống kê mô hình tuyến tính phù hợp – mnel

2

Tôi không có chuyên môn trong R. Nhưng tôi sử dụng:

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

Đây cũng là một lựa chọ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

Đây là một thay đổi nhỏ cho các gợi ý tuyệt vời bởi Matt và một giải pháp tương tự để Helgi nhưng với ggplot. Chỉ có sự khác biệt từ trên là tôi đã sử dụng geom_smooth (method = 'lm) để vẽ trực tiếp các đường hồi quy.

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) 
Các vấn đề liên quan