在R中用nlme和SSasympOrig为渐近回归模型加协变量遇问题
问题:用nlme复现drc中AR.2分组渐近模型的报错解决
现有drc模型
已使用drc库拟合分组渐近模型,代码如下:
library(drc) library(nlme) library(dplyr) df <- structure(list(iv = c(1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6), dv = c(9.2, 8.5, 13.5, 15.8, 18.3, 17.7, 8.7, 10.8, 14.3, 15, 18, 15.3, 8.7, 14.6, 14.8, 16.8, 15.8, 15.8, 14.2, 13.5, 18.5, 20.8, 23.3, 22.7, 13.7, 15.8, 19.3, 20, 23, 20.3, 13.7, 19.6, 19.8, 21.8, 20.8, 20.8), group = c("1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "2", "2", "2", "2", "2", "2", "2", "2", "2", "2", "2", "2", "2", "2", "2", "2", "2", "2")), row.names = c(NA, -36L), class = c("tbl_df", "tbl", "data.frame")) drm_mod <- drm( dv ~ iv, curveid = group, data = df, fct = AR.2(names = c("Upper Limit", "Steepness")) )
报错情况
尝试用nlme复现模型时出现两类错误:
错误1:指定groups参数时
执行代码:
nlme_mod <- nlme(dv ~ SSasympOrig(iv, Asm, lrc), data=df, fixed= list(Asym + lrc ~ group), groups = group, random = ~ 1)
得到报错:
Error: object 'group' not found 2. nlme.formula(dv ~ SSasympOrig(iv, Asm, lrc), data = df, fixed = list(Asym + lrc ~ group), groups = group, random = ~1) 1. nlme(dv ~ SSasympOrig(iv, Asm, lrc), data = df, fixed = list(Asym + lrc ~ group), groups = group, random = ~1)
错误2:移除groups参数时
执行代码:
nlme_mod <- nlme(dv ~ SSasympOrig(iv, Asm, lrc), data=df, fixed= list(Asym + lrc ~ group), # groups = group, random = ~ 1)
得到报错:
Error in nlsList.formula(model = dv ~ SSasympOrig(iv, Asm, lrc), data = df) : 'data' must be a "groupedData" object if 'formula' does not include groups 8. stop("'data' must be a \"groupedData\" object if 'formula' does not include groups") 7. nlsList.formula(model = dv ~ SSasympOrig(iv, Asm, lrc), data = df) 6. nlme::nlsList(model = dv ~ SSasympOrig(iv, Asm, lrc), data = df) 5. eval(expr, p) 4. eval(expr, p) 3. eval.parent(nlsLCall) 2. nlme.formula(dv ~ SSasympOrig(iv, Asm, lrc), data = df, fixed = list(Asym + lrc ~ group), random = ~1) 1. nlme(dv ~ SSasympOrig(iv, Asm, lrc), data = df, fixed = list(Asym + lrc ~ group), random = ~1)
解决方法
报错根源在于参数格式错误、模型参数名写错,以及随机效应设定不符合“观测独立”的前提:
- 修正参数名:
SSasympOrig的渐近值参数是Asym,而非代码中的Asm - groups参数格式:必须传入公式对象
~group,不能直接写变量名 - fixed参数格式:无需用list包裹,直接用公式
Asym + lrc ~ group指定两个参数随分组变化 - 随机效应设定:因所有观测独立,无随机变异,将
random设为~0
修正后的nlme代码
nlme_mod <- nlme( dv ~ SSasympOrig(iv, Asym, lrc), data = df, fixed = Asym + lrc ~ group, groups = ~group, random = ~0 ) # 查看结果 summary(nlme_mod)
更贴合drc模型的替代方案
由于drc的模型是分组固定效应模型(无随机效应),使用nlsList更简洁,结果与drc完全一致:
nls_mod <- nlsList( dv ~ SSasympOrig(iv, Asym, lrc) | group, data = df ) # 查看分组参数 summary(nls_mod)
内容的提问来源于stack exchange,提问作者myfatson
相关产品推荐
相关产品推荐

