对自回归 AR(1) 过程感到困惑

机器算法验证 r 时间序列 有马 造型 自回归的
2022-02-06 01:00:44

我“从头开始”创建了一个自回归过程,并将随机部分(噪声)设置为 0。在R

Y <- vector() 

c = 0.1
phi = 0.9

Y[1] = 5

for (i in 2:100) {
Y[i] = c + phi*Y[i-1]
}

然后我要求R使用以下arima()函数拟合 AR(1) 过程:

ar <- arima(Y, order = c(1,0,0))

它估计 ar1 系数为 ar1 = 0.9989,标准误差为 0.0015。

为什么R没有找到具有压倒性小标准误差的 ar1 = 0.9 (= phi)?

3个回答

你有两个问题——其中一个很有趣。

没有噪声项,该系列不再是静止的。它的值渐近但绝对地向1:

图1

ARIMA 仅适用于固定模型——这些数据显然不是来自固定模型。这不是很有趣。有趣的,即使有噪音,问题仍然存在!

那么,当我们添加一点点噪音时会发生什么?

图 2

它显然仍然不是静止的——但原因是初始值与后面的所有内容不一致。

您需要删除一个“老化期”,在此期间模拟值开始表现得像该系列的其余部分一样。时的样子:n0=30

图 3

返回什么arima

Coefficients:
         ar1  intercept
      0.9074     0.9872
s.e.  0.0309     0.0088

0.9074±0.0309ϕ=0.9.

我将这个过程重复了 99 次,产生了 100 个的估计值以及它们的标准误差。下面是这些估计值和粗略的置信限的图(设置为高于和低于估计值ϕ90%1.645

图 4

水平灰线位于以供参考。红色置信区间是不与参考重叠的置信区间:其中有,表明​​置信水平在与预期值 水平黑线是平均估计值。它比可能是因为即使经过时间步,该系列仍然不是很平稳。(人们也不期望估计的分布是对称的:是一个重要的边界,会导致分布偏向较小的值。)ϕ=0.91288%,90%.ϕ,2001

这是相同的研究,但每次迭代2000

图 5

估计的偏差几乎消失了。

另一种解决方案是在其渐近平均值处开始生成序列(等于下面cnst/(1-phi)R代码)。但这需要知道渐近线,这在更复杂的模型中可能更难获得,因此最好了解丢弃模拟序列的初始部分的技术。

顺便说一句,这是生成这些数据集的一种相当有效且紧凑的方法:

phi <- 0.9    # AR(1) coefficient
n <- 200      # Total number of time steps after the initial value
cnst <- 0.1   # Intercept
sigma <- 0.01 # Error variance

Y <- Reduce(function(y, e) y * phi + e, rnorm(n, cnst, sigma), 0, accumulate=TRUE)
n0 <- which.max(abs(Y) >= quantile(abs(Y), 0.5)) # Estimate where Y levels off
Y <- Y[-seq_len(n0)]                             # Strip the initial values
plot(Y)                                          # LOOK at Y before doing anything else...

您创建的代码甚至没有生成任何(伪)随机输出,更不用说 AR(1) 过程了。如果你想生成一个平稳的高斯 AR(1) 过程的输出,你可以使用下面的函数。该函数使用过程的平稳边际分布作为起始分布,从过程中生成精确的输出;这意味着计算不需要删除任何“老化”迭代。因此,与将过程锚定到固定起始值然后丢弃老化迭代的方法相比,此代码在计算上应该更快——并且在统计上更准确。

GENERATE_NAR1 <- function(n, phi = 0, mu = 0, sigma = 1) {
  if (abs(phi) >= 1) { stop('Error: This is not a stationary process --- |phi| >= 1') }
  EE    <- rnorm(n, mean = 0, sd = sigma);
  YY    <- rep(0, n);
  YY[1] <- mu + EE[1]/sqrt(1-phi^2);
  for (t in 2:n) {
     YY[t] <- mu + phi*(YY[t-1]-mu) + EE[t]; }
  YY; }

下面我将生成一系列可观察值,然后我们可以使用该函数将其拟合到具有指定顺序的 ARIMA 模型。n=105arima

set.seed(1);

phi   <- 0.9;
mu    <- 5;
sigma <- 4;
Y     <- GENERATE_NAR1(n = 10^5, phi, mu, sigma);
MODEL <- arima(Y, order = c(1,0,0), include.mean = TRUE);

MODEL;

    Call:
arima(x = Y, order = c(1, 0, 0), include.mean = TRUE)

Coefficients:
         ar1  intercept
      0.8978     4.9099
s.e.  0.0014     0.1242

sigma^2 estimated as 16.11:  log likelihood = -280874.1,  aic = 561754.2

如您所见,有了这么多数据点,该arima函数将 AR(1) 模型的真实参数估计在合理的准确度范围内——真实值在估计值的两个标准误差范围内。时间序列中前值的图表明它不需要您丢弃任何“老化”迭代。n=1,000

plot(Y[1:1000], type = 'l', 
     main = paste0('Gaussian AR(1) time-series \n (phi = ',
                   phi, ', mu = ' , mu, ', sigma = ' , sigma, ')'),
     xlab = 'Time', ylab = 'Value');

在此处输入图像描述

正如评论中还指出的那样,它不再是 AR(p) 过程。arima函数假设以下并相应地拟合系数: 您没有靠近正确的是很正常的。此外,在添加噪声项后,尝试增加样本量以获得更可靠的估计。

yt=c+ϕyt1+ϵt
ϕ