答案是否定的,这是不可能得到abline()
画上只有一个情节区域,其中该模型的一部分拟合线装。这是因为它只使用模型系数来绘制线条,而不是从模型中预测。如果仔细观察,您会发现线条绘制实际上延伸到绘图区域之外,覆盖它存在区域的绘图框架。
这种问题的最简单的解决方案是从模型中预测你想要的区域。
# The dataset:
daten <- data.frame(x = c(0:6), y = c(0.3, 0.1, 0.9, 3.1, 5, 4.9, 6.2))
# make a linear fit for the datapoints 3, 4, 5
mod <- lm(y~x, data = daten, subset = 3:5)
首先,我们得到x
值的范围,我们要区分:
xr <- with(daten, range(x[3:5]))
那么我们预测利用该模型对这个范围内的一组均匀分布的点:
pred <- data.frame(x = seq(from = xr[1], to = xr[2], length = 50))
pred <- transform(pred, yhat = predict(mod, newdata = pred))
现在绘制数据和模型使用abline()
:
plot(y ~ x, data = daten)
abline(mod)
然后在该区域添加要强调的是:
lines(yhat ~ x, data = pred, col = "red", lwd = 2)
这给了我们这样的情节:
如果你有一个模型,更复杂的比它可以是由abline()
处理,然后我们采取一个稍微不同的策略,预测可用绘制数据的范围来绘制线条,然后选取我们想要突出显示的时间间隔。下面的代码做的是:
## range of all `x` data
xr2 <- with(daten, range(x))
## same as before
pred <- data.frame(x = seq(from = xr2[1], to = xr2[2], length = 100))
pred <- transform(pred, yhat = predict(mod, newdata = pred))
## plot the data and the fitted model line
plot(y ~ x, data = daten)
lines(yhat ~ x, data = pred)
## add emphasis to the interval used in fitting
with(pred, lines(yhat ~ x, data = pred, subset = x >= xr[1] & x <= xr[2],
lwd = 2, col = "red"))
我们在这里做什么用subset
参数挑选出来自那些在装修中使用的间隔的预测值,我们传递给subset
的载体是一个合乎逻辑的矢量TRUE
和FALSE
值指示哪些数据在感兴趣的区域中,并且lines()
仅绘制沿着这些数据的一条线。
R> head(with(pred, x >= xr[1] & x <= xr[2]))
[1] FALSE FALSE FALSE FALSE FALSE FALSE
有人可能会问,为什么我做了预测,在预测变量的50个或100均匀分布的值时,我们可以在这种情况下,就已经做了开始时的预测数据或区域的结尾感兴趣并加入这两点?好吧,并非所有的建模练习都是如此简单 - 你从前面的问题中加倍记录模型就是一个恰当的例子 - 上面概述的通用解决方案将适用于所有情况,而简单地加入两个预测则不会。
@Andrie已经提供你一个解决思路2.
没有我在以前的线性回归的答案(至少隐含地)覆盖呢? 'abline()'不适用于所有情况,只是最简单的情况,即使这样,它也只能用于我们绘制整个绘图区域,因为它使用模型的截距和斜率系数进行绘制。它一无所知,或者不关心用于拟合模型的数据。我知道做第一个想法的最简单方法是在您感兴趣的时间间隔内生成预测并绘制这些预测。 – 2011-06-08 14:13:24
另外,你已经问了几个最近的Q,其中没有一个你已经接受了答案。请回头看看你的问题,看看你是否可以接受一个足以解决你的问题的答案。 – 2011-06-08 14:15:13
@Gavin感谢您的评论。我现在接受了答案。接近事物:是的,你写到abline只适用于线性轴,而且你写了关于绘制预测的图。我认为突出用于预测的观点是值得开启一个新话题的。 – 2011-06-08 16:58:45