Рассчитать расстояние между линией регрессии и точкой данных
Интересно, есть ли способ вычислить расстояние между абреей в сюжете и точкой данных? Например, каково расстояние между concentration == 40
с signal == 643
(элемент 5) и abline?
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)
Ответы
Ответ 1
В основном вы запрашиваете 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
Эти остатки были масштабированы, чтобы иметь средний ноль, дисперсия (приблизительно) равна единице и имеет нормальное распределение. Оставшиеся стандартизованные остатки - это те, которые больше +/- 2.
Ответ 2
Вы можете использовать следующую функцию:
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.