arima.sim() 函数具有不同的:样本大小、phi 值和 sd 值

Posted

技术标签:

【中文标题】arima.sim() 函数具有不同的:样本大小、phi 值和 sd 值【英文标题】:arima.sim() function with varying: sample sizes, phi values and sd values 【发布时间】:2020-07-13 04:57:23 【问题描述】:

我想用变量模拟ARIMA(1,1,0)

    样本大小 phi 值 标准偏差值。

我很佩服下面的r 代码如何只模拟一个ARIMA(1,1,0),我想按照格式模拟许多具有不同样本大小phi值ARIMA(1,1,0) /strong> 和 标准差值

wn <- rnorm(10, mean = 0, sd = 1)
ar <- wn[1:2]
for (i in 3:10)
  ar<- arima.sim(n=10,model=list(ar=-0.7048,order=c(1,1,0)),start.innov=4.1,n.start=1,innov=wn)

我问了一个类似的问题here 并根据我的问题给出了一个很好的答案,但现在我看到arima.sim() 函数在模拟ARIMA 时间序列中是必不可少的,因此想将它纳入我的风格模拟ARIMA 时间序列。 我想出了这个试验,它使用 arima.sim() 函数来模拟 N=c(15, 20) ARIMA(1,1,0) 具有不同 样本大小标准的时间序列偏差值phi值,首先生成N个随机数,然后用最初的两个随机数作为前两个ARIMA(1,1,0). The 3rd to **n**th are the made to followARIMA(1,1 ,0)`。 这是我在下面尝试过的:

N <- c(15L, 20L)
SD = c(1, 2) ^ 2
phi = c(0.2, 0.4)
res <- vector('list', length(N))
names(res) <- paste('N', N, sep = '_')
set.seed(123L)
for (i in seq_along(N))
  res[[i]] <- vector('list', length(SD))
  names(res[[i]]) <- paste('SD', SD, sep = '_')
  ma <- matrix(NA_real_, nrow = N[i], ncol = length(phi)) 
  for (j in seq_along(SD))
    wn <- rnorm(N[i], mean = 0, sd = SD[j])
    ar[[1:2, ]] <- wn[[1:2]]
    for (k in 3:N[i])
      ar[k, ] <- arima.sim(n=N[[i]],model=list(ar=phi[[k]],order=c(1,1,0)),start.innov=4.1,n.start=1,innov=wn)
    
    colnames(ar) <- paste('ar_theta', phi, sep = '_')
    res[[i]][[j]] <- ar
  

res1 <- lapply(res, function(dat) do.call(cbind,  dat))
sapply(names(res1), function(nm) write.csv(res1[[nm]], 
                                           file = paste0(nm, ".csv"), row.names = FALSE, quote = FALSE))

最后两行将时间序列数据写入.csv并保存在我的工作目录中。

【问题讨论】:

我非常需要帮助 我还在等待帮助 【参考方案1】:

这里可能是使用Map 的方法。如果这不符合您的要求,请编辑您的帖子以包含预期的输出。

N <- c(15L, 20L)
SD <- c(1, 2) ^ 2
phi = c(0.2, 0.4)

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

## create function
fx_arima <- function(n, SD, phi) 
  arima.sim(n = n,
            model=list(ar=phi, order = c(1, 1, 0)),
            start.innov = 4.1,
            n.start = 1,
            rand.gen = function(n) rnorm(n, mean = 0, sd = SD))[-1L]


## find arima for all combos using Map
set.seed(123L)
res = Map(fx_arima, all_combos[["N"]], all_combos[["SD"]], all_combos[["phi"]])

## or a little bit more work:
set.seed(123L)
res2 = by(all_combos, all_combos["N"], 
   function(DF) 
     res = mapply(fx_arima, DF[["N"]], DF[["SD"]], DF[["phi"]])
     colnames(res) = paste("SD", DF[["SD"]], "phi", DF[["phi"]], sep = "_")
     res
   )
res2

## write to csv
Map(function(file, DF) write.csv(DF, paste0("N_", file, ".csv")), names(res2), res2)

【讨论】:

我对你的回答表示赞赏 我不需要第一行 0.0000000 的元素,在我的简单案例中,我希望像 ar[-1] 一样删除它们。 你是想在rand.gen = function(n) rnorm(n, mean = 0, sd = SD))中说n=N吗? 我还想将输出写入 .csv 文件中,就像我在上面的问题中包含的那样,因为我将把 NSDphi 扩展到类似 ***.com/questions/59922709/…但res1 &lt;- lapply(res, function(dat) do.call(cbind, dat)) sapply(names(res1), function(nm) write.csv(res1[[nm]], file = paste0(nm, ".csv"), row.names = FALSE, quote = FALSE)) 不起作用 我在运行sapply(names(res), function(nm) write.csv(res[[nm]], file = paste0(nm, ".csv"), row.names = FALSE, quote = FALSE)) 时尝试写出您的答案输出,这给了我 5 个这种性质的不同数据框$N_50000 NULL $N_70000 NULL $N_100000 NULL $N_150000 NULL $N_200000 NULL,而第一个函数打印 2 个数据框,每个数据框 4 列

以上是关于arima.sim() 函数具有不同的:样本大小、phi 值和 sd 值的主要内容,如果未能解决你的问题,请参考以下文章

如何在 R 中使用 Monte Carlo 进行 ARIMA 模拟函数

具有两种不同输入样本大小的 Keras 多任务学习

如何配置 Java Spark sparksession 样本大小

用于具有动态样本大小的分层抽样的 sql 查询

将相同的函数绑定到具有不同参数的窗口调整大小事件

Pytorch 训练和评估不同的样本大小