You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 10:13:22