lmer模型Ranef_pred阶段报错:无法计算预测值求助
问题分析与解决方案
错误核心原因
报错提示的关键信息是:拟合lmer模型时,Greenland和Saint Kitts and Nevis这两个国家因数据缺陷被自动排除(比如单国家仅1条观测、Unemployment在该国无变异,导致随机效应无法估计),但你调用predictions()时传入的原始数据集mammals仍包含这两个国家的观测,模型找不到对应国家的随机效应参数,因此触发错误。
另外代码存在一个隐藏bug:Average_dat用Forest变量生成序列,但你的模型unemploymod根本未将Forest作为自变量,后续Average_pred的生成会因缺少模型必需的Unemployment变量而失败。
修正步骤
1. 确认模型实际包含的国家
先运行以下代码,明确模型拟合后保留的国家水平:
# 查看模型中实际纳入的国家 model_countries <- levels(unemploymod@frame$Country) model_countries # 对比原始数据,找出被排除的国家 original_countries <- unique(mammals$Country) setdiff(original_countries, model_countries)
2. 过滤数据集,匹配模型的国家范围
修改Ranef_pred的newdata参数,仅传入模型中存在的国家观测:
# 过滤原始数据,只保留模型拟合时用到的国家 mammals_filtered <- mammals %>% filter(Country %in% model_countries) Ranef_pred <- predictions(model = unemploymod, newdata = mammals_filtered, # 使用过滤后的数据集 conf_level = .95, re.form = ~(Unemployment | Country) ) %>% mutate(Log_preds = 10^estimate, Log_low = 10^conf.low, Log_high = 10^conf.high)
3. 修正Average_dat的变量错误
将无关的Forest替换为模型的核心自变量Unemployment:
Average_dat <- mammals_filtered %>% summarise(Unemployment = seq(from = min(Unemployment, na.rm = TRUE), to = max(Unemployment, na.rm = TRUE), length.out = 100)) Average_pred <- predictions(unemploymod, newdata = Average_dat, conf_level = .95, re.form = NA ) %>% mutate(Log_preds = 10^estimate, Log_low = 10^conf.low, Log_high = 10^conf.high)
4. 同步修正ggplot的数据源
确保绘图使用过滤后的数据集,避免变量不匹配:
ggplot(mammals_filtered, aes(Unemployment, Vol)) + facet_wrap(~Country) + geom_point() + geom_ribbon(data = Ranef_pred, aes(Unemployment, ymin = Log_low, ymax = Log_high), fill = "cyan4", colour = "cyan4", alpha = .25) + geom_line(data = Ranef_pred, aes(Unemployment, Log_preds)) + theme_minimal()
额外优化建议
拟合模型前可提前检查数据质量,过滤不符合要求的国家:
# 检查每个国家的观测数(少于2条的国家无法估计随机效应) mammals %>% count(Country) %>% filter(n < 2) # 检查每个国家Unemployment的变异(标准差为0的国家会被lmer自动排除) mammals %>% group_by(Country) %>% summarise(unemp_sd = sd(Unemployment, na.rm = TRUE)) %>% filter(is.na(unemp_sd) | unemp_sd == 0)
内容的提问来源于stack exchange,提问作者Rstudioamateur
相关产品推荐
相关产品推荐

