在循环中添加 xts 对象

Posted

技术标签:

【中文标题】在循环中添加 xts 对象【英文标题】:Adding xts objects in a loop 【发布时间】:2021-09-28 04:16:24 【问题描述】:

我有一个函数 ugmfit,它返回一个 xts 对象。 现在我想编写一个包含循环的函数 out_of_sample_f。在每次迭代的那个循环中 fit$est_vol_oos 给出一个具有唯一日期的 xts。我想将它们全部加在一起,以便 out_of_sample_f 可以返回所有预测中的一个 xts

如何在该循环中迭代地合并这些 xts,以便 out_of_sample_f 只返回一个 xts 对象?不知道我做的对不对?我在想,一开始就初始化 oosf 可能会出现日期问题。

out_of_sample_f <- function(rtrn, r_w, re_est_w, exog) 


  oosf = xts(as.numeric(0), as.Date("2013-04-08"))
  
  for (i in 0:(length(rtrn) - r_w)) 
    if(i%%re_est_w == 0)
      mv_m<-mv_into_mat(rtrn[(i + 1):(i + r_w)],exog,K=12,"monthly")
      fit<-ugmfit(model="GM",skew="NO",distribution="norm",rtrn[(i + 1):(i+r_w)],mv_m,K=12, out_of_sample = re_est_w)
      oosf = c(oosf, fit$est_vol_oos)

    
  
  oosf <- oosf[-1,]


  return(oosf)

fit$est_vol_oos 是特定窗口的 xts。我想遍历我的数据并连续添加我的预测。

稍后我将这个“合并”xts 用于其他东西,其中构建了这个 xts 和另一个 xts 之间的差异,但我得到两个数组不兼容的错误。 编辑: 后来我使用这个 xts 形式的 out_of_sample_f 和一个原始的返回序列作为另一个函数的输入。那里说: *.default((tau - dummies), (realized - evaluate)) 中的错误: 不相容数组

realized 是原始返回序列,评估的是 out_of_sample_f 中的 xts。

【问题讨论】:

我编辑了问题 还不清楚。你要Reduce("+", lst1) 抱歉,问了很多问题。如果您创建了一个具有明确预期输出的可重现示例,我们就不必要求明确 好的,假设 a 是一个日期为“2021-07-19”的 xts,只有一列包含数字,b xts 的日期为“2021-07-20”,也只有一列.现在我想将 a 和 b 添加在一起,以便新的 xts 对象包含两行,即 a 和 b add 我猜这并不是指基于日期的文字添加 (+),对吧。如果这些对象之间有共同的日期怎么办。你是求和还是只保留第一个日期行 【参考方案1】:

如果我们想从listrbind,请使用

do.call(rbind, lst1)

其中lst1 是存储在list 中的out_of_sample_f 的输出


在OP的代码中,有一行

oosf = c(oosf, fit$est_vol_oos)

应该是

oosf = rbind(oosf, fit$est_vol_oos)
out_of_sample_f <- function(rtrn, r_w, re_est_w, exog) 


  oosf = xts(as.numeric(0), as.Date("2013-04-08"))
  
  for (i in 0:(length(rtrn) - r_w)) 
    if(i%%re_est_w == 0)
      mv_m<-mv_into_mat(rtrn[(i + 1):(i + r_w)],exog,K=12,"monthly")
      fit<-ugmfit(model="GM",skew="NO",distribution="norm",rtrn[(i + 1):(i+r_w)],mv_m,K=12, out_of_sample = re_est_w)
      oosf = rbind(oosf, fit$est_vol_oos)

    
  
  oosf <- oosf[-1,]


  return(oosf)

【讨论】:

所以不是 oosf = c(oosf, fit$est_vol_oos),而是在每次迭代中将 fit$est_vol_oos 附加到列表中?如何附加到列表?所以我发起 oosf = list()? @JohannesHeß 如果您已经在这样做而不是 c,请使用 oosf &lt;- rbind(oosf, .. rbind 与 c 有何不同? @JohannesHeß 对于矩阵输出,c 删除了 dim 属性,而 rbind 没有。即c(matrix(1:10, 2, 5))# [1] 1 2 3 4 5 6 7 8 9 10 我认为这行得通!非常感谢你 akrun :-)

以上是关于在循环中添加 xts 对象的主要内容,如果未能解决你的问题,请参考以下文章

关于如何在 xts 对象中获取特定元素的简单问题

为啥 Rcpp 会破坏 xts 对象?

合并大量 xts 对象

计算 R 中每月超过 XTS 对象的滚动年回报

从多个 xts 对象创建虚拟对象

如何在 R 中对财务数据 xts 对象进行简单和滚动线性回归?