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

时间:2019-04-18 15:06:37

标签: r ggplot2 lm gam

我在同一数据集上拟合了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))

也欢迎包括每条线/型号的SE和图例。

1 个答案:

答案 0 :(得分:1)

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

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

这给了我

multi-predict plot