применяя функцию скользящей ошибки, используя rollapply - PullRequest
0 голосов
/ 31 октября 2019

Я пытаюсь вычислить функцию скользящей ошибки в R, где я беру последние 30 дней и вычисляю rmse, продвигаюсь на 1 день и беру последние 30 дней с этой точки и вычисляю новое значение rmse.

Мои данные выглядят следующим образом, где у меня есть дата и два значения:

         dates         val1         val2
1   2010-01-01 -0.479526441 -0.294149127
2   2010-01-02 -0.860588950  0.426375720
3   2010-01-03 -0.660643894 -1.483020861
4   2010-01-04 -0.938748812 -1.631823690

Где я ошибаюсь в коде?

Данные и попытка:

d <- data.frame(
  dates = seq(from = as.Date("2010-01-01"), to = as.Date("2012-12-31"), by = 1),
  val1 = rnorm(1096),
  val2 = rnorm(1096)
)

d %>% 
  mutate(rollRMSE = rollapply(., width = 30, by = 1, FUN = Metrics::rmse(val1, val2)))

Ответы [ 2 ]

1 голос
/ 31 октября 2019

Вы можете сделать это вручную с помощью базы R, т.е.

sapply(seq(0, (nrow(d) - 30)), function(i) Metrics::rmse(d$val1[(seq(30) + i)], d$val2[(seq(30) + i)]))
1 голос
/ 31 октября 2019

РЕДАКТИРОВАТЬ: установка window размера в качестве переменной

Если я нарезал шаги, в результате операции rollapply будет получено на 29 данных меньше с окном 30, поэтому может потребоваться собрать их в другом столбце.

suppressPackageStartupMessages(library(dplyr))

d <- data.frame(
        dates = seq(from = as.Date("2010-01-01"), to = as.Date("2012-12-31"), by = 1),
        val1 = rnorm(1096),
        val2 = rnorm(1096)
)

rse <- function(x, y){sqrt((x-y)**2)}

# assign window size for moving average
window <- 30

d %>% tibble::as_tibble() %>% 
        mutate(err = rse(val1, val2),
             roll = c(zoo::rollapply(err, width = window, by = 1, FUN = mean), rep(NA, window -1) )
)
#> # A tibble: 1,096 x 5
#>    dates          val1   val2   err  roll
#>    <date>        <dbl>  <dbl> <dbl> <dbl>
#>  1 2010-01-01 -0.0248   1.18  1.20   1.40
#>  2 2010-01-02 -0.684    0.603 1.29   1.38
#>  3 2010-01-03 -0.344   -1.92  1.58   1.42
#>  4 2010-01-04  0.447    0.319 0.128  1.38
#>  5 2010-01-05  0.123   -0.810 0.933  1.42
#>  6 2010-01-06  0.00384  2.29  2.29   1.43
#>  7 2010-01-07 -1.51    -1.03  0.487  1.39
#>  8 2010-01-08  0.394   -1.25  1.64   1.41
#>  9 2010-01-09 -1.30     1.61  2.92   1.42
#> 10 2010-01-10  0.394    0.117 0.278  1.33
#> # ... with 1,086 more rows
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...