[英]Create time series cross validation slices by key in the tidyverts package
有沒有辦法使用 tidyverts package 按鍵創建時間序列交叉驗證集? 我似乎無法正確處理。 以下是我嘗試的代表。
該示例涉及為預測創建時間序列交叉驗證(提前 1 步的切片)。 鍵變量有 2 個不同的值,我希望有一個包含兩個鍵的時間序列切片的 tsibble。 當我嘗試對兩個 tsibble 進行行綁定時,出現錯誤。
library(dplyr)
library(tibble)
library(tsibble)
# helper function
create_cv_slices <- function(data, forecast_horizon) {
data %>%
dplyr::slice(1:(nrow(data) - forecast_horizon)) %>%
tsibble::stretch_tsibble(.init = nrow(data) - 2 * forecast_horizon, .step = 1)
}
# get data
raw_tsbl <- tibble::tribble(
~index, ~key, ~Revenue, ~Claims,
20160101, "series1", 11011836.1, 5386836.696,
20160201, "series1", 11042641.16, 9967325.715,
20160301, "series1", 11445687.52, 10947197.89,
20160401, "series1", 11252943.11, 6980431.415,
20160101, "series2", 12236155, 12526224,
20160201, "series2", 8675364, 9812904,
20160301, "series2", 10081130, 8423497,
20160401, "series2", 14840111, 8079813
) %>%
dplyr::mutate(index = tsibble::yearmonth(as.character(index))) %>%
tsibble::as_tsibble(index = index, key = key)
keys <- unique(raw_tsbl$key)
# split & combine
tbl1 = raw_tsbl %>%
dplyr::filter(key == keys[1]) %>%
create_cv_slices(., forecast_horizon = 1) %>%
tibble::as_tibble()
tbl2 = raw_tsbl %>%
dplyr::filter(key == keys[2]) %>%
create_cv_slices(., forecast_horizon = 1) %>%
tibble::as_tibble()
dplyr::bind_rows(tbl1, tbl2) %>%
tsibble::as_tsibble(index = index, key = key)
#> Error: A valid tsibble must have distinct rows identified by key and index.
#> Please use `duplicates()` to check the duplicated rows.
謝謝你。
似乎使用 bind_rows 來組合 tsibbles 是行不通的。 在as_tsibble
function 中使用 bind_rows 並設置validate = FALSE
可以創建一個 tsibble,但它會將 tsibble 顯示為每日系列而不是每月(應該是這樣)。 但是,使用具有相同參數設置的 rbind 會創建所需的 tsibble。
rbind(tbl1, tbl2) %>%
tsibble::as_tsibble(index = index, key = c(key, .id), validate = F)
謝謝。
您可以在 tsibble 組上計算切片,而不是通過鍵手動拆分數據。 group_by_key()
是一個方便的 function (具有更好的性能),相當於group_by(key)
。 n()
function 是一個組感知 dplyr function ,它給出了當前組的觀察次數。
library(dplyr)
library(tibble)
library(tsibble)
# get data
raw_tsbl <- tibble::tribble(
~index, ~key, ~Revenue, ~Claims,
20160101, "series1", 11011836.1, 5386836.696,
20160201, "series1", 11042641.16, 9967325.715,
20160301, "series1", 11445687.52, 10947197.89,
20160401, "series1", 11252943.11, 6980431.415,
20160101, "series2", 12236155, 12526224,
20160201, "series2", 8675364, 9812904,
20160301, "series2", 10081130, 8423497,
20160401, "series2", 14840111, 8079813
) %>%
dplyr::mutate(index = tsibble::yearmonth(as.character(index))) %>%
tsibble::as_tsibble(index = index, key = key)
forecast_horizon <- 1
raw_tsbl %>%
group_by_key() %>%
slice(1:(n() - forecast_horizon)) %>%
ungroup() %>%
stretch_tsibble(.init = 2, .step = 1)
#> # A tsibble: 10 x 5 [1M]
#> # Key: .id, key [4]
#> index key Revenue Claims .id
#> <mth> <chr> <dbl> <dbl> <int>
#> 1 2016 Jan series1 11011836. 5386837. 1
#> 2 2016 Feb series1 11042641. 9967326. 1
#> 3 2016 Jan series2 12236155 12526224 1
#> 4 2016 Feb series2 8675364 9812904 1
#> 5 2016 Jan series1 11011836. 5386837. 2
#> 6 2016 Feb series1 11042641. 9967326. 2
#> 7 2016 Mar series1 11445688. 10947198. 2
#> 8 2016 Jan series2 12236155 12526224 2
#> 9 2016 Feb series2 8675364 9812904 2
#> 10 2016 Mar series2 10081130 8423497 2
由代表 package (v0.3.0) 於 2020 年 5 月 8 日創建
這段代碼的細微差別是.init
設置為 2,而不是nrow(data)-2*forecast_horizon
。 對於此數據,它給出了相同的結果,但是每個鍵的觀察次數不會有所不同。 一旦 dplyr v1.0.0 發布,使用group_map()
或bind_rows()
類的工具將更容易使用拆分-應用-組合方法為每個鍵指定不同的 window 參數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.