0

以下のような data.frames/tsibbles のリストがあります。これは、RSMODE 列の値に基づいて、より大きな data.frame から分割されています。

library(tsibble)
library(fable)
library(tidyverse)

tsib.list <- list(COMBO = structure(list(RSLITM = c("004", "004", "004", "004", 
"004", "004", "004", "004", "004", "004", "004", "004", "004", 
"004", "004", "004", "004", "004", "004", "004", "004", "004", 
"004", "004", "004", "004", "004", "004", "004", "004", "004", 
"004", "004", "004", "004", "004", "004"), RSFMTH = structure(c(17713, 
17744, 17775, 17805, 17836, 17866, 17897, 17928, 17956, 17987, 
18017, 18048, 18078, 18109, 18140, 18170, 18201, 18231, 18262, 
18293, 18322, 18353, 18383, 18414, 18444, 18475, 18506, 18536, 
18567, 18597, 18628, 18659, 18687, 18718, 18748, 18779, 18809
), class = c("yearmonth", "vctrs_vctr")), RSFQTY = c(285600, 
352200, 273600, 282700, 175800, 138700, 177700, 245900, 165000, 
180100, 298000, 173800, 257300, 282800, 164500, 155100, 232300, 
175500, 226000, 287100, 221400, 270800, 286200, 394400, 336600, 
331000, 224600, 216800, 351600, 374700, 173500, 423700, 357700, 
245200, 454700, 361700, 381200), RSSEAS = c("A", "A", "A", "A", 
"A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", 
"A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", 
"A", "A", "A", "A", "A", "A", "A"), RSTREND = c("N", "N", "N", 
"N", "N", "N", "N", "N", "N", "N", "N", "N", "N", "N", "N", "N", 
"N", "N", "N", "N", "N", "N", "N", "N", "N", "N", "N", "N", "N", 
"N", "N", "N", "N", "N", "N", "N", "N"), RSMODE = c("COMBO", 
"COMBO", "COMBO", "COMBO", "COMBO", "COMBO", "COMBO", "COMBO", 
"COMBO", "COMBO", "COMBO", "COMBO", "COMBO", "COMBO", "COMBO", 
"COMBO", "COMBO", "COMBO", "COMBO", "COMBO", "COMBO", "COMBO", 
"COMBO", "COMBO", "COMBO", "COMBO", "COMBO", "COMBO", "COMBO", 
"COMBO", "COMBO", "COMBO", "COMBO", "COMBO", "COMBO", "COMBO", 
"COMBO")), row.names = c(NA, -37L), key = structure(list(RSLITM = "004", 
    RSSEAS = "A", RSTREND = "N", RSMODE = "COMBO", .rows = structure(list(
        1:37), ptype = integer(0), class = c("vctrs_list_of", 
    "vctrs_vctr", "list"))), row.names = c(NA, -1L), class = c("tbl_df", 
"tbl", "data.frame"), .drop = TRUE), index = structure("RSFMTH", ordered = TRUE), index2 = "RSFMTH", interval = structure(list(
    year = 0, quarter = 0, month = 1, week = 0, day = 0, hour = 0, 
    minute = 0, second = 0, millisecond = 0, microsecond = 0, 
    nanosecond = 0, unit = 0), .regular = TRUE, class = c("interval", 
"vctrs_rcrd", "vctrs_vctr")), class = c("tbl_ts", "tbl_df", "tbl", 
"data.frame")), EXP = structure(list(RSLITM = c("005", "005", 
"005", "005", "005", "005", "005", "005", "005", "005", "005", 
"005", "005", "005", "005", "005", "005", "005", "005", "005", 
"005", "005", "005", "005", "005", "005", "005", "005", "005", 
"005", "005", "005", "005", "005", "005", "005", "005", "006", 
"006", "006", "006", "006", "006", "006", "006", "006", "006", 
"006", "006", "006", "006", "006", "006", "006", "006", "006", 
"006", "006", "006", "006", "006", "006", "006", "006", "006", 
"006", "006", "006", "006", "006", "006", "006", "006", "006"
), RSFMTH = structure(c(17713, 17744, 17775, 17805, 17836, 17866, 
17897, 17928, 17956, 17987, 18017, 18048, 18078, 18109, 18140, 
18170, 18201, 18231, 18262, 18293, 18322, 18353, 18383, 18414, 
18444, 18475, 18506, 18536, 18567, 18597, 18628, 18659, 18687, 
18718, 18748, 18779, 18809, 17713, 17744, 17775, 17805, 17836, 
17866, 17897, 17928, 17956, 17987, 18017, 18048, 18078, 18109, 
18140, 18170, 18201, 18231, 18262, 18293, 18322, 18353, 18383, 
18414, 18444, 18475, 18506, 18536, 18567, 18597, 18628, 18659, 
18687, 18718, 18748, 18779, 18809), class = c("yearmonth", "vctrs_vctr"
)), RSFQTY = c(79000, 58100, 66300, 52700, 68600, 33000, 76600, 
85600, 84100, 49000, 98000, 113500, 83800, 64000, 116800, 72000, 
65200, 49800, 33300, 79800, 48000, 81600, 125000, 53500, 97600, 
80000, 81900, 80000, 53800, 39000, 73800, 76600, 33700, 60200, 
84000, 66600, 32400, 285600, 352200, 273600, 282700, 175800, 
138700, 177700, 245900, 165000, 180100, 298000, 173800, 257300, 
282800, 164500, 155100, 232300, 175500, 226000, 287100, 221400, 
270800, 286200, 394400, 336600, 331000, 224600, 216800, 351600, 
374700, 173500, 423700, 357700, 245200, 454700, 361700, 381200
), RSSEAS = c("N", "N", "N", "N", "N", "N", "N", "N", "N", "N", 
"N", "N", "N", "N", "N", "N", "N", "N", "N", "N", "N", "N", "N", 
"N", "N", "N", "N", "N", "N", "N", "N", "N", "N", "N", "N", "N", 
"N", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", 
"A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", 
"A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A"), 
    RSTREND = c("N", "N", "N", "N", "N", "N", "N", "N", "N", 
    "N", "N", "N", "N", "N", "N", "N", "N", "N", "N", "N", "N", 
    "N", "N", "N", "N", "N", "N", "N", "N", "N", "N", "N", "N", 
    "N", "N", "N", "N", "N", "N", "N", "N", "N", "N", "N", "N", 
    "N", "N", "N", "N", "N", "N", "N", "N", "N", "N", "N", "N", 
    "N", "N", "N", "N", "N", "N", "N", "N", "N", "N", "N", "N", 
    "N", "N", "N", "N", "N"), RSMODE = c("EXP", "EXP", "EXP", 
    "EXP", "EXP", "EXP", "EXP", "EXP", "EXP", "EXP", "EXP", "EXP", 
    "EXP", "EXP", "EXP", "EXP", "EXP", "EXP", "EXP", "EXP", "EXP", 
    "EXP", "EXP", "EXP", "EXP", "EXP", "EXP", "EXP", "EXP", "EXP", 
    "EXP", "EXP", "EXP", "EXP", "EXP", "EXP", "EXP", "EXP", "EXP", 
    "EXP", "EXP", "EXP", "EXP", "EXP", "EXP", "EXP", "EXP", "EXP", 
    "EXP", "EXP", "EXP", "EXP", "EXP", "EXP", "EXP", "EXP", "EXP", 
    "EXP", "EXP", "EXP", "EXP", "EXP", "EXP", "EXP", "EXP", "EXP", 
    "EXP", "EXP", "EXP", "EXP", "EXP", "EXP", "EXP", "EXP")), row.names = c(NA, 
-74L), key = structure(list(RSLITM = c("005", "006"), RSSEAS = c("N", 
"A"), RSTREND = c("N", "N"), RSMODE = c("EXP", "EXP"), .rows = structure(list(
    1:37, 38:74), ptype = integer(0), class = c("vctrs_list_of", 
"vctrs_vctr", "list"))), row.names = c(NA, -2L), class = c("tbl_df", 
"tbl", "data.frame"), .drop = TRUE), index = structure("RSFMTH", ordered = TRUE), index2 = "RSFMTH", interval = structure(list(
    year = 0, quarter = 0, month = 1, week = 0, day = 0, hour = 0, 
    minute = 0, second = 0, millisecond = 0, microsecond = 0, 
    nanosecond = 0, unit = 0), .regular = TRUE, class = c("interval", 
"vctrs_rcrd", "vctrs_vctr")), class = c("tbl_ts", "tbl_df", "tbl", 
"data.frame")))

tsibble/data.frame には、需要の履歴と、指数平滑法やその他の時系列モデルを推定するために使用されるパラメーターに関する情報が含まれています。これらのパラメーターは、R​​SLITM ごとに異なる場合があります。

リストは、より大きな data.frame が RSMODE 列で分割されたときに作成されたため、リスト内の各 data.frames で使用される関数がいくつかあります。ARIMA 関数があることに注意してください。ただし、このテスト data.frame には、予測目的で ARIMA モデルを推定するために指定された RSLITM はありません。

combo.function <- function(tsib){
  season.param <- tsib[["RSSEAS"]][1]
  trend.param <- tsib[["RSTREND"]][1]
  fmla <- as.formula(glue::glue("RSFQTY ~ trend('{trend.param}') +", 
                                " season('{season.param}')"))
  print(fmla)
  tsib %>% model(EXP = ETS(fmla), ARI = ARIMA(RSFQTY)) %>% mutate(COM = (ARI + EXP)/2) %>% forecast(h = "3 years") %>% filter(.model == "COM") 
}

ets.function <- function(tsib){
  season.param <- tsib[["RSSEAS"]][1]
  trend.param <- tsib[["RSTREND"]][1]
  fmla <- as.formula(glue::glue("RSFQTY ~ trend('{trend.param}') +", 
                                " season('{season.param}')"))
  print(fmla)
  tsib %>% model(EXP = ETS(fmla)) %>% forecast(h = "3 years") 
}

arima.function <- function(tsib){
  tsib %>% model(ARI = ARIMA(RSFQTY)) %>% forecast(h = "3 years")
}

以下のコードを使用して、リスト内の各 data.frame/tsibble の RSLITM ごとに適切なモデルを推定しています。ただし、ARIMA モデルを使用して予測する RSLITM が指定されていないため、この場合は ARIMA リスト要素がないため、問題が発生します。(RSMODE 列に「ARIMA」値を持つ RLSITM はありません。) したがって、エラーがスローされます。

try()または同様の関数を使用してこれを処理する方法があると思いますが、のコンテキストでこれを使用する方法がわかりませんmap()

pmap_dfr(list(tsib = list(tsib.list$ARIMA, tsib.list$COMBO, tsib.list$EXP), func = list(arima.function, combo.function, ets.function)), 
         function(tsib, func) map(tsib %>% group_split(RSLITM), func))

これは私が得るエラーです。

Error in UseMethod("group_split") : 
  no applicable method for 'group_split' applied to an object of class "NULL" 
4

0 に答える 0