#rstats 生长曲线、生长方程、逻辑斯蒂与nls R_square

我本身不做生长方程拟合,而身边常有。拟合模型时在初始值选择上常遇见困难,时而成功,时而报错。该怎么选择初始值?


更新:经@木䬕的提示和参考3中的例子,发现R可以自动给初始值,如逻辑斯蒂用SSlogis(),渐进回归模型SSasymp()

# SSlogis
nlsfitSS <- nls(height ~ SSlogis(age, Asym, xmid, scal),
                data=Loblolly)
# SSasymp
nlsfitSS <- nls(height ~ SSasymp(age, Asym, R0, lrc),
                data=Loblolly)
# 0.993144

SSlogis()的模型形式与正文中给出的不同,但结果是一样的。
Y = \frac{a}{1+e^{(b-time)/c}}
abc分别对应Asym,xmid和scal。
SSasymp()的模型形式为
Y = a+(b-a)*e^{-exp(c)*time}
abc分别对应Asym,R0和lrc。
另外,R还提供SSasympOff, SSasympOrig, SSbiexp, SSfol, SSfpl, SSgompertz, SSmicmen, SSweibull这些函数供使用。


介绍

生长方程是森林经理上生物量估计,或是数量遗传学中功能作图用到的几个可以拟合生物生长过程函数。常见的有:

  1. 理查德
    Y = Y_{max}*(1-e^{-b*time})^c
  • Y_{max}【有些写作a】:渐近线,即成年稳定值,停止生长,理论上的最大值;
  • b:增长参数,描述接近渐近线的速度,越大说明单位时间内生长得越快;
  • c:没有特别含义。
  1. 逻辑斯蒂
    Y = \frac{a}{1+e^{-(b+c*time)}}
  • 参数意义与理查德近似。

数据

# R中自带数据Loblolly
data(Loblolly)
# 散点图查看关系
plot(Loblolly$height~Loblolly$age)
图1. height~age.png

构建方程函数

# 理查德
f_richard <- function(x, a, b, c){
  return(a*(1-exp(-b*x))^c)
}
# 逻辑斯蒂
f_logist <- function(x, a, b, c){
  return(a/(1+exp(-(b+c*x))))
}

拟合

  1. 理查德
    理查德初始值没有好的方法,只能试,但不是随意的试,要按照一定规则:知道a是渐近线,通过图1可以看到大致在60的位置,所以设置为60;b是速率,要大于0,一般设置为0.1,c没有太大限制。然后可以通过画图来查看你给定的这一组初始值效果:
# 理查德初始值
plot(Loblolly$height~Loblolly$age)
curve(f_richard(x, a=60, b=0.1, c=2), add=T)
图2. 理查德初始值

效果还可以,那么运行一下模型:

m_richard <- nls(height ~ f_richard(age, a, b, c),
                 data=Loblolly,
                 start=list(a=60, b=0.1, c=2))
summary(m_richard)
# Formula: height ~ f_richard(age, a, b, c)
# 
# Parameters:
#   Estimate Std. Error t value Pr(>|t|)    
# a 76.933519   2.580073   29.82   <2e-16 ***
#   b  0.082659   0.006067   13.62   <2e-16 ***
#   c  1.846938   0.093736   19.70   <2e-16 ***
#   ---
#   Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
# 
# Residual standard error: 1.731 on 81 degrees of freedom
# 
# Number of iterations to convergence: 4 
# Achieved convergence tolerance: 9.319e-07
  1. 逻辑斯蒂
    逻辑斯蒂的初始值设置相对容易些,先拟合一个对响应变量log转换的线性模型,将得到的系数视为初始值:
coef(lm(log(height/60)~age,data=Loblolly))
# (Intercept)         age 
# -2.409599    0.111560 

这里60也是渐近线值,b和c分别是-2.4和0.1,。然后拟合模型:

m_logist <- nls(height ~ f_logist(age, a, b, c),
                data=Loblolly,
                start=list(a=60, b=-2.4, c=0.1))
summary(m_logist)
# Formula: height ~ f_logist(age, a, b, c)
# 
# Parameters:
#   Estimate Std. Error t value Pr(>|t|)    
# a 61.344070   0.984761   62.29   <2e-16 ***
#   b -2.731120   0.083262  -32.80   <2e-16 ***
#   c  0.231854   0.009177   25.27   <2e-16 ***
#   ---
#   Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
# 
# Residual standard error: 2.657 on 81 degrees of freedom
# 
# Number of iterations to convergence: 10 
# Achieved convergence tolerance: 1.234e-06

都可以成功运行。
最终的拟合效果间图3。


图3. 拟合效果。红-理查德;蓝-逻辑斯蒂

模型评估R^2

quasi.rsq.nls <- function (mdl, y, param){
  adj <- (sum(!is.na(y)) - 1)/(sum(!is.na(y)) - param)
  sum.sq <- (sum(!is.na(y)) - 1) * var(y, na.rm = TRUE)
  rsq <- 1 - (adj * (deviance(mdl)/sum.sq))
  return(rsq)
}
# sample
quasi.rsq.nls(m_richard, Loblolly$height, param=3)
quasi.rsq.nls(m_logist, Loblolly$height, param=3)
#0.9929895
#0.9834879

理查德略优。

参考:

  1. Modeling Logistic Growth Data in R
  2. Fitting Non-Linear Growth Curves in R
  3. Non-linear regression
  4. quasi.rsq.nls
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,542评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,822评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,912评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,449评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,500评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,370评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,193评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,074评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,505评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,722评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,841评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,569评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,168评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,783评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,918评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,962评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,781评论 2 354