У меня есть внешняя калибровочная кривая, которая слегка переходит в насыщение.Таким образом, я подгоняю полином второго порядка и таблицу данных измеренных образцов, для которой я хотел бы знать концентрацию.
df_calibration=structure(list(dilution = c(0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7,
0.8, 0.9, 1, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1),
area = c(1000, 2000, 3000, 4000, 5000, 6000, 7000, 7800,
8200, 8500, 1200, 2200, 3200, 4200, 5200, 6200, 7200, 8000,
8400, 8700), substance = c("A", "A", "A", "A", "A", "A",
"A", "A", "A", "A", "b", "b", "b", "b", "b", "b", "b", "b",
"b", "b")), row.names = c(NA, 20L), class = "data.frame")
df_samples=structure(list(area = c(1100, 1800, 2500, 3200, 3900, 1300, 2000,
2700, 3400, 4100), substance = c("A", "A", "A", "A", "A", "b",
"b", "b", "b", "b")), row.names = c(NA, 10L), class = "data.frame")
Чтобы теперь вычислить фактические разведения из измеренных образцов, я беру параметрыгенерируется из этой подгонки:
df_fits=df_calibration %>% group_by(substance) %>%
do(fit = lm(area ~ poly(dilution,2), data = .))%>%
tidy(fit) %>%
select(substance, term, estimate) %>%
spread(term, estimate)
df_fits=df_fits %>% rename(a=`poly(dilution, 2)2`,b=`poly(dilution, 2)1`,c=`(Intercept)`)
#join parameters with sample data
df_samples=left_join(df_samples,df_fits)
и этой формулы ![formula to calculate](https://i.stack.imgur.com/GxXY4.png)
#calculate with general solution for polynomial 2nd order
df_samples$dilution_calc=
(df_samples$b*(-1)+sqrt(df_samples$b^2-(4*df_samples$a*(df_samples$c-df_samples$area))))/(2*df_samples$a)
Однако, когда я рисую это сейчас, я замечаю что-то очень странное.Рассчитанные значения x (разведения) не заканчиваются на кривой от stat_smooth()
.Дополнительная пунктирная линия обозначена параметрами из уравнения на графике (которые соответствуют числам во фрейме данных) для вещества «А».Так что мои расчеты должны быть правильными (или нет?) Почему есть разница?Что я делаю неправильно?Как я могу получить параметры из подгонки, выполненной stat_smooth()
?
my.formula=y ~ poly(x,2)
ggplot(df_calibration, aes(x = dilution, y = area)) +
stat_smooth(method = "lm", se=FALSE, formula = my.formula) +
stat_function(fun=function(x){5250+(7980*x)+(-905*x^2)},
inherit.aes = F,linetype="dotted")+
stat_poly_eq(formula = my.formula,
aes(label = paste(..eq.label.., ..rr.label.., sep = "~~~")),
parse = TRUE) +
geom_point(shape=17)+
geom_point(data=df_samples,
aes(x=dilution_calc,y=area),
shape=1,color="red")+
facet_wrap(~substance,scales = "free")
![plot with odd behaviour](https://i.stack.imgur.com/C6Ma9.png)
Любое предложение будет высоко оценено: -)