Функция прокрутки временных рядов на группу

У меня есть набор данных следующего типа:

      ID     date       RET
1  10026 20171227 -0.003768
2  10026 20171228  0.008958
3  10027 20171227 -0.001447
4  10027 20171228 -0.017454
5  10028 20171227 -0.009988
6  10028 20171228  0.013813

Мне нужно рассчитать скользящую sd RET с окном 252 для каждого идентификатора. Для этого функция

roll_sd(df50[,2],252)

Выполняет работу по вычислению скользящего sd, но не учитывает разные идентификаторы. Я знаю, что мог бы написать цикл типа

for (i in 1:dim(list_of_all_ID_to_be_created)) {
  roll_sd(df50[i,2],252)
}

а затем прикрепите эти значения к пустому кадру данных. Однако есть ли способ сделать все это сразу, чтобы в моем исходном фрейме данных я просто получил новый столбец «roll_sd», который выполняет расчет для каждого идентификатора? Желаемый результат будет выглядеть так:

      ID     date       RET  roll_sd
1  10026 20171227 -0.003768  0.18667
2  10026 20171228  0.008958  0.21667
3  10027 20171227 -0.001447  0.18668
4  10027 20171228 -0.017454  0.32542
5  10028 20171227 -0.009988  0.87763
6  10028 20171228  0.013813  0.11221

person Matteo    schedule 12.02.2020    source источник


Ответы (1)


Использование roll_sd с размером окна 252 сделает первые 252 значения в каждой группе NA - это не даст результата, который вы предлагаете в своем вопросе. Тем не менее, из нескольких способов, с помощью которых вы можете добиться результата, проще всего использовать group_by и mutate из семейства пакетов tidyverse. Я удалил значения resultantNA из окончательного фрейма данных, используя drop_na

library(tidyverse)
library(roll)

df <- data.frame(ID = rep(letters[1:5], 500), RET = rnorm(2500))

df %>% 
  group_by(ID) %>% 
  mutate(roll_sd = roll_sd(RET, 252)) %>% 
  drop_na(roll_sd)
#> # A tibble: 1,245 x 3
#> # Groups:   ID [5]
#>    ID       RET roll_sd
#>    <fct>  <dbl>   <dbl>
#>  1 a     -0.538   1.02 
#>  2 b     -0.669   1.08 
#>  3 c     -0.438   0.990
#>  4 d     -0.511   1.06 
#>  5 e      0.953   1.04 
#>  6 a     -1.68    1.02 
#>  7 b     -0.806   1.08 
#>  8 c     -1.86    0.995
#>  9 d      3.49    1.08 
#> 10 e     -1.36    1.05 
#> # ... with 1,235 more rows
person Allan Cameron    schedule 12.02.2020
comment
это прекрасно работает! Насчет NaN это не проблема, это нормально, что так работает. В моем реальном фрейме данных я взял еще один год данных, чтобы иметь возможность рассчитать таким образом полный временной ряд скользящего sd. - person Matteo; 13.02.2020
comment
@Matteo Я рад проблеме АН - мне было интересно, не понял ли я вопрос неправильно! - person Allan Cameron; 13.02.2020