在一个图中绘制多个 lm() 模型

Plotting multiple lm() models in one plot

我在同一数据集上安装了 6 个 lm() 模型和 1 个 gam() 模型。

现在我想将它们全部绘制在一个图中,一个一个叠加。我可以在不在 ggplot 中再次定义模型的情况下执行此操作吗?

我的情况是这样的

我有

model1 <- lm(y~1, data = data) %>% coef()
model2 <- lm(y~x, data = data) %>% coef()
model3 <- lm(y~abs(x), data = data) %>% coef()
...
model7 <- gam(y~s(x), data = data) %>% coef()

我可以将模型的存储系数提供给 ggplot 吗?

ggplot(data, mapping = aes(x = x, y = y)) +
geom_point() +
geom_abline(model1) +
geom_abline(model2) +
....

或者这样做是绘制模型预测线以手动填写参数的唯一方法,如下所示:

ggplot(data, mapping = aes(x = x, y = y)) +  
  geom_point() +  
  geom_abline(intercept = model1[1]) +  
  geom_abline(slope = model2[2], intercept = model2[1]) +  
  geom_abline(slope = model3[2], intercept = model3[1]) +  
  ...

示例代码

set.seed(123)
x <- rnorm(50)
y <- rweibull(50,1)
d <- as.data.frame(cbind(x,y))
model1 <- coef(lm(y~1, data = d))
model2 <- coef(lm(y~x, data = d))
model3 <- coef(lm(y~abs(x), data = d))

包括每个 line/model 的 SE 和图例也是受欢迎的。

为了使其正常工作,您确实需要保存整个模型。因此,如果我们假设您拥有整个模型

# set.seed(101) used for sample data
model1 <- lm(y~1, data = d)
model2 <- lm(y~x, data = d)
model3 <- lm(y~abs(x), data = d)

我们可以编写一个辅助函数来预测这些模型在给定 x 值范围内的新值。下面是这样一个函数

newvalsforx <- function(x) {
  xrng <- seq(min(x), max(x), length.out=100)
  function(m) data.frame(x=xrng, y=predict(m, data.frame(x=xrng)))
}
pred <- newvals(d$x)

pred() 将根据模型对 x 的观察范围进行预测。然后我们可以使用这些作为新数据传递给我们可以添加到绘图中的 geom_lines 。例如

ggplot(d, aes(x,y)) +
  geom_point() + 
  geom_line(data=pred(model1), color="red") + 
  geom_line(data=pred(model2), color="blue") + 
  geom_line(data=pred(model3), color="green")

这给了我