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

Lis*_*ann 18 plot r 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)
Run Code Online (Sandbox Code Playgroud)

csg*_*pie 13

你基本上是要求了residuals.

R> residuals(res)
      1       2       3       4       5       6 
 192.61   12.57 -185.48 -205.52  -26.57  212.39 
Run Code Online (Sandbox Code Playgroud)

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

R> sum(residuals(res))
[1] 8.882e-15
Run Code Online (Sandbox Code Playgroud)

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

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

> rstandard(res)
       1        2        3        4        5        6 
 1.37707  0.07527 -1.02653 -1.13610 -0.15845  1.54918 
Run Code Online (Sandbox Code Playgroud)

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

  • 不要迂腐,特别是当你回答问题时,用户应该意识到这个解决方案适用于拟合数据的残差.对新点的应用需要y值和`predict`的输出之间的差异,即y-hat. (2认同)

Ari*_*man 5

您可以使用以下功能:

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

然后只提取斜率和截距:

> coef(res)
  (Intercept) concentration 
   -210.61098      22.00441
Run Code Online (Sandbox Code Playgroud)

所以你的最终答案是:

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)
Run Code Online (Sandbox Code Playgroud)

情节

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

如果您想要一个更通用的解决方案来查找特定点,则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
Run Code Online (Sandbox Code Playgroud)

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