2012-02-08 7 views
4

У меня есть вопрос, который может быть тривиальным для большинства из вас, ребята. Я много пробовал, не пришел к решению, поэтому я был бы рад, если бы кто-нибудь мог дать мне подсказку. Отправной точкой является еженедельная серия xts.R: левое одностороннее скользящее среднее за периоды (месяцы)

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

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

С наилучшими пожеланиями,

Andreas

+0

Это часто называют средним «расширяющимся окном». –

+0

Большое вам спасибо - часто я точно знаю, что я хочу делать, но я просто пропущу правильные условия поиска. это был один из таких случаев ;-) – chameau13

ответ

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)) 
+0

большое спасибо! ваше решение работает именно так, как я этого хотел! спасибо за быстрый ответ !!! – chameau13

+2

или, возможно, заменить последнюю строку: 'spy $ EA <- ave (Cl (spy), as.yearmon (time (spy)), FUN = cummean)' –

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.

+0

спасибо, я тоже пробовал решение, и он тоже должен. что Джошуа показался мне более прозрачным. однако я думаю, что было небольшое недоразумение: ddply (df,. (Неделя), ...). Мне пришлось использовать вектор индексирования с месяцами, создаваемыми именами розеров. – chameau13

 Смежные вопросы

  • Нет связанных вопросов^_^