You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

R语言lcmm包潜类别混合模型估计结果解读及固定效应提取方法咨询

R语言lcmm包潜类别混合模型估计结果解读及固定效应提取方法咨询

我刚好也处理过类似的问题,lcmm的参数化方式确实容易让人困惑,尤其是和glmmTMB这类常规混合模型对比的时候,我来一步步给你拆解:


先明确核心矛盾:lcmm的参数化逻辑和常规混合模型不同

你用ng=1的lcmm模型其实等价于标准混合模型,但lcmm为了保证随机效应协方差矩阵的正定性,对固定效应+随机效应的联合参数用了Cholesky变换,这直接导致estimates(mdl_lcmm)的输出和fixef(mdl_glmm)看起来差异很大,但本质上是同一个模型的不同参数化形式——你用predictY算出的Time效应和glmmTMB完全一致,就是最好的证明。


一、lcmm的估计值到底代表什么?

先对应你的estimates(mdl_lcmm)输出逐个解释:

estimates(mdl_lcmm)
#>                 Time           cholesky 1           cholesky 2 
#>           -1.1766242            0.5841368            0.2896645 
#>           cholesky 3 Linear 1 (intercept)   Linear 2 (std err) 
#>            0.9076947           25.7960918            2.2388864
  1. Linear 1 (intercept):这就是模型的固定截距,和glmmTMB的(Intercept)(25.796)完全一致,这个是直观的。
  2. Time(-1.1766):这不是你熟悉的常规固定效应系数!它是经过Cholesky变换后的参数,用来联合构建固定效应和随机效应的结构,不能直接解读为Time的边际影响。
  3. cholesky 1/2/3:这些是随机效应协方差矩阵的Cholesky分解元素,目的是保证随机效应的方差-协方差矩阵正定(数值计算的稳定性要求),对应glmmTMB中VarCorr(mdl_glmm)输出的随机效应方差/协方差,但参数化方式不同。
  4. Linear 2 (std err):这是模型的残差标准差,和glmmTMB的残差标准差(可以用sigma(mdl_glmm)查看)是对应的。

而你用predictY算出的-2.634,才是真正的Time边际效应——也就是我们常规理解的"每增加1单位Time,Ydep2平均变化多少",和glmmTMB的fixef(mdl_glmm)$Time完全一致。


二、如何从lcmm提取"常规"固定效应+95%置信区间?

因为lcmm不兼容emmeans、broom这类工具,我们需要手动处理,这里给你两种可靠的方法:

方法1:用predictY计算边际效应 + 自助法(Bootstrap)估算置信区间

这是最直观、不容易出错的方法,因为predictY直接输出模型的边际预测值(平均了随机效应的影响),我们只需要对比不同Time取值的预测差,再用bootstrap估算置信区间:

library(boot)
set.seed(123) # 保证结果可复现

# 1. 定义要对比的Time取值(比如Time=0和Time=1,对应效应量的计算)
newdat <- data.frame(Time = c(0, 1))

# 2. 计算基础的Time效应
base_pred <- predictY(mdl_lcmm, newdata = newdat, var.time = "Time", subject = "ID", data = data_lcmm)
time_effect <- base_pred$pred[2, "Ypred"] - base_pred$pred[1, "Ypred"]
cat("Time的边际效应:", round(time_effect, 3), "\n") # 和glmmTMB的fixef一致

# 3. 写bootstrap函数:重拟合模型+计算效应量
boot_func <- function(data, indices) {
  boot_data <- data[indices, ]
  # 重拟合lcmm模型,关闭verbose加快速度
  boot_mdl <- lcmm(Ydep2~Time, random=~Time, subject='ID', ng=1, 
                   data=boot_data, link="linear", verbose = FALSE)
  # 计算该bootstrap样本的Time效应
  boot_pred <- predictY(boot_mdl, newdata = newdat, var.time = "Time", 
                        subject = "ID", data = boot_data)
  return(boot_pred$pred[2, "Ypred"] - boot_pred$pred[1, "Ypred"])
}

# 运行bootstrap(R=1000是常用值,数据量大的话可以调小)
boot_result <- boot(data = data_lcmm, statistic = boot_func, R = 1000)

# 提取95%百分位数置信区间
ci_95 <- boot.ci(boot_result, type = "perc")
print(ci_95)

方法2:从lcmm的参数反推固定效应(适合熟悉参数化的用户)

如果你想直接从estimates(mdl_lcmm)的参数反推,需要利用Cholesky变换的逆变换,但步骤比较繁琐,不如predictY直观。不过可以验证:lcmm中固定效应的Time系数 = (变换后的Time参数) / (Cholesky 3参数) × 残差标准差?不对,其实更准确的是,ng=1时lcmm的模型和glmmTMB等价,你可以用mdl_lcmm$best获取原始拟合参数,再结合Cholesky分解还原协方差矩阵,但这个过程容易出错,更推荐方法1。


额外提示:如果之后用ng>1的潜类别模型怎么办?

如果你之后拟合真正的多类别潜类别模型(ng≥2),每个类别的固定效应可以通过predictYclass参数指定类别来计算,再结合类别的 posterior 概率计算总体的加权边际效应,置信区间同样可以用bootstrap方法扩展。


最后验证一致性

可以再确认一下核心参数的对应关系:

# 截距完全一致
cat("lcmm截距:", round(estimates(mdl_lcmm)["Linear 1 (intercept)"], 3), "\n")
cat("glmmTMB截距:", round(fixef(mdl_glmm)[["(Intercept)"]], 3), "\n")

# Time效应完全一致
cat("lcmm预测的Time效应:", round(time_effect, 3), "\n")
cat("glmmTMB的Time固定效应:", round(fixef(mdl_glmm)[["Time"]], 3), "\n")

这样你就能得到和常规混合模型一致的固定效应,以及对应的95%置信区间了!

火山引擎 最新活动