您创建的代码甚至没有生成任何(伪)随机输出,更不用说 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');