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

Lis*_*Ann 3 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)
Run Code Online (Sandbox Code Playgroud)

此代码返回错误,因为

return(c(supp, rest))
Run Code Online (Sandbox Code Playgroud)

a.ari.fun()我写的函数的最后; 我很确定,因为如果a.ari.fun()只是返回

return(rest)
Run Code Online (Sandbox Code Playgroud)

它工作正常.

我如何安排a.ari.fun()以获得适合的物体rollapplyr()

GSe*_*See 5

看起来像使用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
Run Code Online (Sandbox Code Playgroud)

如果你有PerformanceAnalytics加载rollapply.xts将被调度而不是rollapply.zoo.我编辑将对象转换为zoo第一个以确保rollapply调用右侧.

编辑:

感谢来自@JoshuaUlrich的一些补丁,现在可以使用rollapply.xts,所以你不必转换为zoo.另外,rollapply.xts现在注册在XTS包,而不是PerformanceAnalytics,所以你会得到相同的结果,无论是否PerformanceAnalytics被加载.你需要开发版本的xts - Rev. 765或更高版本 - 这是在R-Forge上.

rollapplyr(x, 750, a.ari.fun, by.column=FALSE)
Run Code Online (Sandbox Code Playgroud)