рассчитать расстояние между линией регрессии и точкой данных - PullRequest
18 голосов
/ 02 августа 2011

Интересно, есть ли способ рассчитать расстояние между линией на графике и точкой данных? Например, каково расстояние между 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)

Ответы [ 2 ]

13 голосов
/ 02 августа 2011

Вы в основном запрашиваете 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.

5 голосов
/ 02 августа 2011

Вы можете использовать следующую функцию:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...