Подтвердить что ты не робот

Рассчитать расстояние между линией регрессии и точкой данных

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

Ответ 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.