Лучший способ построения эффектов взаимодействия с линейной моделью
Чтобы помочь заполнить тег 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)