1

abline是否可以仅在一定范围的 x 值中绘制拟合?

我有一个与该数据集的子集线性拟合的数据集:

# 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
daten_fit <- lm(formula = y~x, data = daten, subset = 3:5)

当我绘制数据并绘制回归线时:

plot (y ~ x, data = daten)
abline(reg = daten_fit)

这条线是针对原始数据中的整个 x 值范围绘制的。但是,我只想为用于曲线拟合的数据子集绘制回归线。我想到了两个想法:

  1. 绘制第二条较粗的线,但仅显示在 3:5 范围内。我检查了参数ablinelinessegments我找不到任何东西

  2. 在与 .垂直的相应位置添加小刻度abline。我现在知道如何做到这一点。这当然是更好的方式。

您对解决方案有任何想法吗?

4

3 回答 3

4

答案是否定的,不可能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是一个逻辑向量,TRUEFALSE值指示哪些数据在感兴趣的区域中,并且lines()只绘制一个沿着这些数据。

R> head(with(pred, x >= xr[1] & x <= xr[2]))
[1] FALSE FALSE FALSE FALSE FALSE FALSE

有人可能想知道,为什么我可以对预测变量的 50 或 100 个均匀间隔的值进行预测,在这种情况下,我们可以对数据或感兴趣区域的开始和结束进行预测,然后将两个点连接起来? 好吧,并不是所有的建模练习都那么简单——你前面问题中的双对数模型就是一个很好的例子——我上面概述的通用解决方案适用于所有情况,而简单地加入两个预测则不会。

@Andrie 为您提供了想法 2 的解决方案。

于 2011-06-08T14:33:29.597 回答
2

一种方法是使用颜色来区分适合的点和不适合的点:

daten_fit <- lm(formula = y~x, data = daten[3:5, ])

plot(y ~ x, data = daten)
points(y ~ x, data = daten[3:5, ], col="red")
abline(reg=daten_fit, col="red")

在此处输入图像描述

第二种方法是在 x 轴上绘制刻度线。这些刻度称为地毯,可以使用该rug函数绘制。但首先你必须计算range

#points(y ~ x, data = daten[3:5, ], col="red")
abline(reg=daten_fit, col="red")
rug(range(daten[3:5, 1]), lwd=3, col="red")

在此处输入图像描述

于 2011-06-08T13:58:29.783 回答
0

这是一个有点基本的绘图问题 - 使用ylim=c(low, high)带有合适选项的选项lowhigh

您可能想阅读您的 R 版本随附的R 手册简介,以及CRAN站点上其他优秀的贡献文档。

于 2011-06-08T13:52:20.170 回答