线性混合加权回归R²的95%CI计算时bootstrap上下界相同问题求助
问题核心原因
你写的bootstrap统计函数存在逻辑错误:函数定义中接收了data(原始数据集)和indices(重抽样索引)两个参数,但拟合混合模型时硬编码调用了全局的原始数据集mtcars,完全没有使用重抽样得到的索引对应的子样本。每次迭代拟合的都是同一个完整数据集的模型,所有重复计算得到的R²值完全一致,最终得到的置信区间上下界自然相等。
另外你的示例代码还存在一个隐藏问题:lme()函数属于nlme包,但你只加载了lme4包,运行时会报错。
修正后可正常运行的代码
library(nlme) library(boot) library(MuMIn) # 修正统计函数逻辑:使用重抽样得到的子样本拟合模型 foo <- boot(mtcars, function(data, indices) { # 提取重抽样子样本 sub_data <- data[indices, ] mod <- lme(mpg ~ wt, data = sub_data, random = ~1|gear, weights = ~carb) # 此处取边际R²,如需条件R²改为取索引[2]即可 return(r.squaredGLMM(mod)[1]) }, R = 1000) # 原始全样本的R²值 foo$t0 # 计算95%分位数置信区间 quantile(foo$t, c(0.025, 0.975))
优化方案建议
- 可以采用分层bootstrap提升结果稳定性:按照随机效应的分组变量
gear分层抽样,避免重抽样时某组完全没有样本导致模型拟合失败,只需要在boot()函数中添加参数strata = mtcars$gear即可。 - 除了MuMIn包的
r.squaredGLMM(),你也可以使用performance包的r2()函数计算混合模型的R²,二者计算逻辑一致,输出结果没有差异。 - 加权混合模型的R²为加权后的拟合优度,不要直接和非加权模型的R²做横向对比。
内容的提问来源于stack exchange,提问作者dummy_sas
相关产品推荐
相关产品推荐

