0

我有以下格式的长数据集:

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

谢谢!

4

1 回答 1

0

一般来说,分组是与 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

然后,您可以将其保留为动物园系列,以便利用该包中的其他时间序列函数,或者可以使用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)
于 2019-11-25T15:15:01.377 回答