You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

解决方法

报错根源在于参数格式错误、模型参数名写错,以及随机效应设定不符合“观测独立”的前提:

  1. 修正参数名:SSasympOrig的渐近值参数是Asym,而非代码中的Asm
  2. groups参数格式:必须传入公式对象~group,不能直接写变量名
  3. fixed参数格式:无需用list包裹,直接用公式Asym + lrc ~ group指定两个参数随分组变化
  4. 随机效应设定:因所有观测独立,无随机变异,将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 19:55:57