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

for循环中用broom::tidy提取gnm对象结果遇收敛错误

循环拟合gnm条件泊松模型的收敛问题解决

可能的触发原因

  • 循环环境与单独运行的收敛判定逻辑差异:gnm在批量拟合时默认的收敛检查更严格,i=1的模型在循环中未通过判定,但单独运行时宽松的阈值允许其通过。
  • 循环内变量未完全隔离:数据子集或模型公式若未在每次循环中重新创建,可能残留上一次拟合的参数状态,导致数值计算异常。
  • 资源分配差异:循环运行时内存占用更高,可能降低数值计算精度,引发收敛警告和NaN。

针对性解决方案

1. 手动调整收敛控制参数

显式设置gnm的迭代次数和收敛容忍度,给模型足够的收敛空间:

results <- vector("list", 12)
for (i in 1:12) {
  sub_data <- your_data[your_data$stratum == i, ]
  fit <- gnm(
    y ~ x + offset(log(exposure)) + strata(stratum),
    data = sub_data,
    family = poisson,
    control = gnm.control(maxit = 1000, epsilon = 1e-6)
  )
  results[[i]] <- broom::tidy(fit, exponentiate = TRUE, conf.int = TRUE)
}

maxit提升最大迭代次数,epsilon降低收敛判定的阈值,避免因迭代不足触发收敛警告。

2. 确保循环内变量完全独立

每次循环都重新定义数据子集和模型公式,避免外部变量的干扰:

results <- vector("list", 12)
for (i in 1:12) {
  # 每次循环重新生成数据子集
  current_data <- dplyr::filter(your_data, stratum == i)
  # 每次循环重新构建公式
  model_formula <- as.formula("y ~ predictor + offset(log(exposure)) + strata(stratum)")
  
  fit <- gnm(model_formula, data = current_data, family = poisson)
  results[[i]] <- broom::tidy(fit, exponentiate = TRUE, conf.int = TRUE)
}

3. 捕获警告并重新拟合

针对i=1的收敛警告,用tryCatch捕获后重新拟合,或关闭参数剖面检查:

results <- vector("list", 12)
for (i in 1:12) {
  current_data <- your_data[your_data$stratum == i, ]
  fit <- tryCatch(
    expr = gnm(your_formula, data = current_data, family = poisson),
    warning = function(w) {
      if (grepl("profiling has found a better solution", w$message)) {
        # 关闭剖面检查重新拟合
        gnm(your_formula, data = current_data, family = poisson,
            control = gnm.control(profiler = FALSE))
      } else {
        # 其他警告直接抛出
        stop(w)
      }
    }
  )
  results[[i]] <- broom::tidy(fit, exponentiate = TRUE, conf.int = TRUE)
}

关闭profiler会跳过后续的参数优化检查,适合确认模型参数已经稳定的场景。

4. 为特殊 strata 手动设置初始值

如果i=1的 strata 样本量小或数据特殊,单独拟合获取初始值后再代入循环:

results <- vector("list", 12)
for (i in 1:12) {
  current_data <- your_data[your_data$stratum == i, ]
  if (i == 1) {
    # 单独拟合获取稳定的初始参数
    init_fit <- gnm(your_formula, data = current_data, family = poisson)
    fit <- gnm(your_formula, data = current_data, family = poisson, start = coef(init_fit))
  } else {
    fit <- gnm(your_formula, data = current_data, family = poisson)
  }
  results[[i]] <- broom::tidy(fit, exponentiate = TRUE, conf.int = TRUE)
}

内容的提问来源于stack exchange,提问作者doraemon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 15:14:52