如何用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
相关产品推荐
相关产品推荐

