我想知道是否有办法计算绘图中的abline和数据点之间的距离?例如,concentration == 40
与signal == 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)
答案 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)
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参数中移开,就可以得到所有点的答案。