答案是否定的,不可能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 的解决方案。