R中arima()函数的计算复杂度是多少?

And*_*huk 4 r time-series forecasting

如果我的时间序列有n成员并且我想要适合ARIMA(1,0,1)模型,那么大O符号的复杂性是多少?

在下面的例子中,我需要知道第二行代码的复杂性:

series <- arima.sim(list(order=c(1,0,1), ar=.9, ma=-.5), n=1000)
result <- arima(series, order=c(1,0,1))
Run Code Online (Sandbox Code Playgroud)

谢谢.

李哲源*_*李哲源 8

这很O(n)复杂.这个故事?见下文.

正如我在评论中所说,我们可以通过回归模型来衡量它.作为玩具演示,请考虑以下数据收集和回归过程.

我们首先定义一个函数来测量ARMA(1,1)模型(或ARIMA(1,0,1))的模型拟合时间.(注意我在system.time()这里使用的是基本的.你可以考虑microbenchmark()从包中使用microbenchmark.但在下面,我将使用相当大的n,以减少时间测量的灵敏度.)

t_arma <- function(N) {
  series <- arima.sim(list(order=c(1,0,1), ar=.9, ma=-.5), n=N)
  as.numeric((system.time(arima(series, order=c(1,0,1)))))[3]
  }
Run Code Online (Sandbox Code Playgroud)

我们需要收集100个数据.我们尝试100越来越大n,并测量模型拟合时间t.

k <- 100; t <- numeric(k)
n <- seq(20000, by = 1000, length = k)  ## start from n = 20000 (big enough)
for (i in 1:k) t[i] <- t_arma(n[i])
Run Code Online (Sandbox Code Playgroud)

现在,如果我们假设的复杂性是:a * (n ^ b)或者O(n ^ b),我们可以估算a,b通过回归模型:

log(t) ~ log(a) + b * log(n)
Run Code Online (Sandbox Code Playgroud)

我们对slop估计特别感兴趣:b.

我们打电话吧 lm()

fit <- lm(log(t) ~ log(n))

#Coefficients:
#(Intercept)       log(n)  
#    -9.2185       0.8646  
Run Code Online (Sandbox Code Playgroud)

我们还可以绘制log(n)vs 的散点图log(t)以及拟合线:

plot(log(n), log(t), main = "scatter plot")
lines(log(n), fit$fitted, col = 2, lwd = 2)
Run Code Online (Sandbox Code Playgroud)

拟合模型

一开始有一些异常值,因此斜率低于应有的值.我们现在考虑去除异常值并改进模型以获得稳健性.

异常值具有大残差.我们来看一下:

plot(fit$resi, main = "residuals")
Run Code Online (Sandbox Code Playgroud)

残差

我们可以标记并删除这些异常值.看起来0.5是一个足够好的阈值来过滤那些异常值.

exclude <- fit$resi > 0.5
n <- n[!exclude]
t <- t[!exclude]
Run Code Online (Sandbox Code Playgroud)

现在我们重新构建线性模型并制作图:

robust_fit <- lm(log(t) ~ log(n))

#Coefficients:
#(Intercept)       log(n)  
#    -11.197        1.039  

plot(log(n), log(t), main = "scatter plot (outliers removed)")
lines(log(n), robust_fit$fitted, col = 2, lwd = 2)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

哇,太棒了,我们是金色的!斜率估计为1.因此O(n)复杂性是合理的!