含交叉分类协变量的非线性混合模型:生成各组组合的带参数估计的模型方程及参数获取方法
获取Type*Treatment组合的模型方程参数的简便方法
针对你拟合的带偏移量的渐近回归非线性混合模型,想要获取Type*Treatment四个交叉组合对应的带参数估计的模型方程,其实很容易实现——核心是利用固定效应的参数结构,要么手动计算理解逻辑,要么用R代码自动提取生成,下面详细说明:
先明确模型核心结构
我们用的SSasympOff函数对应的模型公式是:
uptake = Asym × (1 - exp(-exp(lrc) × (conc - c0))) ,当 conc ≥ c0 uptake = 0 ,当 conc < c0
其中:
c0是全局固定值(模型设定c0 ~ 1)Asym和lrc都由Type*Treatment交互项决定,每个交叉组合都有专属的Asym和lrc,由固定效应的截距加上对应效应项计算而来。
方法1:手动计算(适合理解参数对应关系)
从模型摘要的固定效应部分,我们可以直接推导四个组合的参数:
基准组是Type=Quebec, Treatment=nonchilled,其他组在基准组基础上加上对应的效应项:
Quebec + nonchilled组
- Asym =
Asym.(Intercept)= 41.81755 - lrc =
lrc.(Intercept)= -4.55726 - c0 = 50.50804
方程:
当 conc ≥ 50.508 时,uptake = 41.818 × (1 - exp(-exp(-4.557) × (conc - 50.508)))
当 conc < 50.508 时,uptake = 0- Asym =
Quebec + chilled组
- Asym = 41.81755 + (-2.96942) = 38.84813
- lrc = -4.55726 + (-0.17124) = -4.72850
- c0 = 50.50804
Mississippi + nonchilled组
- Asym = 41.81755 + (-10.53047) = 31.28708
- lrc = -4.55726 + (-0.10411) = -4.66137
- c0 = 50.50804
Mississippi + chilled组
- Asym = 41.81755 -10.53047 -2.96942 -10.89926 = 17.41840
- lrc = -4.55726 -0.10411 -0.17124 + 0.74124 = -4.09137
- c0 = 50.50804
方法2:R代码自动提取(简便高效,适合批量处理)
如果不想手动计算,可以用以下代码直接生成所有组合的参数和模型方程:
步骤1:提取固定效应系数
# 提取模型的固定效应系数 fixed_coef <- fixef(fm4CO2.nlme)
步骤2:生成所有Type*Treatment组合
# 创建包含所有交叉组合的数据集 groups <- expand.grid( Type = unique(CO2$Type), Treatment = unique(CO2$Treatment) )
步骤3:计算每个组合的Asym和lrc
利用模型矩阵自动计算每个组的参数,避免手动加减出错:
# 计算Asym:基于Type*Treatment的设计矩阵 asym_design <- model.matrix(~ Type * Treatment, data = groups) groups$Asym <- as.numeric(asym_design %*% fixed_coef[grep("Asym", names(fixed_coef))]) # 计算lrc:同理 lrc_design <- model.matrix(~ Type * Treatment, data = groups) groups$lrc <- as.numeric(lrc_design %*% fixed_coef[grep("lrc", names(fixed_coef))]) # 添加全局固定的c0 groups$c0 <- fixed_coef["c0"]
步骤4:自动生成模型方程文本
如果想要直接得到每个组的可读方程,可以用mapply拼接文本:
# 生成每个组的模型方程 groups$model_equation <- mapply(function(asym_val, lrc_val, c0_val, type, trt) { exp_lrc = exp(lrc_val) paste0( "【", type, " + ", trt, "组】\n", "当 conc ≥ ", round(c0_val, 3), " 时:\n", "uptake = ", round(asym_val, 3), " × (1 - exp(-", round(exp_lrc, 5), " × (conc - ", round(c0_val, 3), ")))\n", "当 conc < ", round(c0_val, 3), " 时:\n", "uptake = 0" ) }, groups$Asym, groups$lrc, groups$c0, groups$Type, groups$Treatment) # 输出所有方程 cat(paste(groups$model_equation, collapse = "\n\n"))
运行后你会得到四个组的完整模型方程,参数都是已经估计好的数值,直接可用。
内容的提问来源于stack exchange,提问作者emudrak




