【问题标题】:Irregular time series in fable package寓言包中的不规则时间序列
【发布时间】:2021-02-08 17:59:15
【问题描述】:

在 tsibble 包和 fable 包中,我想我在某个地方读到了我们可以处理不规则时间序列的地方。 我找不到任何关于如何做的例子。我的一些问题是:

  1. 是否必须先将不规则时间序列转换为规则时间序列才能建模? (到目前为止,我所知道的是我们需要将不规则时间序列转换为规则时间序列。如果不是这样,请告诉我?如果不是,那么有哪些模型不需要规则时间序列?)李>
  2. tidyverts/tsibble/ fable /fabletools 中处理不规则时间序列的工具和模型有哪些?

是否有任何问题/链接可以让我看到一个工作示例? 例如This question uses zoo/xts to handle it.

我在 zoo/xts 中看到了一些与此相关的功能,这总是很好,但我在 fable 上旋转我的车轮并试图让它发挥作用。

对于我们可以使用的示例数据集

    DF <- structure(list(station = c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 
2L), Time = structure(c(1L, 2L, 3L, 5L, 7L, 1L, 2L, 4L, 6L, 8L
), .Label = c("01-01-1974", "01-02-1974", "01-03-1974", "01-04-1974", 
"01-05-1974", "01-06-1974", "01-07-1974", "01-08-1974"), class = "factor"), 
    WaterTemp = c(5, 5, 8.6000004, 8.1333332, 12.7999999, 5, 
    5, 8.6000004, 8.1333332, 12.7999999)), .Names = c("station", 
"Time", "WaterTemp"), class = "data.frame", row.names = c(NA, 
-10L))

【问题讨论】:

    标签: r tsibble fable tidyverts


    【解决方案1】:

    {fable} 中提供的大多数模型都要求观察结果是有规律的,并且许多模型还要求数据中没有间隙。支持不规则数据的示例模型是fable::TSLM()

    上述示例数据通常被认为是“常规的”,但存在差距。这是因为数据有一个共同的区间1 month,但是数据中缺少一些月份。以下是如何生成此数据的 tsibble:

    DF <- structure(list(station = c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 
                                     2L), Time = structure(c(1L, 2L, 3L, 5L, 7L, 1L, 2L, 4L, 6L, 8L
                                     ), .Label = c("01-01-1974", "01-02-1974", "01-03-1974", "01-04-1974", 
                                                   "01-05-1974", "01-06-1974", "01-07-1974", "01-08-1974"), class = "factor"), 
                         WaterTemp = c(5, 5, 8.6000004, 8.1333332, 12.7999999, 5, 
                                       5, 8.6000004, 8.1333332, 12.7999999)), .Names = c("station", 
                                                                                         "Time", "WaterTemp"), class = "data.frame", row.names = c(NA, 
                                                                                                                                                   -10L))
    
    # Fix $Time to a valid yearmonth index variable
    library(tsibble)
    library(dplyr)
    DF <- DF %>% 
      mutate(Time = yearmonth(as.Date(format(Time), format = "%d-%m-%Y")))
    DF
    #>    station     Time WaterTemp
    #> 1        1 1974 Jan  5.000000
    #> 2        1 1974 Feb  5.000000
    #> 3        1 1974 Mar  8.600000
    #> 4        1 1974 May  8.133333
    #> 5        1 1974 Jul 12.800000
    #> 6        2 1974 Jan  5.000000
    #> 7        2 1974 Feb  5.000000
    #> 8        2 1974 Apr  8.600000
    #> 9        2 1974 Jun  8.133333
    #> 10       2 1974 Aug 12.800000
    
    # Create a 'regular' tsibble (with gaps)
    as_tsibble(DF, key = "station", index = "Time")
    #> # A tsibble: 10 x 3 [1M]
    #> # Key:       station [2]
    #>    station     Time WaterTemp
    #>      <int>    <mth>     <dbl>
    #>  1       1 1974 Jan      5   
    #>  2       1 1974 Feb      5   
    #>  3       1 1974 Mar      8.60
    #>  4       1 1974 May      8.13
    #>  5       1 1974 Jul     12.8 
    #>  6       2 1974 Jan      5   
    #>  7       2 1974 Feb      5   
    #>  8       2 1974 Apr      8.60
    #>  9       2 1974 Jun      8.13
    #> 10       2 1974 Aug     12.8
    

    要填补此数据集的空白 - 类似于 linked question 中显示的内容 - 您可以使用 tsibble::fill_gaps() 函数。这使得数据与支持缺失值但不支持数据间隙的模型兼容,例如fable::ARIMA()

    # Create a 'regular' tsibble (with gaps) then complete the gaps
    as_tsibble(DF, key = "station", index = "Time") %>% 
      fill_gaps()
    #> # A tsibble: 15 x 3 [1M]
    #> # Key:       station [2]
    #>    station     Time WaterTemp
    #>      <int>    <mth>     <dbl>
    #>  1       1 1974 Jan      5   
    #>  2       1 1974 Feb      5   
    #>  3       1 1974 Mar      8.60
    #>  4       1 1974 Apr     NA   
    #>  5       1 1974 May      8.13
    #>  6       1 1974 Jun     NA   
    #>  7       1 1974 Jul     12.8 
    #>  8       2 1974 Jan      5   
    #>  9       2 1974 Feb      5   
    #> 10       2 1974 Mar     NA   
    #> 11       2 1974 Apr      8.60
    #> 12       2 1974 May     NA   
    #> 13       2 1974 Jun      8.13
    #> 14       2 1974 Jul     NA   
    #> 15       2 1974 Aug     12.8
    

    可以使用regular = FALSE 创建不规则的时间序列。如果您正在处理事件数据,这通常很有用。在这种情况下,您很少想填补空白,因为有太多的空白。

    # Create an 'irregular' tsibble (no concept of gaps)
    as_tsibble(DF, key = "station", index = "Time", regular = FALSE)
    #> # A tsibble: 10 x 3 [!]
    #> # Key:       station [2]
    #>    station     Time WaterTemp
    #>      <int>    <mth>     <dbl>
    #>  1       1 1974 Jan      5   
    #>  2       1 1974 Feb      5   
    #>  3       1 1974 Mar      8.60
    #>  4       1 1974 May      8.13
    #>  5       1 1974 Jul     12.8 
    #>  6       2 1974 Jan      5   
    #>  7       2 1974 Feb      5   
    #>  8       2 1974 Apr      8.60
    #>  9       2 1974 Jun      8.13
    #> 10       2 1974 Aug     12.8
    

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

    【讨论】:

    • 感谢您提供的信息。我的数据是不规则的,传感器在一天中的不同时间以不规则的时间间隔读数。我无法发布该数据,也没有找到一个好的示例数据集来发布在这里。我确实使用了regular = FALSE,但是没有一个模型起作用..你是对的,除了每天阅读几次之外,每小时都有 NA 的空白。
    • 我浏览了你的博客,真的很有帮助。非常感谢您的出色工作。我可以请您添加一些示例,说明如何优雅地将预测合并回原始数据集。绘制它们很好,但也需要它们作为表格。我可以通过使用hilo 将我的fbl_ts 转换为tbl_ts 来获得它,因为dplyr::selectfbl_ts 上没有按预期工作。但我相信有一种优雅的方法可以做到这一点。
    • 对于不规则的传感器数据,设置regular = FALSE比较合适。但是,这限制了适用于此类数据的模型。目前fable::TSLM() 是唯一适用于不规则数据的寓言模型。如果合适的话,你也可以考虑一些方法来使你的数据有规律(聚合、更一致的数据收集、近似等)以使用其他时间序列模型。您的第二条评论听起来像是一个不同的问题,您可以为此打开一个新的 Stack Overflow 问题。
    猜你喜欢
    • 2016-04-07
    • 2011-04-23
    • 2012-05-12
    • 2014-09-02
    • 2011-06-16
    • 2023-01-20
    • 1970-01-01
    • 2013-11-07
    • 2017-03-06
    相关资源
    最近更新 更多