【问题标题】:Calculation of rolling standard deviation by group按组计算滚动标准偏差
【发布时间】:2019-11-25 14:04:03
【问题描述】:

我有一个格式如下的长数据集:

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) 但它们不适用于分组标准差。谁能建议一种计算滚动标准偏差的可能方法。

谢谢!

【问题讨论】:

  • Checkout runner 打包并在滚动窗口上应用任何功能。将日期放入 idx 参数并指定 k = 90(90 天)。即使您在日期上有差距,它仍然会在 90 天而不是 90 元素上计算 - 更多示例在 other vignette

标签: r grouping standards rolling-computation deviation


【解决方案1】:

一般而言,分组是与 R 中的基本操作分开完成的,因此并不是这些函数不能用于分组数据。只是您需要将它们嵌入到分组操作中。这里我们使用ave进行分组,rollapplyr进行滚动sd

现在,我们可以假设过去 90 天是最后 90 行吗?假设是,并采用 2 的滚动标准偏差,以便我们可以使用在最后的注释中重复显示的已发布数据的选定行:

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

然后,您可以将其保留为 zoo 系列,以便利用该包中的其他时间序列函数,或者可以根据您的需要使用 fortify.zoo(zr)fortify.zoo(zr, melt = TRUE, names = names(DF)) 将其转换回数据框。

注意

以可重现形式使用的输入。

Lines <- "Date         Country     Score
1995-01-01   Australia    100
1995-01-02   Australia     99
1995-01-03   Australia     85
1995-01-01   Austria       67
1995-01-02   Austria       12
1995-01-03   Austria       10"
DF <- read.table(text = Lines, header = TRUE)
DF$Date <- as.Date(DF$Date)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-09
    • 1970-01-01
    • 2016-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-04
    相关资源
    最近更新 更多