3参数对数增长曲线的最大似然估计

时间:2017-09-30 03:09:32

标签: r mathematical-optimization nonlinear-optimization mle

我试图将分析模型与我观察到的人体体细胞生长数据相吻合。广义模型是3参数对数增长曲线,其中:

s= B0+B1*t+B2*log(t),

其中s是生长参数,无论是骨长度还是身高,t是年龄。

我试图通过各种代码迭代来形成似然函数并最大化返回的参数。说实话,我完全不确定我是否正确地写了这个,但是最近我尝试的迭代看起来像使用数据框标题“cedar”:

cedar.f<-function(b){sum((cedar$FLEN~b[0]+b[1]*cedar$MINAGE+b[2]*log(cedar$MINAGE))^2)}
cedar.optimx<-optimx(c(0,0,0), fn = cedar.f, control = list(all.methods=TRUE, save.failures=TRUE, maxit=5000, maximize=TRUE))

cedar$MINAGE=c(2.5,0.5,6,0.01,0.01,0.01,1,0.01,12,0.01,0.01,1,12,1,4.5,1,4.5,0.01,7.8,11,4,7.5,9,0.25,0.01,0.01,0.01,0.1,1,1,0.01,0.01)
cedar$FLEN=c(167,150,300,54,60,78,152,72, 452,84,81,163,450,137,271,151,261,73,330,378,226,319,378,89,78,89,65,81,144,122,  50,55

上面,我提供了我对功能和优化的尝试。我在尝试这样做时收到了一些错误,包括:

argument "cedar" is missing ,no default
non-numeric argument to binary operator

真的,我在这里询问任何人在编写此功能时可能会有什么建议,以便最大限度地将数据拟合到分析人类生长曲线。如果我正在解决这个错误/写错了函数,那么任何帮助都会受到赞赏。

谢谢大家。

1 个答案:

答案 0 :(得分:1)

cedar <- data.frame(MINAGE=c(2.5,0.5,6,0.01,0.01,0.01,1,0.01,12,0.01,0.01,1,12,1,4.5,1,4.5,0.01,7.8,11,4,7.5,9,0.25,0.01,0.01,0.01,0.1,1,1,0.01,0.01),
         FLEN=c(167,150,300,54,60,78,152,72,452,84,81,163,450,137,271,151,261,73,330,378,226,319,378,89,78,89,65,81,144,122,50,55))

# Sum of squared errors
# Minus sign is for function minimization    
cedar.f <- function(b) { 
    -sum( (cedar$FLEN - (b[1] + b[2]*cedar$MINAGE + b[3]*log(cedar$MINAGE)))^2 )
}

library(optimx)
cedar.optimx <- optimx( c(1,1,1), fn = cedar.f, 
    control = list(all.methods=TRUE, save.failures=TRUE, maxit=5000, maximize=TRUE))

#                 p1       p2       p3          value fevals gevals niter convcode kkt1 kkt2 xtimes
# BFGS        120.4565 24.41910 11.25419  -7.674935e+03     25      8    NA        0 TRUE TRUE   0.00
# CG          120.4565 24.41910 11.25419  -7.674935e+03   1072    298    NA        0 TRUE TRUE   0.15
# Nelder-Mead 120.4714 24.41647 11.25186  -7.674947e+03    258     NA    NA        0 TRUE TRUE   0.02
# L-BFGS-B    120.4565 24.41910 11.25419  -7.674935e+03     17     17    NA        0 TRUE TRUE   0.01
# nlm         120.4564 24.41910 11.25417  -7.674935e+03     NA     NA    12        0 TRUE TRUE   0.01
# nlminb      120.4565 24.41910 11.25419  -7.674935e+03     21     48    13        0 TRUE TRUE   0.02
# spg         120.4565 24.41910 11.25419  -7.674935e+03     99     NA    92        0 TRUE TRUE   0.06
# ucminf      120.4564 24.41910 11.25417  -7.674935e+03     10     10    NA        0 TRUE TRUE   0.00
# Rcgmin            NA       NA       NA -8.988466e+307     NA     NA    NA     9999   NA   NA   0.00
# Rvmmin            NA       NA       NA -8.988466e+307     NA     NA    NA     9999   NA   NA   0.00
# newuoa      120.4565 24.41910 11.25419  -7.674935e+03    118     NA    NA        0 TRUE TRUE   0.01
# bobyqa      120.4565 24.41910 11.25419  -7.674935e+03    142     NA    NA        0 TRUE TRUE   0.02
# nmkb        120.4566 24.41907 11.25421  -7.674935e+03    213     NA    NA        0 TRUE TRUE   0.03
# hjkb          1.0000  1.00000  1.00000  -1.363103e+06      1     NA     0     9999   NA   NA   0.00

或者,可以使用简单的线性模型估计模型系数:

fitlm <- lm(FLEN~MINAGE+log(MINAGE), data=cedar)
coef(fitlm)

# Intercept)      MINAGE log(MINAGE) 
#  120.45654    24.41910    11.25419

估算的函数可以绘制如下:

optpar <- as.matrix(cedar.optimx[1,1:3])
estim_fun <- function(x, b=optpar) { 
    b[1] + b[2]*x + b[3]*log(x)
}
curve(estim_fun, from=min(cedar$MINAGE), to=max(cedar$MINAGE))

enter image description here