【问题标题】:Given a tsibble with more than one key, is tidyverts able to box_cox() each time series using a respective lambda_guerrero value per time series?给定一个具有多个键的 tsibble,tidyverts 是否能够使用每个时间序列的相应 lambda_guerrero 值对每个时间序列进行 box_cox()?
【发布时间】:2021-04-14 06:06:06
【问题描述】:

我的问题是:如果我有一个包含多个键 (n_keys > 1) 和一个或多个键变量 (key_vars >= 1) 的 tsibble,tidyverts 套件是否能够使用每个时间序列的相应 lambda_guerrero 值对每个时间序列执行 box_cox 转换(每个时间序列一个 box_cox 转换)?下面是我(第一次)尝试一个最小可重现的例子。

例如:我想知道是否可以使用 tidyverts 套件执行“步骤 5”而不会收到错误。与其将 lambda1=0.36 应用于让步、一般和聚合,如“步骤 4”中所见,没有错误,我想将 0.25 应用于让步,0.66 应用于一般,0.36 应用于聚合,如果可能的话。

谢谢!

library(tidyverse) 
library(lubridate)
library(tsibble)
library(tsibbledata)
library(fabletools)
library(fable)
library(feasts)
library(distributional)

步骤一:一键,无需转换:

tsibbledata::PBS %>% summarize(Cost = sum(Cost)) %>% autoplot(Cost)

第二步:一键,带变换:

类似于 FPP3 第 3.1 章中的示例。供参考:https://otexts.com/fpp3/transformations.html

lambda1 <- tsibbledata::PBS %>% 
summarize(Cost = sum(Cost)) %>%
features(Cost, features = guerrero) %>% 
pull(lambda_guerrero) # [1] 0.3642197

tsibbledata::PBS %>% summarize(Cost = sum(Cost)) %>% autoplot(box_cox(Cost,lambda1))

第 3 步:三个键,无需转换:

tsibbledata::PBS %>% aggregate_key(Concession, Cost = sum(Cost)) %>% autoplot(Cost)

第 4 步:三个键,一个转换:

tsibbledata::PBS %>%
aggregate_key(Concession, Cost = sum(Cost)) %>% 
autoplot(box_cox(Cost,lambda1))

第五步:三个键,三个变换:

lambda2 <- tsibbledata::PBS %>% 
aggregate_key(Concession, Cost = sum(Cost)) %>%
features(Cost, features = guerrero) %>% 
pull(lambda_guerrero) # [1] 0.2518823 0.6577645 0.3642197
lambda2
A tibble: 3 x 2
Concession   lambda_guerrero
<chr*>                 <dbl>
1 Concessional           0.252
2 General                0.658
3 <aggregated>           0.364

tsibbledata::PBS %>%
  aggregate_key(Concession, Cost = sum(Cost)) %>%
  autoplot(box_cox(Cost,lambda2)) # caused an error

【问题讨论】:

    标签: r fable-r tsibble tidyverts


    【解决方案1】:

    您上次尝试的问题与输入到box_cox(Cost, lambda2) 的值的长度有关。 Cost 的长度为 612(3 个系列的 204 个观察值),lambda2 的长度为 3。因此 R 将尝试复制 lambda2 中的值以使长度匹配(称为“回收”)。

    但是,在这种情况下它做错了。它匹配Cost[1]lambda2[1](正确)、Cost[2]lambda2[2](错误)、Cost[3]lambda2[3](错误)、Cost[3]lambda2[1](正确)等。 参数的正确回收是Cost[1:204]lambda2[1]Cost[205:408]lambda2[2]Cost[409:612]lambda2[3],所以我们需要保证这一点。

    这可以通过rep(lambda2, each = 204) 完成,但是最好/最安全的方法是使用连接操作。这可确保参数匹配正确的系列(并防止出现行排序问题)。 下面的代码显示了如何使用left_join() 完成此操作,它将 lambda 值与基于 Concession 列的数据相匹配。 请注意,该图看起来不太好,因为转换(和数据)在非常不同的尺度上产生值。为了解决这个问题,我建议为每个系列生成不同的 y 轴刻度(如下所示)。

    library(fpp3)
    lambda2 <- tsibbledata::PBS %>%
      aggregate_key(Concession, Cost = sum(Cost)) %>%
      features(Cost, features = guerrero)
    
    lambda2
    #> # A tibble: 3 x 2
    #>   Concession   lambda_guerrero
    #>   <chr*>                 <dbl>
    #> 1 Concessional           0.252
    #> 2 General                0.658
    #> 3 <aggregated>           0.364
    
    tsibbledata::PBS %>%
      aggregate_key(Concession, Cost = sum(Cost)) %>%
      # Add lambda to the dataset, matching based on the key variable
      left_join(lambda2, by = "Concession") %>% 
      autoplot(box_cox(Cost, lambda_guerrero))
    

    tsibbledata::PBS %>%
      aggregate_key(Concession, Cost = sum(Cost)) %>%
      # Add lambda to the dataset, matching based on the key variable
      left_join(lambda2, by = "Concession") %>% 
      autoplot(box_cox(Cost, lambda_guerrero)) + 
      facet_grid(rows = vars(Concession), scales = "free_y")
    

    reprex package (v0.3.0) 于 2021-01-09 创建

    【讨论】:

      最近更新 更多