【问题标题】:Calculate a moving average in R, on a rolling subset of a time series在时间序列的滚动子集上计算 R 中的移动平均值
【发布时间】:2017-07-14 03:22:02
【问题描述】:

我有一个每日时间序列,我正在尝试计算一个 10 周期移动平均线。 我遇到的问题是移动平均线需要在数据的滚动子集上(10 个周期不连续)。我需要过去 10 周的平均值,从今天开始(包括今天)。
“今天”值将是今天的平均值/5 天前的值/10 天前的值.../45 天前的值 要计算“昨天”的值,我想要昨天/6 天前的值/11 天前的值.../46 天前的值。

我尝试了以下方法:

WMA(na.omit(data[seq(NROW(data),1,-5)]),n=10, wts=wtzd)

其中 wtzd 是权重向量,data 是 xts 时间序列对象。

数据包含从 2006-04-19 到 2017-02-03 的每日观察结果

该代码的工作原理是它返回正确的值,但它只返回每周的数字,而我希望计算每天的平均值。 所以,我从上面得到了 2017-02-03/2017-01-27/2017-01-20 的数据...... 虽然我希望每天返回数据,但 2017-02-03/2017-02-02/...

我认为必须有一个直截了当的解决方案,我只是不太明白。我试过运行 rollapply 和其他一些应用函数,但没有成功。

权重向量由以下方式生成:

wtzd<-(1:10/55)

我要按日期查找的正确返回值示例如下:

2017-02-03->0.04354639(这是每 5 个值的加权平均值(所以 2017-02-03/2017-01-27...2016/11/29) 2017-02-02->0.04536664(这是 2017-02-02...2016/11/28 的加权平均值)

以下是数据示例:

<table border=0 cellpadding=0 cellspacing=0 width=139 style='border-collapse:
 collapse;table-layout:fixed;width:104pt'>
 <col width=75 style='mso-width-source:userset;mso-width-alt:2742;width:56pt'>
 <col width=64 style='width:48pt'>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl154556 width=75 style='height:15.0pt;width:56pt'>Date</td>
  <td class=xl154556 width=64 style='width:48pt'>Data</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>8/5/2016</td>
  <td class=xl154556 align=right>0.010798</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>8/8/2016</td>
  <td class=xl154556 align=right>0.011934</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>8/9/2016</td>
  <td class=xl154556 align=right>0.015761</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>8/10/2016</td>
  <td class=xl154556 align=right>0.017658</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>8/11/2016</td>
  <td class=xl154556 align=right>0.018573</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>8/12/2016</td>
  <td class=xl154556 align=right>0.018512</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>8/15/2016</td>
  <td class=xl154556 align=right>0.016978</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>8/16/2016</td>
  <td class=xl154556 align=right>0.012713</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>8/17/2016</td>
  <td class=xl154556 align=right>0.008406</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>8/18/2016</td>
  <td class=xl154556 align=right>0.003475</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>8/19/2016</td>
  <td class=xl154556 align=right>-8E-05</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>8/22/2016</td>
  <td class=xl154556 align=right>-0.00153</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>8/23/2016</td>
  <td class=xl154556 align=right>-0.00096</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>8/24/2016</td>
  <td class=xl154556 align=right>0.000888</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>8/25/2016</td>
  <td class=xl154556 align=right>0.003899</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>8/26/2016</td>
  <td class=xl154556 align=right>0.006597</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>8/29/2016</td>
  <td class=xl154556 align=right>0.006941</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>8/30/2016</td>
  <td class=xl154556 align=right>0.008899</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>8/31/2016</td>
  <td class=xl154556 align=right>0.009631</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>9/1/2016</td>
  <td class=xl154556 align=right>0.009314</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>9/2/2016</td>
  <td class=xl154556 align=right>0.008964</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>9/6/2016</td>
  <td class=xl154556 align=right>0.007931</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>9/7/2016</td>
  <td class=xl154556 align=right>0.005969</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>9/8/2016</td>
  <td class=xl154556 align=right>0.004158</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>9/9/2016</td>
  <td class=xl154556 align=right>0.004553</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>9/12/2016</td>
  <td class=xl154556 align=right>0.003861</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>9/13/2016</td>
  <td class=xl154556 align=right>0.005387</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>9/14/2016</td>
  <td class=xl154556 align=right>0.004989</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>9/15/2016</td>
  <td class=xl154556 align=right>0.005372</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>9/16/2016</td>
  <td class=xl154556 align=right>0.006748</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>9/19/2016</td>
  <td class=xl154556 align=right>0.007596</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>9/20/2016</td>
  <td class=xl154556 align=right>0.007595</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>9/21/2016</td>
  <td class=xl154556 align=right>0.00819</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>9/22/2016</td>
  <td class=xl154556 align=right>0.007539</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>9/23/2016</td>
  <td class=xl154556 align=right>0.004659</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>9/26/2016</td>
  <td class=xl154556 align=right>0.002459</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>9/27/2016</td>
  <td class=xl154556 align=right>0.000717</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>9/28/2016</td>
  <td class=xl154556 align=right>0.000757</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>9/29/2016</td>
  <td class=xl154556 align=right>0.00175</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>9/30/2016</td>
  <td class=xl154556 align=right>0.002898</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>10/3/2016</td>
  <td class=xl154556 align=right>0.004611</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>10/4/2016</td>
  <td class=xl154556 align=right>0.004674</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>10/5/2016</td>
  <td class=xl154556 align=right>0.002337</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>10/6/2016</td>
  <td class=xl154556 align=right>0.001521</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>10/7/2016</td>
  <td class=xl154556 align=right>0.000596</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>10/10/2016</td>
  <td class=xl154556 align=right>-0.00019</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>10/11/2016</td>
  <td class=xl154556 align=right>0.002114</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>10/12/2016</td>
  <td class=xl154556 align=right>0.006229</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>10/13/2016</td>
  <td class=xl154556 align=right>0.008139</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>10/14/2016</td>
  <td class=xl154556 align=right>0.011209</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>10/17/2016</td>
  <td class=xl154556 align=right>0.01471</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>10/18/2016</td>
  <td class=xl154556 align=right>0.01581</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>10/19/2016</td>
  <td class=xl154556 align=right>0.017636</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>10/20/2016</td>
  <td class=xl154556 align=right>0.020715</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>10/21/2016</td>
  <td class=xl154556 align=right>0.023097</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>10/24/2016</td>
  <td class=xl154556 align=right>0.023854</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>10/25/2016</td>
  <td class=xl154556 align=right>0.024841</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>10/26/2016</td>
  <td class=xl154556 align=right>0.024457</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>10/27/2016</td>
  <td class=xl154556 align=right>0.024512</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>10/28/2016</td>
  <td class=xl154556 align=right>0.02277</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>10/31/2016</td>
  <td class=xl154556 align=right>0.021808</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>11/1/2016</td>
  <td class=xl154556 align=right>0.019764</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>11/2/2016</td>
  <td class=xl154556 align=right>0.018609</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>11/3/2016</td>
  <td class=xl154556 align=right>0.01617</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>11/4/2016</td>
  <td class=xl154556 align=right>0.015457</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>11/7/2016</td>
  <td class=xl154556 align=right>0.017325</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>11/8/2016</td>
  <td class=xl154556 align=right>0.020514</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>11/9/2016</td>
  <td class=xl154556 align=right>0.025313</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>11/10/2016</td>
  <td class=xl154556 align=right>0.030246</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>11/11/2016</td>
  <td class=xl154556 align=right>0.035005</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>11/14/2016</td>
  <td class=xl154556 align=right>0.037926</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>11/15/2016</td>
  <td class=xl154556 align=right>0.040985</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>11/16/2016</td>
  <td class=xl154556 align=right>0.0421</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>11/17/2016</td>
  <td class=xl154556 align=right>0.045048</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>11/18/2016</td>
  <td class=xl154556 align=right>0.048647</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>11/21/2016</td>
  <td class=xl154556 align=right>0.050855</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>11/22/2016</td>
  <td class=xl154556 align=right>0.054225</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>11/23/2016</td>
  <td class=xl154556 align=right>0.059675</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>11/25/2016</td>
  <td class=xl154556 align=right>0.063056</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>11/28/2016</td>
  <td class=xl154556 align=right>0.065385</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>11/29/2016</td>
  <td class=xl154556 align=right>0.067396</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>11/30/2016</td>
  <td class=xl154556 align=right>0.068715</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>12/1/2016</td>
  <td class=xl154556 align=right>0.067195</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>12/2/2016</td>
  <td class=xl154556 align=right>0.065036</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>12/5/2016</td>
  <td class=xl154556 align=right>0.060924</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>12/6/2016</td>
  <td class=xl154556 align=right>0.057955</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>12/7/2016</td>
  <td class=xl154556 align=right>0.053682</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>12/8/2016</td>
  <td class=xl154556 align=right>0.05172</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>12/9/2016</td>
  <td class=xl154556 align=right>0.052188</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>12/12/2016</td>
  <td class=xl154556 align=right>0.053812</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>12/13/2016</td>
  <td class=xl154556 align=right>0.055302</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>12/14/2016</td>
  <td class=xl154556 align=right>0.059984</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>12/15/2016</td>
  <td class=xl154556 align=right>0.065521</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>12/16/2016</td>
  <td class=xl154556 align=right>0.069117</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>12/19/2016</td>
  <td class=xl154556 align=right>0.07395</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>12/20/2016</td>
  <td class=xl154556 align=right>0.079027</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>12/21/2016</td>
  <td class=xl154556 align=right>0.079922</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>12/22/2016</td>
  <td class=xl154556 align=right>0.078866</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>12/23/2016</td>
  <td class=xl154556 align=right>0.077589</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>12/27/2016</td>
  <td class=xl154556 align=right>0.07534</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>12/28/2016</td>
  <td class=xl154556 align=right>0.073149</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>12/29/2016</td>
  <td class=xl154556 align=right>0.070329</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>12/30/2016</td>
  <td class=xl154556 align=right>0.066114</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>1/3/2017</td>
  <td class=xl154556 align=right>0.065532</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>1/4/2017</td>
  <td class=xl154556 align=right>0.063771</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>1/5/2017</td>
  <td class=xl154556 align=right>0.059462</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>1/6/2017</td>
  <td class=xl154556 align=right>0.058926</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>1/9/2017</td>
  <td class=xl154556 align=right>0.058652</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>1/10/2017</td>
  <td class=xl154556 align=right>0.055221</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>1/11/2017</td>
  <td class=xl154556 align=right>0.052785</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>1/12/2017</td>
  <td class=xl154556 align=right>0.051279</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>1/13/2017</td>
  <td class=xl154556 align=right>0.047492</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>1/17/2017</td>
  <td class=xl154556 align=right>0.042687</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>1/18/2017</td>
  <td class=xl154556 align=right>0.038517</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>1/19/2017</td>
  <td class=xl154556 align=right>0.036403</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>1/20/2017</td>
  <td class=xl154556 align=right>0.034359</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>1/23/2017</td>
  <td class=xl154556 align=right>0.031666</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>1/24/2017</td>
  <td class=xl154556 align=right>0.03102</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>1/25/2017</td>
  <td class=xl154556 align=right>0.030191</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>1/26/2017</td>
  <td class=xl154556 align=right>0.028369</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>1/27/2017</td>
  <td class=xl154556 align=right>0.02749</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>1/30/2017</td>
  <td class=xl154556 align=right>0.027657</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>1/31/2017</td>
  <td class=xl154556 align=right>0.024824</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>2/1/2017</td>
  <td class=xl154556 align=right>0.021491</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>2/2/2017</td>
  <td class=xl154556 align=right>0.017533</td>
 </tr>
 <tr height=20 style='height:15.0pt'>
  <td height=20 class=xl634556 align=right style='height:15.0pt'>2/3/2017</td>
  <td class=xl154556 align=right>0.012598</td>
 </tr>
 <![if supportMisalignedColumns]>
 <tr height=0 style='display:none'>
  <td width=75 style='width:56pt'></td>
  <td width=64 style='width:48pt'></td>
 </tr>
 <![endif]>
</table>

</div>

</body>

</html>

【问题讨论】:

  • 这里有一个最小的、完全可重现的例子会很有帮助。这将包括(假)数据。
  • 好的,我已经尝试添加一些示例数据。找不到从 R 中获取包含日期的数据的方法,因此插入了一个 html 表。
  • 那么您会很高兴知道有很多很多方法可以做到这一点。见here

标签: r weighted-average


【解决方案1】:

感谢提供样本数据集....

您仍然可以将 data.table 与 zoo 的 rollapply 一起使用...

为了匹配您的预期答案,我添加了一个 DateIndex,然后按它对 weighted.mean 分组执行 rollapply。

DT[,DateIndex:=1:5]
DT[,DateIndex.10period.avg:=rollapply(Data,width=10,weighted.mean,
    w=(1:10)/55,na.rm=TRUE,fill=NA,align="right"),by=DateIndex]

或者,您可以添加一个工作日列并对其进行平均以获得最近 10 个星期五的值...但这与您的预期答案不一致。在这里提供以防万一……

DT[,weekday:=weekdays(Date)]
DT[,weekday.10period.avg:=rollapply(Data,width=10,weighted.mean,
    w=(1:10)/55,na.rm=TRUE,fill=NA,align="right"),by=weekday]

【讨论】:

  • 谢谢。我对data.tables不太熟悉。当我尝试运行时收到以下错误消息:DT[,DateIndex:=1:5] 警告消息:在 [.data.table(DT, , :=(DateIndex, 1:5)) 中:提供 5 个项目分配给“DateIndex”列的 9 个项目(回收后剩下 4 个项目)。
  • 另外,我尝试自己运行你的 rollapply 函数,但它不会产生正确的答案。我认为它连续 10 天运行。也就是说,我跑了:rollapply(dxycopw,width=10,weighted.mean,w=(1:10)/55,na.rm=TRUE,fill=NA,align="right")
  • 对不起,dxycopw是我使用的数据集的名称,所以应该换成通用的'data'
  • 您可以忽略警告,它会回收整个向量中的项目。如果您在控制台上打印 DT ,使用 head(DT,10) 您会看到 1:5 已重复....在您的第二条评论中,您缺少 group by 语句...您需要添加一个 ,DateIndex ] 到 DT 调用结束。我将重新格式化代码,这样您就不必滚动查看它...
  • 这是datacamp.com 在 data.table 中使用 group by 的示例。在我的示例中,我可以通过在 data.table 的最后一个参数前面加上 by=DateIndex 来更明确...它会导致 rowapply 由 DateIndex 而不是整个数据表聚合......
【解决方案2】:

您的问题与此类似: Conditional rolling mean (moving average) on irregular time series

我喜欢数据表解决方案,您可以在其中填充缺失的日期,然后使用 zoo 包中的 rollmean 来获取移动平均值。没有样本数据集就很难证明。我创建了一个伪造的日期,然后删除了一些日期以显示如何解决丢失的日期。

library(data.table)
library(zoo)

## Convert to data.table

#number of days
dateno<-as.numeric(difftime(as.Date("2017-02-03"),as.Date("2006-04-19"),units="days"))+1

DT<-data.table(ID=seq(1,dateno,by=1),
    val=rnorm(dateno),
    dates=seq(as.Date("2006-04-19"),as.Date("2017-02-03"),by=1),
    missing.dates=rbinom(n=dateno,size=1,prob=.9))

DT<-DT[missing.dates==1][,missing.dates:=NULL]


## Using related questions/response
## reference: https://stackoverflow.com/questions/21372735/conditional-rolling-mean-moving-average-on-irregular-time-series
##Missing DATES will be added in. Value will be set to NA. 
DT<-DT[DT[,.(dates=seq(min(dates),max(dates),by=1))],on="dates"]

## Run your function
DT[, Avg5day:=rollmean(val, 5, na.rm=TRUE,align="right",fill=NA)]

希望我正确理解了您的问题。

添加每周平均值,然后使用与 rollmean 相同的策略计算滚动 10 周平均值:

#add workweek column to group by
DT[,YYYY.WW:=paste0(year(as.Date(dates)),"-",ifelse(week(as.Date(dates))<10,"0",""),week(as.Date(dates)))]

#calculate weekly average
DT[,YYYY.WW.AVG:=mean(val,na.rm=TRUE),YYYY.WW]
weekly.DT<-unique(DT[,.(YYYY.WW,YYYY.WW.AVG)])

#calculate rolling weekly average
weekly.DT[,WW10AVG:=rollmean(YYYY.WW.AVG,k=10,na.rm=TRUE,align="right",fill=NA)]
DT[weekly.DT,on="YYYY.WW"]

【讨论】:

  • 谢谢安德烈...我使用我创建的示例数据集添加了更多解释/代码。
  • 谢谢!查看您的代码,我认为您没有理解这个问题,因为我没有看到任何平均每周 10 个数据点的东西。如果我错了,请纠正我。
  • 您的数据集是每天还是每周?如果每天,我们可以创建一个“YYYY-WEEK”列,计算平均值,然后在该列上使用 rollmean 来获得平均值?
  • 每天都有。我在帖子中添加了示例数据。
  • 感谢 DM2017,使用您的数据集查看代码的新答案。我想我现在更好地理解了你的问题。
猜你喜欢
  • 2014-02-17
  • 1970-01-01
  • 2020-03-28
  • 2018-11-14
  • 1970-01-01
  • 2015-03-07
  • 1970-01-01
  • 1970-01-01
  • 2018-05-08
相关资源
最近更新 更多