如何计算在 r 中获得第一个真实订单之前有多少次 arima 订单不真实,以用于不同的 arima 模拟组合

Posted

技术标签:

【中文标题】如何计算在 r 中获得第一个真实订单之前有多少次 arima 订单不真实,以用于不同的 arima 模拟组合【英文标题】:how to count how many times an arima order is not true before the first true order is obtained in r for different combo of arima simulation 【发布时间】:2020-12-12 14:14:34 【问题描述】:

大多数时候运行arima.sim() 函数来模拟arima mosel 的特定顺序,但是当通过auto.arima() 函数检查此类模拟时间序列数据时,它通常不会与 ARIMA 的期望和指定顺序相同在arima.sim()

我想知道在获得所需模型的真实顺序之前,可能需要对其参数的不同组合(样本大小、标准偏差和模型系数)运行 arima.sim() 函数多少次,我希望这个R 脚本在count 运行arima.sim() 多少时间之后才能获得ARIMA-order 函数中指定的ARIMA-order

**Here is my trial**

library(forecast)
N <- c(10, 20, 30)
SD <- c(1, 2, 3, 4, 5) ^ 2
phi <- c(0.2, 0.4, 0.6)

## generate all combos
all_combos <- expand.grid(N = N, SD = SD, phi = phi)

## create function
set.seed(123)
res2 <- by(all_combos, all_combos["N"], function(DF)
  res <- mapply(function(N, SD, phi)
    cnt <- 0
    repeat 
      x <- arima.sim(n=N, model = list(ar=phi, order = c(1, 0, 0)), sd = SD)
      if(all(arimaorder(auto.arima(x), ic = "aicc"))) != c(1, 0, 0) cnt <- cnt + 1)
      
        else(all(arimaorder(auto.arima(x), ic = "aicc"))) == c(1, 0, 0) cnt <- cnt + 1)
        break
    
    cnt
  , DF[["N"]], DF[["SD"]], DF[["phi"]])
  names(res) <- paste("SD", DF[["SD"]], "phi", DF[["phi"]], sep = "-")
  res
)
res2

我很想知道在获得第一个 ARIMA(1, 0, 0) 之前要对 arima.sim() 进行多少次试验。

【问题讨论】:

算法是(1)将每个组合的计数设置为零。 (2) 计算在所有combo第一次成功获得(1, 0, 0)之前模型订单不是(1, 0, 0)的次数。 (3)所有combo获得订单(1, 0, 0)时停止,不计入计数。 在这种情况下,我的解决方案不会给您想要的结果?如果您运行它足够多次,它会在您获得c(1, 0, 0) 组合时为您提供数字。 我不能为以下任何一项投票,因为自从我提出赏金以来,已经添加了没有价值的正确答案。 【参考方案1】:

你的花括号在错误的位置。运行您的代码时,我收到有关意外大括号的错误。 ifelseR 符号应遵循:

if(condition == TRUE) 
run some code
 else                     
do some other code       # happens if condition == FALSE

如果你想检查不同的条件,你需要else if

if(condition == TRUE) 
run some code
 else if(other_condition == TRUE)                     
do some other code       
 else 
do some third code      # runs if both conditions are FALSE

all() 的括号也放错了位置。基于此,我认为您希望您的条件看起来像:

if(all(arimaorder(auto.arima(x), ic = "aicc")) != c(1, 0, 0)) 
   cnt <- cnt + 1
    else if (all(arimaorder(auto.arima(x), ic = "aicc")) == c(1, 0, 0)) 
       cnt <- cnt + 1
        else  break 
    

当我修复这些时,代码几乎可以运行,除了我得到错误

arimaorder(auto.arima(x), ic = "aicc") 中的错误: 未使用的参数(ic = "aicc")

所以,auto.arima() 的括号也放错了位置。以下运行没有错误:

res2 <- by(all_combos, all_combos["N"], function(DF)
   res <- mapply(function(N, SD, phi)
      cnt <- 0
      repeat 
         x <- arima.sim(n=N, model = list(ar=phi, order = c(1, 0, 0)), sd = SD)
         if(all(arimaorder(auto.arima(x, ic = "aicc"))) != c(1, 0, 0)) 
      cnt <- cnt + 1
    else if (all(arimaorder(auto.arima(x, ic = "aicc"))) == c(1, 0, 0)) 
   cnt <- cnt + 1
 else  break 
      
      cnt
   , DF[["N"]], DF[["SD"]], DF[["phi"]])
names(res) <- paste("SD", DF[["SD"]], "phi", DF[["phi"]], sep = "-")
res
)

但是,我仍然认为这些行存在问题,我无法弄清楚您要完成什么。

      cnt
   , DF[["N"]], DF[["SD"]], DF[["phi"]]) 

【讨论】:

无限期运行 @DanielJames - 是的。这意味着永远不会满足break 条件。 if 语句或else if 语句始终为真。【参考方案2】:

我觉得你运行by + mapply 很奇怪。我认为只有mapply 就足够了。此外,arimaorder 没有ic 参数,也许你打算将它用于auto.arima 函数。

因为您想知道需要多少次试验才能获得c(1, 0, 0),所以我添加了一个额外的列 (index),它是 all_combos 中的行号。一旦你得到c(1, 0, 0) 的输出,循环就会中断,它会打印index。该代码不适用于其余组合。

library(forecast)
N <- c(10, 20, 30)
SD <- c(1, 2, 3, 4, 5) ^ 2
phi <- c(0.2, 0.4, 0.6)

## generate all combos
all_combos <- expand.grid(N = N, SD = SD, phi = phi)
all_combos$index <- seq_len(nrow(all_combos))

mapply(function(N, phi, SD, index) 
  x <- with(all_combos, arima.sim(n=N[1], 
             model = list(ar=phi[1], order = c(1, 0, 0)), sd = SD[1]))
  if(all(arimaorder(auto.arima(x, ic = "aicc")) == c(1, 0, 0))) 
    print(index)
    break
  
, all_combos$N, all_combos$SD, all_combos$phi, all_combos$index)

【讨论】:

以上是关于如何计算在 r 中获得第一个真实订单之前有多少次 arima 订单不真实,以用于不同的 arima 模拟组合的主要内容,如果未能解决你的问题,请参考以下文章

如何查看一个数字输入了多少次

MySQL 计算两个参数

如何获得 UITableViewCell 字幕显示特定单元格被点击了多少次?

如何计算向量中的位数? (在 R 中)

如何计算数据通过R中某个阈值的次数(频率)?

在 Excel 中计算下订单的频率(最小/最大/平均)