r - rollapply() 是否允许调用函数的结果数组?

标签 r zoo

# Loading packages

require(forecast)
require(quantmod)

# Loading OHLC xts object

getSymbols('SPY', from = '1950-01-01')

# Selecting weekly Close prices

x <- Cl(to.weekly(SPY))

# ARIMA(p,d,q) estimation and forecasting function

a.ari.fun <- function(x) {

  a.ari <- auto.arima(x = x, d = 1, max.p = 50, max.q = 50, max.P = 50,
                      max.Q = 50, ic = 'aic', approximation = TRUE)
  fore <- forecast.Arima(object = a.ari, h = 4, level = c(.9))
  supp <- tail(fore$lower, 1)
  rest <- tail(fore$upper, 1)
  return(c(supp, rest))

}

# Roll apply ARIMA(p,d,q) in rolling window

rollapplyr(data = tail(x, 800), width = 750, FUN = a.ari.fun)

此代码返回一个错误,因为

return(c(supp, rest))

在我编写的a.ari.fun()函数的末尾;我确信这一点,因为如果 a.ari.fun() 返回只是

return(rest)

效果很好。

我必须如何安排a.ari.fun()才能获得适合rollapplyr()的对象?

最佳答案

看起来使用 by.column=FALSE 会满足您的请求。

tail(rollapplyr(data = as.zoo(x), width = 750, FUN = a.ari.fun, by.column=FALSE))

2012-07-13 126.0730 145.8036
2012-07-20 126.1342 145.8616
2012-07-27 128.9303 148.6576
2012-08-03 129.7640 149.4975
2012-08-10 130.5752 150.2954
2012-08-17 132.3789 152.0963

如果您加载了 PerformanceAnalytics,将调度 rollapply.xts 而不是 rollapply.zoo。我首先将对象转换为 zoo,以确保调用正确的 rollapply

编辑:

感谢 @JoshuaUlrich 的一些补丁,现在可以与 rollapply.xts 一起使用,因此您不必转换为 zoo。此外,rollapply.xts 现在已注册在 xts 包中,而不是 PerformanceAnalytics 中,因此无论是否<已加载strong>PerformanceAnalytics。您需要正在开发的 xts 版本 - Rev. 765 或更高版本 - 位于 R-Forge .

rollapplyr(x, 750, a.ari.fun, by.column=FALSE)

关于r - rollapply() 是否允许调用函数的结果数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12019164/

相关文章:

r - R中数据表的奇怪情况,列名混合

R:根据前一个非 NA 行中的值分配前一个非 NA 值 'n' 次

用子集平均值替换向量值的子集

R Zoo绘制多年数据重叠的图

r - 每小时 Holt-Winter 时间序列预测(forecasting)

r - `sapply` 对于 "zoo"对象成功,但对于 "xts"对象则失败,为什么?

将列中的 NA 值替换为 +1 以上行中的值

r - data.table 中闭包的处理

r - 在数据框列中的 “/”之后提取文本

r - 加速对 R 中矩阵列的操作