Лучший способ построения эффектов взаимодействия с линейной моделью

Чтобы помочь заполнить тег R здесь, я отправляю несколько вопросов, которые я часто получал от студентов. Я разработал свои собственные ответы на эти вопросы на протяжении многих лет, но, возможно, есть и другие способы, которыми я не знаю.

Вопрос: я просто запускал регрессию с непрерывными y и x, но factor f (где levels(f) создает c("level1","level2"))

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

Теперь я хотел бы построить предсказанные значения y на x, разбитые группами, определенными f. Все графики, которые я получаю, уродливы и показывают слишком много строк.

Мой ответ: попробуйте функцию 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")

Существуют ли другие идеи, которые (1) легче понять для новичка и/или (2) лучше с какой-либо другой точки зрения?

Ответы

Ответ 1

Пакет эффектов имеет хорошие методы построения изображений для визуализации прогнозируемых значений регрессий.

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)

Ответ 2

Ха - все еще пытаюсь обернуть мой мозг вокруг expand.grid(). Просто для сравнения, так я бы сделал это (используя 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() довольно интуитивно понятна, я думаю - группировать и окрашивать строки по f. С увеличением числа групп, не обязательно указывать слой для каждого, становится все более полезным.

Ответ 3

Я не эксперт в Р. Но я использую:

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

Это также вариант:

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")

Ответ 4

Вот небольшое изменение к прекрасному предложению Мэтта и решение, подобное Хельги, но с ggplot. Единственное отличие от выше - то, что я использовал geom_smooth (method = 'lm), который непосредственно ссылается на линии регрессии.

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)