【发布时间】:2021-05-24 16:19:36
【问题描述】:
假设我有以下数据集
x = rnorm(1000)
a = sample(c("A", "B", "C"), size=length(x), replace=T)
X = model.matrix(~a*x)
y = as.vector( X %*% c(0, .3, .5, .3, -.3, .1) ) + rnorm(length(x), 0, .2)
data = data.frame(y,a,x)
现在假设我为仅主效应模型建模
mod = lm(y~a+x, data=data)
如果我想可视化这个模型的拟合,我可以使用 ggplot2:
ggplot(data=data, aes(x=x, y=y)) +
geom_point() +
facet_grid(~a) +
geom_smooth(method="lm")
问题是显示的线条与模型不匹配。 (图表线有交互作用,但模型没有)。
对此建模的适当方法需要几个步骤:首先,创建包含每个组的截距的新列:
data$intercepts = 0;
data$intercepts[data$a=="B"] = coef(mod)[2]
data$intercepts[data$a=="C"] = coef(mod)[3]
然后像这样为每个模型绘制单独的线:
ggplot(data=data, aes(x=x, y=y)) +
geom_point() +
facet_grid(~a) +
geom_abline(aes(intercept = intercepts, slope = coef(mod)[4]))
这对于这个一次实例非常有用。但我正在尝试制作一个更通用的功能,并且可以适应任何类型的模型/视觉效果。
有没有办法将拟合模型提供给 ggplot 并让它发挥它的魔力?
过去,我使用 predict 函数“破解”ggplot 来制作我想要的模型(即,通过制作预测值网格,计算预测,然后使用 geom_line 来“连接点” .") 对于这个特定的应用程序,这是行不通的。相反,我需要通过面板指定斜率/截距,但需要该函数足够智能以识别何时存在交互/主效应/三向交互。
我的第一个想法是使用model.matrix 在拟合对象的每个面板中生成预测。 model.matrix 的优点是我不必弄清楚是否存在交互/主效应/多项式等....但我没有成功。
有什么想法吗?
【问题讨论】: