使用 rollapply 应用滚动误差函数
applying a rolling error function using rollapply
我正在尝试计算 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)))
编辑:将 window
大小设置为变量
我已经切分了步骤,rollapply 将导致 29 个数据减少 30 个 window 所以可能想在另一个 tibble 中收集它。
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
您可以使用 base R 手动完成,即
sapply(seq(0, (nrow(d) - 30)), function(i) Metrics::rmse(d$val1[(seq(30) + i)], d$val2[(seq(30) + i)]))
我正在尝试计算 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)))
编辑:将 window
大小设置为变量
我已经切分了步骤,rollapply 将导致 29 个数据减少 30 个 window 所以可能想在另一个 tibble 中收集它。
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
您可以使用 base R 手动完成,即
sapply(seq(0, (nrow(d) - 30)), function(i) Metrics::rmse(d$val1[(seq(30) + i)], d$val2[(seq(30) + i)]))