使用SSasymp拟合指数衰减模型添加河口固定效应报错如何解决?
报错根本原因
groupedData的公式仅用于定义「响应变量~连续自变量|分组变量」,不需要将固定效应estuary写入自变量部分- 不能直接将
+ estuary拼接在SSasymp()自启动函数外,这种非线性函数+线性项的写法不符合nls/nlsList的公式语法,导致自启动函数无法生成有效的初始值,触发start为NULL的报错 - 额外注意:
nlsList是按分组(station)独立拟合模型,而每个station固定属于某一个河口,estuary在station组内是常数,也无法被纳入nlsList的回归项。
正确模型构建方法
不需要提前运行nlsList,直接通过nlme的完整参数指定固定效应、随机效应结构即可,示例如下:
library(nlme) # 提前转换分类变量 df$estuary <- as.factor(df$estuary) df$station <- as.factor(df$station) # 构建纳入河口固定效应的非线性混合模型 df.nlme_est <- nlme( # 基础非线性关系:盐度和排放量的指数衰减关系 model = salinity ~ SSasymp(discharge, Asym, R0, lrc), data = df, # 固定效应定义:此处假设三个核心参数(渐近线Asym、零流量截距R0、对数衰减率lrc)都受河口影响 # 你可以根据研究假设调整,比如只让Asym受河口影响 fixed = list(Asym ~ estuary, R0 ~ estuary, lrc ~ estuary), # 随机效应定义:每个站点的三个参数有独立随机偏差,用pdDiag可以简化协方差结构提升收敛性 random = list(station = pdDiag(list(Asym ~ 1, R0 ~ 1, lrc ~ 1))), # 迭代控制 control = list(MaxIter = 200, msVerbose = TRUE) )
简化写法参考
如果收敛困难,可以简化参数结构,比如假设只有极限盐度(Asym)存在河口差异,另外两个参数四个河口一致,修改fixed参数即可:
fixed = list(Asym ~ estuary, R0 ~ 1, lrc ~ 1)
内容的提问来源于stack exchange,提问作者Splash1199
相关产品推荐
相关产品推荐

