R中如何对包含随机效应的混合效应模型方程求解积分
问题原因
你之前的代码仅通过coefficients(summary(fitmixedmodel))提取了模型的总体固定效应系数,完全没有纳入按Var2分组的随机截距b_i,因此计算的积分仅对应总体平均的固定效应部分,没有体现分组随机效应的贡献。
由于你拟合的是仅含随机截距的混合模型,每个Var2分组的斜率项与固定效应完全一致,仅截距项为「固定效应截距 + 该组随机截距的BLUP(最佳线性无偏预测)值」,只需要在计算时匹配每个观测所属分组的对应截距即可。
修正实现代码
library(nlme) # 模型拟合部分和原有逻辑一致 fitmixedmodel <- lme(log(Var1)~I(exp(Var3/Var4))+ I((Var5/Var4)^3), random = ~1|Var2, data = dados, method="REML") # 第一步:提取每个Var2分组的完整系数(固定效应+对应组随机截距) coef_random <- as.data.frame(coef(fitmixedmodel)) coef_random$Var2 <- rownames(coef_random) colnames(coef_random) <- c("intercept", "beta1", "beta2", "Var2") # 第二步:修正被积函数,加入Var2分组参数匹配对应随机截距 fmixedmodel <- function(Var5, Var3, Var4, Var2){ # 匹配当前分组的系数 cur_coef <- coef_random[coef_random$Var2 == Var2, ] # 计算包含随机截距的线性预测值 linear_pred <- cur_coef$intercept + cur_coef$beta1 * exp(Var3/Var4) + cur_coef$beta2 * ((Var5/Var4)^3) # --- 重要:对数尺度反变换 --- # 模型响应变量是log(Var1),如果dh对应原始尺度的Var1,请取消下一行注释 # 若需要对数正态无偏预测,可再乘以exp(summary(fitmixedmodel)$sigma^2/2)做修正 # dh <- exp(linear_pred) # 若dh对应对数尺度的预测值,使用下一行 dh <- linear_pred (pi/40000)*(Var3^2)*dh } # 第三步:修正积分函数,传入Var2参数 vmixedmodel <- function(Var3, Var5, Var4, Var2){ integrate(Vectorize(fmixedmodel), lower = 0.1, upper = Var4, Var3 = Var3, Var4 = Var4, Var2 = Var2)$value } # 第四步:提取计算子集(需保留Var2分组列),逐行计算积分 volume <- dados[dados$Var5 == 0.1, ] mixed.vol <- mapply(FUN = vmixedmodel, Var5 = volume$Var5, Var3 = volume$Var3, Var4 = volume$Var4, Var2 = volume$Var2)
可选场景说明
- 上述代码计算的是条件积分结果:即针对每个具体
Var2分组,使用该组的随机截距计算,适用于需要对应每个样本/分组预测值的场景。 - 如果需要计算总体边际积分结果(不针对特定分组,反映总体平均水平),由于随机效应
b_i ~ N(0, σ_b²),需要将原有单积分扩展为二重积分:外层对b_i按正态分布密度加权积分,内层对Var5积分,不能直接使用固定效应截距代替(对数变换后的非线性映射会带来偏差)。
校验方法
可以通过ranef(fitmixedmodel)查看每个分组的随机截距估计值,对比coef_random$intercept和固定效应截距fixef(fitmixedmodel)[1],即可看到每个组的截距在固定截距基础上的浮动值,确认随机效应已正确纳入。
内容的提问来源于stack exchange,提问作者user55546
相关产品推荐
相关产品推荐

