【问题标题】:Plotting multiple lm() models in one plot在一个图中绘制多个 lm() 模型
【发布时间】:2019-04-19 00:36:34
【问题描述】:

我在同一个数据集上安装了 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 和图例。

【问题讨论】:

  • 你想从 lm 对象中绘制什么?例如什么是您想要的一组图的示例,带有示例代码
  • 添加了更多细节。看不出我怎么能举个例子..因为我不知道代码?
  • 我们不需要绘图代码的示例,我们需要绘图的输入数据示例。我们需要可以复制/粘贴的代码,这些代码将生成您想要绘制的 lmgam 模型(它不一定是您的真实数据,但它需要是我们可以自己实际运行的东西,不是伪代码)。这样我们就可以测试可能的解决方案。
  • 我所做的新编​​辑是否足够?
  • 另外两件事:(a) 在随机抽奖之前set.seed() 很好,所以我们都得到相同的数字。 set.seed(123)。 (b) 请更清楚你想要什么——它只是预测线吗?或者你也想要置信区间?你想用颜色和图例来区分线条吗?还是你不在乎?

标签: r ggplot2 lm gam


【解决方案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")

这给了我

【讨论】:

  • 我知道这是可能的。但是认为通过给 ggplot 模型对象或系数可能有一种更简单的方法?那你猜不行吗?非常感谢!
猜你喜欢
  • 2020-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-16
  • 1970-01-01
相关资源
最近更新 更多