Вы можете использовать следующую функцию:
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.