R:周期(月)的左侧移动平均线

时间:2012-02-08 09:39:34

标签: r plyr xts moving-average

对于大多数人来说,我有一个问题可能是微不足道的。我尝试了很多,没有找到解决方案,所以如果有人能给我一个提示,我会很高兴的。起点是每周 xts - 时间序列。

Month    Week Value Goal
Dec 2011 W50  a     a  
Dec 2011 W51  b     mean(a,b)
Dec 2011 W52  c     mean(a,b,c)
Dec 2011 W53  d     mean(a,b,c,d)
Jan 2012 W01  e     e
Jan 2012 W02  f     mean(e,f)
Jan 2012 W03  g     mean(e,f,g)
Jan 2012 W04  h     mean(e,f,g,h)
Feb 2012 W05  i     i
Feb 2012 W06  j     mean(i,j)

请原谅Excel表示法,但我认为它很清楚我想要做什么:我想计算“值”列的左侧移动平均值,但仅针对相应月份,因为它显示在列目标。我尝试了 apply.monthly() period.apply()。但它并没有让我得到我想要的东西。你的sombody可以给我一个如何解决问题的提示吗?只是暗示我应该使用哪个功能就足够了!

非常感谢!

致以最诚挚的问候,

安德烈亚斯

2 个答案:

答案 0 :(得分:2)

我希望我的问题是正确的。但是你正在寻找的是什么:

 require(plyr)
 require(PerformanceAnalytics)
 ddply(data, .(Week), summarize, Goal=apply.fromstart(Value,fun="mean"))

这应该有用 - 虽然reproducible expample本来不错。

这就是它的作用。

df <- data.frame(Week=rep(1:5, each=5), Value=c(1:25)*runif(25)) #sample data

require(plyr)
require(PerformanceAnalytics)

df$Goal <- ddply(df, .(Week), summarize, Goal=apply.fromstart(Value,FUN="mean"))[,2]

结果:

    Week      Value       Goal
 1     1  0.7528037  0.7528037
 2     1  1.9622622  1.3575330
 3     1  0.3367802  1.0172820
 4     1  2.5177284  1.3923936

当然,您可以通过帮助获取更多信息:?ddply?apply.fromstart

答案 1 :(得分:2)

apply.monthly无效,因为它只会将一个值分配给期间的终点,而您希望为每个月期分配多个值。

您可以通过按月拆分xts数据,对每个数据应用累积平均函数,然后将列表重新组合在一起,来轻松完成此任务。

library(quantmod)
# Sample data
getSymbols("SPY")
spy <- to.weekly(SPY)
# Cumulative mean function
cummean <- function(x) cumsum(x)/seq_along(x)
# Expanding average calculation
spy$EA <- do.call(rbind, lapply(split(Cl(spy),'months'), cummean))