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

R语言负二项回归模型的预测区间求解及新数据报错问题

负二项回归新数据预测区间报错的解决方法

问题根源

ciTools::add_pi()处理glm.nb模型时,内部模拟逻辑依赖原始训练数据集的样本量(这里是50)。当你在原数据后追加3行新数据,总样本量变为53,模拟生成的随机数长度与新数据长度不匹配,从而触发报错。

方案1:单独构建新预测数据集(最简解决)

不要在原cars数据中追加新行,而是单独创建仅包含待预测点的数据框,再传入add_pi():

# 训练负二项回归模型
fit <- MASS::glm.nb(dist ~ speed, data = cars)

# 创建新的预测数据
new_data <- tibble::tibble(speed = c(58, 63, 121))

# 生成预测区间
ciTools::add_pi(new_data, fit)

如果需要合并原数据与新数据的预测结果,可以分别处理后再拼接:

# 原数据的预测结果
cars_preds <- ciTools::add_pi(cars, fit)

# 新数据的预测结果
new_preds <- ciTools::add_pi(new_data, fit)

# 合并两个结果
combined_preds <- dplyr::bind_rows(cars_preds, new_preds)

# 查看前5行原数据结果和后3行新数据结果
head(combined_preds, 5)
tail(combined_preds, 3)

方案2:手动模拟预测区间(不依赖ciTools)

基于负二项分布的统计性质,手动模拟生成预测区间,避免第三方包的内部限制:

# 训练模型
fit <- MASS::glm.nb(dist ~ speed, data = cars)

# 定义新预测数据
new_data <- tibble::tibble(speed = c(58, 63, 121))

# 预测每个新点的均值响应
mu <- predict(fit, newdata = new_data, type = "response")

# 提取模型的离散参数theta
theta <- fit$theta

# 模拟10000次负二项分布的响应值(固定种子保证可复现)
set.seed(123)
simulated_vals <- replicate(10000, rnbinom(nrow(new_data), size = theta, mu = mu))

# 计算95%预测区间的分位数
pred_intervals <- t(apply(simulated_vals, 1, quantile, probs = c(0.025, 0.975)))

# 整理最终结果
final_result <- cbind(
  new_data,
  pred = round(mu, 4),
  LPB0.025 = pred_intervals[, 1],
  UPB0.975 = pred_intervals[, 2]
)

final_result

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 08:57:04