2011-06-08 88 views
0

是否可以仅在某个x值范围内绘制拟合曲线?指出用于R曲线中曲线拟合的范围

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

# 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值的最大可能范围。但是,我想指出用于曲线拟合的范围(数据的子集)。有报道说,来了TI我的脑海2个想法:

  1. 画第二行即较厚,但仅在范围3所示:5。我查abline,线路和段的参数,但我无法找到任何

  2. 添加小刻度线的各个位置,是perpendicualar到abline。我现在知道我该如何做到这一点。这当然是更好的方式。

您对解决方案有什么想法吗?

感谢,

斯文

+0

没有我在以前的线性回归的答案(至少隐含地)覆盖呢? 'abline()'不适用于所有情况,只是最简单的情况,即使这样,它也只能用于我们绘制整个绘图区域,因为它使用模型的截距和斜率系数进行绘制。它一无所知,或者不关心用于拟合模型的数据。我知道做第一个想法的最简单方法是在您感兴趣的时间间隔内生成预测并绘制这些预测。 – 2011-06-08 14:13:24

+1

另外,你已经问了几个最近的Q,其中没有一个你已经接受了答案。请回头看看你的问题,看看你是否可以接受一个足以解决你的问题的答案。 – 2011-06-08 14:15:13

+0

@Gavin感谢您的评论。我现在接受了答案。接近事物:是的,你写到abline只适用于线性轴,而且你写了关于绘制预测的图。我认为突出用于预测的观点是值得开启一个新话题的。 – 2011-06-08 16:58:45

回答

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") 

enter image description here

第二种方法是绘制在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") 

enter image description here

0

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

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

+0

'abline(reg = daten_fit,xlim = c(2,4))'不起作用。我不想限制整个图表,只是基准线。 – 2011-06-08 13:56:46

+1

然后不要使用'abline()',而是使用由两个端点定义的明确指定的行。 – 2011-06-08 13:59:29

3

答案是否定的,这是不可能得到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) 

这给了我们这样的情节:

enter image description here

如果你有一个模型,更复杂的比它可以是由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.

+0

+1好的答案。 – Andrie 2011-06-08 14:48:04