我熟悉zoo
函数rollapply
,它允许您对zoo
或xts
对象进行滚动计算,并且可以通过{{指定滚动增量1}}参数。我特别感兴趣的是每月应用一个函数,但是在计算中使用过去的所有日常数据。例如,假设我的数据集如下所示:
by
我想选择每个月的结尾和dte, val
1/01/2001, 10
1/02/2001, 11
...
1/31/2001, 2
2/01/2001, 54
2/02/2001, 34
...
2/30/2001, 29
一个使用所有日常数据的函数。这似乎不适用于apply
,因为rollapply
参数有时为30,其他29个月等等。我当前的想法是:
by
当然有更好的方法来做到这一点会更快吗? 澄清:我想使用重叠期间,只需每月进行滚动。
答案 0 :(得分:3)
如果我理解正确,您可以获取端点的日期,然后针对每个端点(即使用lapply
或for
),使用截至该点的数据调用rollapply
。
getSymbols("SPY", src='yahoo', from='2012-01-01', to='2012-08-01')
idx <- index(SPY)[endpoints(SPY, 'months')]
out <- lapply(idx, function(i) {
as.xts(rollapplyr(as.zoo(SPY[paste0("/", i)]), 5,
function(x) coef(lm(x[, 4] ~ x[, 1]))[2], by.column=FALSE))
})
sapply(out, NROW)
#[1] 16 36 58 78 100 121 142 143
我暂时向zoo
强制rollapplyr
以确保使用rollapply.zoo
方法(与未导出的rollapply.xts
方法相对),然后强制返回xts
答案 1 :(得分:2)
作为“需要动物园/ xts转换吗?”的答案: 在这种情况下不需要它,但如果你发送数据帧,rollapply将无法工作,正如我最近从this StackOverflow answer
发现的那样答案 2 :(得分:0)
xts中您想要period.apply()
或其便利助手apply.monthly()
。
示例:
R> foo <- xts(1:100, order.by=Sys.Date()+0:99)
R> apply.monthly(foo, sum)
[,1]
2012-08-31 105
2012-09-30 885
2012-10-31 1860
2012-11-25 2200
R>
或同样
R> apply.monthly(foo, quantile)
0% 25% 50% 75% 100%
2012-08-31 1 4.25 7.5 10.75 14
2012-09-30 15 22.25 29.5 36.75 44
2012-10-31 45 52.50 60.0 67.50 75
2012-11-25 76 82.00 88.0 94.00 100
R>
只是为了证明返回多个值的函数也可以使用。