在已定义的nlin公式中搜索完美参数

时间:2019-11-25 12:02:59

标签: r parameters curve-fitting

我试图用R找到最适合我的公式(定义一个)的公式。只是一个小警告,公式真的很大。

我正在使用的数据框:

    PAR  Phot     Ci ABSP        JT      KMC   O      KMO       VCT   GAMMAX      VCCI    Tleaf      VJCI
1     0 -1.77 702.94 0.95 0.9786961 376.5805 210 269.3062 0.9421065 41.29782 0.5119100 24.32754 0.1954317
2    50  2.21 669.47 0.95 0.9816882 380.3171 210 270.5269 0.9497883 41.49247 0.4977423 24.41893 0.1941457
3   100  5.77 642.25 0.95 0.9852079 384.8044 210 271.9841 0.9589957 41.72492 0.4850233 24.52758 0.1929701
4   150  9.18 618.98 0.95 0.9887219 389.3892 210 273.4636 0.9683837 41.96096 0.4734465 24.63737 0.1918723
5   200 12.26 601.15 0.95 0.9913713 392.9195 210 274.5964 0.9755990 42.14171 0.4643669 24.72108 0.1909830
6   300 17.82 569.80 0.95 0.9975855 401.4687 210 277.3169 0.9930246 42.57595 0.4468027 24.92091 0.1892302
7   500 24.74 535.95 0.95 1.0081243 416.9543 210 282.1660 1.0244223 43.35036 0.4242730 25.27294 0.1869406
8   700 28.37 527.71 0.95 1.0165744 430.4615 210 286.3164 1.0516399 44.01362 0.4142491 25.57012 0.1860205
9  1000 31.47 525.23 0.95 1.0278057 450.3881 210 292.3125 1.0915183 44.97249 0.4042777 25.99295 0.1852176
10 1300 33.64 527.00 0.95 1.0364652 467.8481 210 297.4492 1.1262032 45.79456 0.3976908 26.34927 0.1847604
11 1600 35.22 527.44 0.95 1.0421068 480.5953 210 301.1341 1.1513808 46.38464 0.3926786 26.60162 0.1843861

这是当前的脚本,但是我尝试了许多其他可能的函数来进行非线性曲线拟合以找到正确的参数(RD25,alpha,θ,Jmax25,Vcmx25)。

fo <- as.formula(Phot ~ ifelse(test = (Ci)<((((alpha*(PAR*ABSP)+Jmax25*JT-sqrt((alpha*(PAR*ABSP)+Jmax25*JT)^2-4*theta*alpha*(PAR*ABSP)*Jmax25*JT))/2/theta)*KMC*(1+O/KMO)-10.5*(Vcmx25*VCT)*GAMMAX)/(4.5*(Vcmx25*VCT)-((alpha*(PAR*ABSP)+Jmax25*JT-sqrt((alpha*(PAR*ABSP)+Jmax25*JT)^2-4*theta*alpha*(PAR*ABSP)*Jmax25*JT))/2/theta))),
                               yes = (Vcmx25*VCT)*VCCI-RD25*exp((1/298-1/(Tleaf+273))*46390/8.314),
                               no = (((alpha*(PAR*ABSP)+Jmax25*JT-sqrt((alpha*(PAR*ABSP)+Jmax25*JT)^2-4*theta*alpha*(PAR*ABSP)*Jmax25*JT))/2/theta)*VJCI)*(1-GAMMAX/Ci)-RD25*exp((1/298-1/(Tleaf+273))*46390/8.314)))

grd <- data.frame(RD25=c(0,2),
                  alpha=c(0.3,0.5),
                  theta=c(0.5,0.9),
                  Jmax25=c(30,280),
                  Vcmx25=c(10,100))

curve <- nls2(fo,
              data=p2,
              start = grd,
              algorithm = "random",
              control=list(maxiter=1000))
coef(curve)


final <- nls(fo, data = DATA, start = coef(curve), trace = TRUE, algorithm = "port")

summary(final)

因此nls2函数总是产生coef,但实际模型(nls)似乎不起作用。我放置了一些错误,这些错误取决于nls fit中的调整或在此处使用nlxb而不是nls时的错误:

Error in nls(fo, data = p2, start = coef(curve), trace = TRUE, algorithm = "port",  : 
  Convergence failure: false convergence (8)

Error in nlsModel(formula, mf, start, wts, upper) : 
  singular gradient matrix at initial parameter estimates

Error in deriv.default(residexpr, names(pvec)) : 
  Function 'ifelse' is not in the derivatives table

好消息是nls公式可以正常工作,因为nls2可以找到起始值(据我所知)。有时适合甚至似乎可以奏效,但大多数情况下无效!

我发现的一个解决方案是调整起始值,直到它起作用或强制其尝试10.000个参数,但我将在循环中使用此脚本来曲线拟合多个数据组。您可以理解为什么我不希望为每个拟合调整起始值,也不想等待永恒直到它适合每个数据组10.000次。

我在这个问题上坚持了好几个星期...试图让它起作用。也许由于ifelse问题,有人具有将nlin函数适合条件的经验吗?或者也许有人知道R中的另一个nlin函数?

或者我在R中不可能完成的任务?

0 个答案:

没有答案