按组计算滚动标准偏差

时间:2019-11-25 14:04:03

标签: r grouping standards rolling-computation deviation

我的数据集很长,格式如下:

Date         Country     Score
1995-01-01   Australia    100
1995-01-02   Australia     99
1995-01-03   Australia     85
:            :             :
:            :             :
2019-06-30   Australia     57
1995-01-01   Austria       67
1995-01-02   Austria       12
1995-01-03   Austria       10
:            :             :
:            :             :
2019-06-30   Austria       21  

我想为每个国家/地区计算得分的90天滚动标准偏差。我尝试使用rollapply函数(Package:zoo)和roll_sd(Package:RcppRoll),但它们不适用于逐组标准差。有人可以建议一种计算滚动标准偏差的可行方法。

谢谢!

1 个答案:

答案 0 :(得分:0)

通常,分组是与R中的基本操作分开进行的,因此并不是那些功能不能用于分组数据。只是您需要将它们嵌入分组操作中。在这里,我们使用Export Collections to BigQuery进行分组,使用ave进行滚动rollapplyr

现在,我们可以在每个点上假设过去90天是最后90行吗?假设是,并且滚动标准偏差为2,那么我们可以使用结尾处的注释中可重复显示的已发布数据的选定行:

sd

给予:

library(zoo)

roll <- function(x) rollapplyr(x, 2, sd, fill = NA)
transform(DF, roll = ave(Score, Country, FUN = roll))

宽格式方法

另一种方法是将数据转换为宽格式,然后执行滚动操作:

        Date   Country Score       roll
1 1995-01-01 Australia   100         NA
2 1995-01-02 Australia    99  0.7071068
3 1995-01-03 Australia    85  9.8994949
4 1995-01-01   Austria    67         NA
5 1995-01-02   Austria    12 38.8908730
6 1995-01-03   Austria    10  1.4142136

给出这个动物园系列:

library(zoo)
z <- read.zoo(DF, split = "Country")
zr <- rollapplyr(z, 2, sd, fill = NA)
zr

然后,您可以将其保留为动物园系列,以便利用该程序包中的其他时间序列功能,也可以使用 Australia Austria 1995-01-01 NA NA 1995-01-02 0.7071068 38.890873 1995-01-03 9.8994949 1.414214 fortify.zoo(zr)将其转换回数据帧,具体取决于您需要什么。

注意

以可复制形式使用的输入。

fortify.zoo(zr, melt = TRUE, names = names(DF))