计算回归线和数据点之间的距离

时间:2011-08-02 10:44:46

标签: r plot distance

我想知道是否有办法计算绘图中的abline和数据点之间的距离?例如,concentration == 40signal == 643(元素5)之间的距离是多少?

concentration <- c(1,10,20,30,40,50)
signal <- c(4, 22, 44, 244, 643, 1102)
plot(concentration, signal)
res <- lm(signal ~ concentration)
abline(res)

2 个答案:

答案 0 :(得分:13)

您基本上要求residuals

R> residuals(res)
      1       2       3       4       5       6 
 192.61   12.57 -185.48 -205.52  -26.57  212.39 

另外,当您拟合线性回归时,残差的总和为0:

R> sum(residuals(res))
[1] 8.882e-15

如果模型正确,则应遵循正态分布 - qqnorm(res)

我发现更容易使用标准化残差。

> rstandard(res)
       1        2        3        4        5        6 
 1.37707  0.07527 -1.02653 -1.13610 -0.15845  1.54918 

这些残差已经缩放为均值为零,方差(近似)等于1且具有正态分布。边远标准化残差是那些大于+/- 2的那些。

答案 1 :(得分:5)

您可以使用以下功能:

http://paulbourke.net/geometry/pointlineplane/pointline.r

然后只提取斜率和截距:

> coef(res)
  (Intercept) concentration 
   -210.61098      22.00441

所以你的最终答案是:

concentration <- c(1,10,20,30,40,50)
signal <- c(4, 22, 44, 244, 643, 1102)
plot(concentration, signal)
res <- lm(signal ~ concentration)
abline(res)

plot

cfs <- coef(res)
distancePointLine(y=signal[5], x=concentration[5], slope=cfs[2], intercept=cfs[1])

如果您想要更通用的解决方案来查找特定点,concentration == 40将返回长度为length(concentration)的布尔矢量。您可以使用该向量来选择点。

pt.sel <- ( concentration == 40 )
> pt.sel
[1] FALSE FALSE FALSE FALSE TRUE FALSE
> distancePointLine(y=signal[pt.sel], x=concentration[pt.sel], slope=cfs["concentration"], intercept=cfs["(Intercept)"])
     1.206032

不幸的是,distancePointLine似乎没有矢量化(或者确实如此,但是当你向它传递一个向量时它会返回一个警告)。否则,只需将[]选择器从x和y参数中移开,就可以得到所有点的答案。