基于LRT的二项式GLMM功效分析实现方案及思路问询
基于LRT的二项式GLMM功效分析实现方案及思路问询
Hi Sahila, 针对你提出的二项式广义线性混合模型(GLMM)结合似然比检验(LRT)的功效分析问题,我整理了一些实用的思路和实现方案,希望能帮到你:
一、关于你的核心思路合理性
- 你考虑针对模型对比的LRT做模拟功效分析,而非仅针对全模型的参数估计功效,这个思路完全合理,甚至更贴合你的研究假设——毕竟你的核心目标是检验“零模型是否比加入固定效应X的模型拟合更好”,直接模拟LRT的统计效力才是最直接对应你的研究问题的方式,完全不算过度复杂。
- 补充说明:如果只看全模型的参数估计功效,更多是检验“能否检测到X的效应存在”,和你通过LRT检验模型拟合差异的目标虽有相关性,但并非完全等价,所以你的方向是完全正确的。
二、实现针对LRT的模拟功效分析的方案
1. 使用simr包(推荐,便捷且专业)
simr是专门针对混合模型功效分析的工具包,原生支持通过LRT检验模型对比的功效,操作非常便捷:
- 核心步骤:
- 先构建一个模板模型:可以用你的真实预实验数据,或者根据预期效应量模拟的数据集,拟合出包含目标固定效应的GLMM
- 定义要对比的零模型(即移除目标固定效应X的模型)
- 调用
powerSim()函数直接模拟LRT的功效
- 示例代码片段:
# 加载所需包 library(simr) library(lme4) # 第一步:生成/导入模板数据(这里用模拟的预期数据示例) set.seed(123) # 设置随机种子保证可重复 dat <- data.frame( subject = rep(1:50, each = 2), # 50个个体,每个个体对应X的2个水平 X = rep(c("Level1", "Level2"), 50) # X的二分类水平 ) # 生成线性预测器:截距+X的效应+随机效应 dat$linpred <- -1 + 0.7*(dat$X == "Level2") + rnorm(50)[dat$subject]*sqrt(0.4) # 生成二项式响应变量 dat$y <- rbinom(nrow(dat), size = 1, prob = plogis(dat$linpred)) # 第二步:拟合包含X的全模型(模板模型) m_full <- glmer(y ~ X + (1|subject), data = dat, family = binomial) # 拟合零模型(移除X) m_null <- update(m_full, . ~ . - X) # 第三步:模拟LRT的功效 power_result <- powerSim( m_full, test = compare(m_null), # 指定对比的零模型 nsim = 1000, # 模拟次数,次数越多结果越稳定 alpha = 0.05 ) # 查看结果 print(power_result)
2. 手动模拟框架(高度自定义)
如果你需要更灵活的自定义逻辑(比如调整复杂的抽样方案、效应量组合),可以自己编写模拟循环:
- 核心步骤:
- 定义数据生成规则:根据你的预期效应量、随机效应方差等参数,生成符合二项式GLMM结构的模拟数据集
- 对每个模拟数据集,分别拟合零模型和包含X的模型
- 执行LRT并记录是否显著
- 重复N次模拟,计算显著结果的比例即为功效
- 示例代码片段:
library(lme4) library(purrr) # 设置模拟参数 n_sim <- 1000 # 模拟次数 alpha <- 0.05 # 预期模型参数:截距、X的效应、随机效应方差 fixed_params <- c(intercept = -0.8, X_effect = 0.6) ranef_var <- 0.3 n_subjects <- 60 # 个体数量 # 定义单次模拟函数 single_sim <- function() { # 生成模拟数据 dat <- data.frame( subject = rep(1:n_subjects, each = 2), X = rep(c("A", "B"), n_subjects) ) # 计算线性预测值 dat$linpred <- fixed_params["intercept"] + fixed_params["X_effect"]*(dat$X == "B") + rnorm(n_subjects)[dat$subject]*sqrt(ranef_var) # 生成二项式响应 dat$y <- rbinom(nrow(dat), 1, plogis(dat$linpred)) # 拟合模型并做LRT m0 <- glmer(y ~ 1 + (1|subject), data = dat, family = binomial) m1 <- glmer(y ~ X + (1|subject), data = dat, family = binomial) lrt_result <- anova(m0, m1) # 返回是否显著 return(lrt_result$`Pr(>Chisq)`[2] < alpha) } # 运行所有模拟并计算功效 power_results <- map_lgl(1:n_sim, ~single_sim()) estimated_power <- mean(power_results) cat("基于LRT的估计功效:", round(estimated_power, 3), "\n")
三、关于mixedpower的用法讨论
mixedpower的核心优势是模拟lme4拟合的GLMM的参数估计功效,但它确实没有直接支持LRT模型对比的功效分析。- 如果你的研究假设可以近似转化为“检测X的效应是否存在”,那么它的结果可以作为辅助参考,但和你通过LRT检验模型拟合差异的核心目标并不完全匹配。因此更建议优先采用前面提到的针对LRT的模拟方法。
备注:内容来源于stack exchange,提问作者Sahila




