首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将拟合回归线(abline)限制在模型中使用的数据范围内

将拟合回归线(abline)限制在模型中使用的数据范围内
EN

Stack Overflow用户
提问于 2011-06-08 13:49:41
回答 3查看 1.9K关注 0票数 1

是否有可能只在一定的x值范围内绘制适合的abline

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

代码语言:javascript
运行
复制
# 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)

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

代码语言:javascript
运行
复制
plot (y ~ x, data = daten)
abline(reg = daten_fit)

这条线是为原始数据中x-值的全部范围绘制的.但是,我只想为用于曲线拟合的数据子集绘制回归线。我脑子里有两个想法:

  1. 绘制的第二行更厚,但只显示在3:5范围内。我检查了ablinelinessegments的参数,但找不到任何东西。
  2. 将小滴答添加到与abline垂直的各个位置。我现在知道该怎么做了。当然,这将是更好的方式。

你有什么解决办法吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-06-08 13:58:29

一种方法是使用颜色来区分已安装的点和未安装的点:

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
#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")

票数 2
EN

Stack Overflow用户

发布于 2011-06-08 14:33:29

答案是否定的,这是不可能得到abline()绘制拟合线上的一个部分的绘图区域,模型是拟合的。这是因为它只使用模型系数来绘制直线,而不是从模型中预测。如果你仔细观察,你会发现这条线实际上延伸到了地块区域之外,覆盖了它所在区域的绘图框架。

对于这些问题,最简单的解决办法是从模型中预测您想要的区域。

代码语言:javascript
运行
复制
# 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值的范围:

代码语言:javascript
运行
复制
xr <- with(daten, range(x[3:5]))

然后,我们使用该模型对这一范围内的一组均匀距离点进行预测:

代码语言:javascript
运行
复制
pred <- data.frame(x = seq(from = xr[1], to = xr[2], length = 50))
pred <- transform(pred, yhat = predict(mod, newdata = pred))

现在用abline()绘制数据和模型

代码语言:javascript
运行
复制
plot(y ~ x, data = daten)
abline(mod)

然后在你想要强调的地区加上:

代码语言:javascript
运行
复制
lines(yhat ~ x, data = pred, col = "red", lwd = 2)

这给了我们这个情节:

如果您有一个比abline()可以处理的模型更复杂的模型,那么我们采取稍微不同的策略,预测可用的、绘制的数据的范围来绘制直线,然后选择我们想要突出显示的间隔。下面的代码是这样做的:

代码语言:javascript
运行
复制
## 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()只沿着这些数据绘制一条线。

代码语言:javascript
运行
复制
R> head(with(pred, x >= xr[1] & x <= xr[2]))
[1] FALSE FALSE FALSE FALSE FALSE FALSE

有人可能会想,为什么我会预测预测变量的50或100个均匀间隔值,而在这种情况下,我们只对数据或感兴趣区域的开始和结束做了预测,并加入了这两个点?嗯,并不是所有的建模练习都那么简单--前面问题中的双重日志模型就是一个很好的例子--我上面概述的通用解决方案在所有情况下都会起作用,而将两个预测简单地结合起来就不行了。

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

票数 4
EN

Stack Overflow用户

发布于 2011-06-08 13:52:20

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

您可能需要阅读R版本附带的R简介手册,以及克拉恩站点上的其他精细贡献文件

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6279759

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档