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

如何用R的arima.sim模拟自相关负二项计数数据?遇异常求助

问题根源

arima.sim是为连续值时间序列设计的工具,它的核心逻辑是构建线性自回归结构:$X_t = \phi X_{t-1} + \epsilon_t$,其中$\epsilon_t$是你通过rand.gen指定的创新项。你遇到的问题本质是用错了工具:

  • 负二项分布的计数是观测值,不是线性模型里的创新项。线性组合会直接打破负二项的整数、非负特性,导致出现小数和负数。
  • 线性AR(1)的平稳均值公式是$\mu = \mu_\epsilon/(1-\phi)$,你把观测值的目标均值10000直接传给了创新项的mu,最终观测值均值会变成$10000/(1 - (-0.5)) ≈ 6667$,这就是均值偏低的原因。

要模拟自相关的计数时间序列,必须用专门针对计数数据设计的模型,比如负二项整数自回归(NB-INAR)或广义线性自回归(GLARMA)。

解决方案1:用tscount包(推荐)

tscount是专门处理计数时间序列的R包,支持直接模拟带自相关的负二项序列,完美匹配你的需求。

# 首次使用先安装包
install.packages("tscount")
library(tscount)

set.seed(123)  # 固定随机种子保证可复现
n <- 25

# 定义模型参数:NB-AR(1),自相关系数-0.5,负二项size=5.217,目标均值10000
nb_ar1_model <- list(
  ar = -0.5,
  order = 1,
  dist = "nb",
  size = 5.217,
  mu = 10000
)

# 模拟序列
sim <- simulate(nb_ar1_model, nsim = n)

# 查看结果
sim
mean(sim)  # 接近10000

这个方法的优势是:直接生成整数非负的观测值,严格遵循指定的自相关系数和负二项分布参数,不需要手动调整均值。

解决方案2:手动实现负自相关负二项序列

如果不想依赖第三方包,可以通过让当前时刻的均值依赖于上一时刻的观测值(负相关),再从负二项分布抽样的方式实现:

set.seed(123)
n <- 25
size_param <- 5.217
target_mean <- 10000
ar_coef <- -0.5

# 初始化序列
sim_seq <- numeric(n)
sim_seq[1] <- rnbinom(1, size = size_param, mu = target_mean)

# 迭代生成后续值
for(t in 2:n){
  # 计算当前时刻的均值,确保非负(避免抽样出错)
  current_mu <- target_mean + ar_coef * (sim_seq[t-1] - target_mean)
  current_mu <- max(current_mu, 0.1)
  
  # 从负二项分布抽样
  sim_seq[t] <- rnbinom(1, size = size_param, mu = current_mu)
}

# 查看结果
sim_seq
mean(sim_seq)  # 接近10000

这个方法的自相关系数近似为-0.5,所有观测值都是整数且非负,均值会稳定在10000左右。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 06:35:31