lme4使用样本量与完整案例数据集存在差异的原因及排查方法
针对lme4分层模型缺失值问题的解决方法
问题1:lme4为何会使用4个非完整案例?
你统计的“模型变量完整案例数337”和lme4实际用的341不一致,核心原因是你计算完整案例时的变量范围和lme4实际用到的变量范围不匹配:
- lme4默认用
na.omit处理缺失值,只会剔除**模型公式中涉及的所有变量(固定效应、随机效应、权重/偏移项等)**存在缺失的行,完全不会理会数据集里没用到的其他变量。 - 你计算完整案例时可能误把模型没用到的变量也算进去了,导致统计的完整案例数比lme4实际保留的少。
- 另外排查下:有没有在模型中使用
offset()、weights()这类你没纳入完整案例统计的变量?这些变量的缺失也会被lme4纳入剔除逻辑,但如果你的统计没包含它们,就会出现数字差。
问题2:如何找出lme4实际使用的观测值ID?
给你几个简单直接的方法:
- 方法1:从模型对象提取被保留行号
假设你的模型叫model,原数据集叫dat,执行以下代码:# 获取被保留的行号 kept_rows <- setdiff(1:nrow(dat), model$na.action) # 提取对应的ID kept_ids <- dat$ID[kept_rows] - 方法2:直接提取模型使用的数据集
用model.frame()获取lme4实际用来拟合的数据集,直接从中取ID:model_dat <- model.frame(model) kept_ids <- model_dat$ID - 方法3:利用拟合值的索引
拟合值fitted(model)的长度就是341,它的行名对应原数据集的行号,转成数字后提取ID:kept_rows <- as.numeric(rownames(fitted(model))) kept_ids <- dat$ID[kept_rows]
额外验证步骤
如果还是对不上,先确认模型用到的所有变量,再重新计算完整案例数:
# 列出模型中涉及的所有变量 all_model_vars <- all.vars(formula(model)) # 用这些变量计算真实的完整案例数 true_complete_cases <- sum(complete.cases(dat[all_model_vars]))
这个数字应该和lme4输出的341一致,能帮你定位之前统计完整案例时的错误。
内容的提问来源于stack exchange,提问作者Justin Research
相关产品推荐
相关产品推荐

