R: левостороннее скользящее среднее за периоды (месяцы) - PullRequest
4 голосов
/ 08 февраля 2012

У меня есть вопрос, который может быть тривиальным для большинства из вас, ребята.Я много пробовал, не нашел решения, поэтому был бы рад, если бы кто-нибудь дал мне подсказку.Отправной точкой является еженедельный 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 () .Но это не дало мне то, что я хочу.Может кто-нибудь из вас подскажет, как решить проблему?Просто подсказка, какую функцию мне следует использовать, уже будет достаточно!

Большое спасибо!

С уважением,

Андреас

Ответы [ 2 ]

2 голосов
/ 08 февраля 2012

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))
2 голосов
/ 08 февраля 2012

Надеюсь, я правильно понял ваш вопрос.но то, что вы ищете:

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

это должно работать - хотя воспроизводимый пример был бы хорош.

вот что он делает.

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...