не подходит полином 5-го порядка

#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 in poly ?

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)
}
 

введите описание изображения здесь