【问题标题】:Restrict fitted regression line (abline) to range of data used in model将拟合回归线(abline)限制在模型中使用的数据范围内
【发布时间】:2021-02-10 19:45:04
【问题描述】:

是否可以仅在 x 值的某个范围内绘制适合的 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
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 垂直的相应位置添加小刻度。我现在知道如何做到这一点。这当然是更好的方式。

你有什么解决办法吗?

【问题讨论】:

  • 我在之前关于线性回归的回答中没有(至少隐含地)介绍过这个吗? abline() 除了最简单的情况外,不适用于所有情况,即使这样,它也只能在我们绘制整个绘图区域时起作用,因为它使用模型的截距和斜率系数。它一无所知,或者对用于拟合模型的数据一无所知。我知道的第一个想法最简单的方法是在您感兴趣的区间内生成预测并绘制这些预测。
  • 另外,你最近问了几个问题,但没有一个你接受答案。请返回并查看您的问题,看看您是否可以接受足以解决您的问题的答案。
  • @Gavin 感谢 cmets。我现在接受了答案,并且。关于 abline 的事情:是的,你写了 abline 只适用于线性轴,你写了关于绘制预测的文章。我认为突出用于预测的点值得打开一个新主题。

标签: r drawing plot curve-fitting


【解决方案1】:

答案是否定的,不可能让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 和@987654335 的逻辑向量@ 值指示哪些数据在感兴趣的区域中,lines() 仅沿着这些数据绘制一条线。

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

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

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

【讨论】:

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

    【讨论】:

      【解决方案3】:

      这是一个基本的绘图问题——使用ylim=c(low, high) 选项和lowhigh 的合适选项。

      您可能需要阅读 R 版本随附的 An Introduction to R 手册,以及 CRAN 网站上的其他 fine contributed documentation

      【讨论】:

      • abline(reg=daten_fit, xlim=c(2,4)) 不起作用。我不想限制整个图表,只限制 abline。
      • 那么不要使用abline(),而是使用由两个端点定义的明确指定的行。
      猜你喜欢
      • 2013-11-04
      • 2017-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-09
      • 2018-03-17
      • 2012-09-17
      相关资源
      最近更新 更多