#r #non-linear-regression
#r #нелинейная регрессия
Вопрос:
Я пытаюсь рассчитать стандартную кривую для значений концентрации и MFI (медианной интенсивности флуоресценции) и применить ее для определения концентрации по новым данным MFI. Предполагается, что данные соответствуют полиномиальной функции 5-го порядка, но я получаю странную подгонку и неправильные результаты с чем-либо выше 3-го порядка. Я могу получить 5-й порядок для подгонки с помощью Excel, и он предсказывает, как и должно быть. Есть мысли?
#Standard Values:
concentration = c(2500.0, 1250.0, 625.0, 312.5, 156.0, 80.0, 40.0, 20.0, 0.0)
MFI = c(8414, 3902, 1355, 928, 555, 324, 253, 187, 137)
# Code to fit:
Standards = data_frame(MFI, concentration)
poly_fit = lm(concentration ~ poly(MFI, degree = 5), data = Standards)
РЕДАКТИРОВАТЬ: используемая формула Excel =LINEST(строки концентрации, строки MFI ^ {1,2,3,4,5}, TRUE,TRUE)
Это «странная» подгонка, которую я получаю в R:
#The MFI data to fit with the function:
samples = c(2951.0, 3197.0, 3141.0, 13166.0, 12646.0, 12869.0, 9395.5, 9681.0, 9785.0, 9513.0, 9133.0, 9430.0, 6798.0, 5935.0, 5749.0)
#The accompanying known concentration values for the samples:
sample_knowns = c(994.4858, 1076.0902, 1057.5298, 4299.3047, 4133.6606, 4204.7194, 3093.5100, 3185.2317, 3218.6245, 3131.2682, 3009.1081, 3104.5978, 2255.0522, 1974.6138, 1914.0260)
Комментарии:
1. Можете ли вы объяснить, что вы подразумеваете под странной подгонкой, пожалуйста? Все еще странно , если вы используете
raw=TRUE
inpoly
?2. Из этого графика
with(Standards, plot(MFI,concentration)); mfi2 = with(Standards, seq(min(MFI), max(MFI), length=20)) ; lines(mfi2, predict(poly_fit, newdata=data.frame(MFI=mfi2)), col="red")
ot кажется, что степень 5 превышена -> это то, что вы подразумеваете под странным?
Ответ №1:
Единственная странная вещь, которую я вижу в вашем коде, это то, что вы используете data_frame
с подчеркиванием вместо data.frame
точки. В противном случае пример работает нормально. Прогнозы в выборке очень близки к наблюдаемым значениям, как показано на этом графике:
concentration = c(2500.0, 1250.0, 625.0, 312.5, 156.0, 80.0, 40.0, 20.0, 0.0)
MFI = c(8414, 3902, 1355, 928, 555, 324, 253, 187, 137)
Standards = data.frame(concentration, MFI)
poly_fit = lm(concentration ~ poly(MFI, degree = 5), data = Standards)
summary(poly_fit)
#>
#> Call:
#> lm(formula = concentration ~ poly(MFI, degree = 5), data = Standards)
#>
#> Residuals:
#> 1 2 3 4 5 6 7
#> 2.432e-05 -1.931e-03 3.455e-01 -1.407e 00 1.971e 00 4.675e 00 -8.415e 00
#> 8 9
#> -4.558e-01 3.288e 00
#>
#> Coefficients:
#> Estimate Std. Error t value Pr(>|t|)
#> (Intercept) 553.722 2.015 274.754 1.06e-07 ***
#> poly(MFI, degree = 5)1 2348.794 6.046 388.486 3.76e-08 ***
#> poly(MFI, degree = 5)2 -164.330 6.046 -27.180 0.000109 ***
#> poly(MFI, degree = 5)3 135.835 6.046 22.467 0.000193 ***
#> poly(MFI, degree = 5)4 99.164 6.046 16.402 0.000493 ***
#> poly(MFI, degree = 5)5 42.537 6.046 7.035 0.005900 **
#> ---
#> Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#>
#> Residual standard error: 6.046 on 3 degrees of freedom
#> Multiple R-squared: 1, Adjusted R-squared: 0.9999
#> F-statistic: 3.05e 04 on 5 and 3 DF, p-value: 2.963e-07
plot(Standards$concentration,
predict(poly_fit))
Комментарии:
1.
data_frame
изtibble
пакета (и устарел)
Ответ №2:
Я собираюсь продолжить комментарии @ user20650 и предположить, что то, что вы видите, является стандартным случаем нестабильности полиномиальной регрессии. Как предполагает @Vincent, прогнозы в порядке (предсказанные кривые проходят через все точки, чрезвычайно точно для степени = 4 и 5), но кривые действительно глупые. Я был бы очень удивлен, если бы R допустил здесь ошибку; можете ли вы включить в свой вопрос более подробную информацию о вашей процедуре подгонки Excel? Является ли полиномиальная регрессия как-то стабилизированной …??
nS <- data.frame(MFI=seq(0,max(MFI), length.out=101))
par(las=1,bty="l")
plot(concentration~MFI, data=Standards,pch=16,cex=2,log="x")
for (d in 1:5) {
poly_fit = lm(concentration ~ poly(MFI, degree = d), data = Standards)
lines(nS$MFI, predict(poly_fit, newdata=nS), col=d 1, lwd=2)
}