【问题标题】:Plot the observed and fitted values from a linear regression using xyplot() from the lattice package使用 lattice 包中的 xyplot() 从线性回归中绘制观察值和拟合值
【发布时间】:2013-06-30 04:58:52
【问题描述】:

我可以创建简单的图表。我想在同一张图上观察和预测值(来自线性回归)。我正在密谋说Yvariable vs Xvariable。只有 1 个预测变量和 1 个响应。我怎样才能将线性回归曲线添加到同一张图中?

所以总结需要帮助:

  • 绘制实际值和预测值
  • 绘制回归线

【问题讨论】:

  • 回归线看abline
  • @Thomas 虽然对格子图没有用处。
  • @GavinSimpson 哦,是的,好点。没有仔细阅读那部分。
  • @Thomas 标题中有些隐藏。
  • 我已经使用库 caret>>train 函数创建了回归模型

标签: r lattice


【解决方案1】:

这是将单个图中的观察值和预测值作为点的一种选择。在观察点上更容易得到回归线,我第二个说明

首先是一些虚拟数据

set.seed(1)
x <- runif(50)
y <- 2.5 + (3 * x) + rnorm(50, mean = 2.5, sd = 2)
dat <- data.frame(x = x, y = y)

适合我们的模型

mod <- lm(y ~ x, data = dat)

将模型输出和观察到的x组合成一个单独的对象用于plott

res <- stack(data.frame(Observed = dat$y, Predicted = fitted(mod)))
res <- cbind(res, x = rep(dat$x, 2))
head(res)

加载点阵和绘图

require("lattice")

xyplot(values ~ x, data = res, group = ind, auto.key = TRUE)

生成的图应该与此类似

要获得观察数据的回归线,并且回归模型是一个简单的直线模型,根据我展示的模型,您可以规避其中的大部分内容并使用绘图

xyplot(y ~ x, data = dat, type = c("p","r"), col.line = "red")

(即您甚至不需要拟合模型或制作新数据进行绘图)

生成的图应如下所示

第一个示例的替代方法是编写您自己的面板函数,它可以与任何可以为回归线提供系数的东西一起使用 - 并不像看起来那么可怕

xyplot(y ~ x, data = dat, col.line = "red",
       panel = function(x, y, ...) {
         panel.xyplot(x, y, ...)
         panel.abline(coef = coef(mod), ...) ## using mod from earlier
       }
      )

上面的图 2 给出了一个绘图,但是是手工绘制的。

假设您已使用 caret 完成此操作,那么

mod <- train(y ~ x, data = dat, method = "lm",
             trControl = trainControl(method = "cv"))

xyplot(y ~ x, data = dat, col.line = "red",
       panel = function(x, y, ...) {
         panel.xyplot(x, y, ...)
         panel.abline(coef = coef(mod$finalModel), ...) ## using mod from caret
       }
      )

将生成与上面的图 2 相同的图。

【讨论】:

  • 我认为您之前对相同问题的回答更好:stackoverflow.com/questions/12972039/…
  • 我认为你的残差看起来很奇怪(看起来观察值可能落在两条不同的线上),然后我意识到你在创建 y 时搞砸了对 rnorm 的调用。跨度>
  • +1 -- 不错的演示。 (跟进@Dason 的评论,您的rnorm(2.5, sd=2) 评估结果与rnorm(n=2, sd=2) 相同,然后该值被回收到长度为50。您可能想要rnorm(50, sd=2)。)
  • 糟糕。那应该是卑鄙的 2. 将修复!
  • @user2543622 我不是故意粗鲁,但你为什么不在第一次问这个问题时提到这一点?我会更新我的答案... sigh
【解决方案2】:

另一种选择是使用来自latticeExtrapanel.lmlineq

library(latticeExtra)
set.seed(0)
xsim <- rnorm(50, mean = 3)
ysim <- (0 + 2 * xsim) * (1 + rnorm(50, sd = 0.3))

## basic use as a panel function
xyplot(ysim ~ xsim, panel = function(x, y, ...) {
  panel.xyplot(x, y, ...)
  panel.lmlineq(x, y, adj = c(1,0), lty = 1,xol.text='red',
                col.line = "blue", digits = 1,r.squared =TRUE)
})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-13
    • 1970-01-01
    • 1970-01-01
    • 2021-05-31
    • 1970-01-01
    • 1970-01-01
    • 2019-12-06
    相关资源
    最近更新 更多