使用寓言包的预测中准确性表中仅NaN

时间:2019-11-17 16:26:01

标签: r fable-r tsibble

我有此数据,

> dput(dt_tsbl)
structure(list(series.id = c(225L, 225L, 225L, 225L, 225L, 225L, 
225L, 225L, 225L, 225L, 225L, 225L, 225L, 225L, 225L, 225L, 225L, 
225L, 225L, 225L, 225L, 225L, 225L, 225L, 225L, 225L, 225L, 225L, 
225L, 225L, 225L, 225L, 225L, 225L, 225L, 225L, 225L, 225L, 225L, 
225L, 225L, 225L, 225L, 225L, 225L, 225L, 225L, 225L, 225L, 225L, 
225L, 225L, 225L, 225L, 225L, 225L, 225L, 225L, 225L, 225L, 365L, 
365L, 365L, 365L, 365L, 365L, 365L, 365L, 365L, 365L, 365L, 365L, 
365L, 365L, 365L, 365L, 365L, 365L, 365L, 365L, 365L, 365L, 365L, 
365L, 365L, 365L, 365L, 365L, 365L, 365L, 365L, 365L, 365L, 365L, 
365L, 365L, 365L, 365L, 365L, 365L, 365L, 365L, 365L, 365L, 365L, 
365L, 365L, 365L, 365L, 365L, 365L, 365L, 365L, 365L, 365L, 365L, 
365L, 365L, 365L, 365L, 585L, 585L, 585L, 585L, 585L, 585L, 585L, 
585L, 585L, 585L, 585L, 585L, 585L, 585L, 585L, 585L, 585L, 585L, 
585L, 585L, 585L, 585L, 585L, 585L, 585L, 585L, 585L, 585L, 585L, 
585L, 585L, 585L, 585L, 585L, 585L, 585L, 585L, 585L, 585L, 585L, 
585L, 585L, 585L, 585L, 585L, 585L, 585L, 585L, 585L, 585L, 585L, 
585L, 585L, 585L, 585L, 585L, 585L, 585L, 585L, 585L), series.total = c(281L, 
337L, 397L, 413L, 304L, 295L, 331L, 280L, 471L, 397L, 335L, 165L, 
323L, 383L, 400L, 394L, 402L, 562L, 408L, 356L, 509L, 548L, 460L, 
367L, 425L, 412L, 416L, 493L, 469L, 372L, 379L, 393L, 482L, 420L, 
406L, 298L, 371L, 394L, 436L, 339L, 513L, 401L, 328L, 376L, 525L, 
522L, 409L, 333L, 451L, 381L, 477L, 464L, 378L, 422L, 374L, 404L, 
438L, 503L, 425L, 299L, 18L, 17L, 15L, 17L, 14L, 23L, 24L, 20L, 
45L, 24L, 17L, 13L, 14L, 16L, 24L, 30L, 57L, 29L, 26L, 27L, 30L, 
35L, 25L, 20L, 22L, 26L, 28L, 42L, 31L, 31L, 24L, 22L, 64L, 21L, 
25L, 22L, 24L, 18L, 15L, 19L, 46L, 23L, 22L, 25L, 21L, 18L, 26L, 
14L, 9L, 15L, 18L, 13L, 12L, 17L, 30L, 16L, 22L, 22L, 23L, 20L, 
182L, 211L, 298L, 172L, 263L, 248L, 263L, 223L, 282L, 224L, 246L, 
189L, 182L, 232L, 272L, 236L, 215L, 301L, 290L, 251L, 263L, 286L, 
282L, 266L, 258L, 224L, 239L, 245L, 274L, 261L, 301L, 247L, 234L, 
265L, 272L, 230L, 234L, 259L, 242L, 224L, 264L, 229L, 248L, 213L, 
288L, 279L, 244L, 239L, 201L, 195L, 212L, 222L, 286L, 246L, 222L, 
254L, 339L, 270L, 243L, 267L), mth = structure(c(16071, 16102, 
16130, 16161, 16191, 16222, 16252, 16283, 16314, 16344, 16375, 
16405, 16436, 16467, 16495, 16526, 16556, 16587, 16617, 16648, 
16679, 16709, 16740, 16770, 16801, 16832, 16861, 16892, 16922, 
16953, 16983, 17014, 17045, 17075, 17106, 17136, 17167, 17198, 
17226, 17257, 17287, 17318, 17348, 17379, 17410, 17440, 17471, 
17501, 17532, 17563, 17591, 17622, 17652, 17683, 17713, 17744, 
17775, 17805, 17836, 17866, 16071, 16102, 16130, 16161, 16191, 
16222, 16252, 16283, 16314, 16344, 16375, 16405, 16436, 16467, 
16495, 16526, 16556, 16587, 16617, 16648, 16679, 16709, 16740, 
16770, 16801, 16832, 16861, 16892, 16922, 16953, 16983, 17014, 
17045, 17075, 17106, 17136, 17167, 17198, 17226, 17257, 17287, 
17318, 17348, 17379, 17410, 17440, 17471, 17501, 17532, 17563, 
17591, 17622, 17652, 17683, 17713, 17744, 17775, 17805, 17836, 
17866, 16071, 16102, 16130, 16161, 16191, 16222, 16252, 16283, 
16314, 16344, 16375, 16405, 16436, 16467, 16495, 16526, 16556, 
16587, 16617, 16648, 16679, 16709, 16740, 16770, 16801, 16832, 
16861, 16892, 16922, 16953, 16983, 17014, 17045, 17075, 17106, 
17136, 17167, 17198, 17226, 17257, 17287, 17318, 17348, 17379, 
17410, 17440, 17471, 17501, 17532, 17563, 17591, 17622, 17652, 
17683, 17713, 17744, 17775, 17805, 17836, 17866), class = c("yearmonth", 
"Date"))), row.names = c(NA, -180L), key = structure(list(series.id = c(225L, 
365L, 585L), .rows = list(1:60, 61:120, 121:180)), row.names = c(NA, 
-3L), class = c("tbl_df", "tbl", "data.frame"), .drop = TRUE), index = structure("mth", ordered = TRUE), index2 = "mth", 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), class = "interval"), class = c("tbl_ts", 
"tbl_df", "tbl", "data.frame"))

我尝试使用以下几行使用寓言包来运行一些预测模型,

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

fit1 <- dt_tsbl %>%
  model(
    arima = ARIMA(series.total),
    ets = ETS(series.total),
    snaive = SNAIVE(series.total),
  )

fit1

预测mable如下,

> fit1
# A mable: 3 x 4
# Key:     series.id [3]
  series.id arima                             ets          snaive  
      <int> <model>                           <model>      <model> 
1       225 <ARIMA(0,1,2)(1,0,0)[12]>         <ETS(A,N,A)> <SNAIVE>
2       365 <ARIMA(1,0,0) w/ mean>            <ETS(M,N,M)> <SNAIVE>
3       585 <ARIMA(0,0,0)(0,0,1)[12] w/ mean> <ETS(A,N,N)> <SNAIVE>

我有预测值,

> fc
# A fable: 9 x 5 [1M]
# Key:     series.id, .model [9]
  series.id .model      mth series.total .distribution
      <int> <chr>     <mth>        <dbl> <dist>       
1       225 arima  2019 Jan        398.  N(398, 4748) 
2       365 arima  2019 Jan         22.8 N(23, 98)    
3       585 arima  2019 Jan        232.  N(232, 979)  
4       225 ets    2019 Jan        385.  N(385, 3101) 
5       365 ets    2019 Jan         14.5 N(14, 21)    
6       585 ets    2019 Jan        247.  N(247, 1103) 
7       225 snaive 2019 Jan        451   N(451, 7661) 
8       365 snaive 2019 Jan          9   N(9, 203)    
9       585 snaive 2019 Jan        201   N(201, 1295) 

看起来我有预测值。但是accuracy函数不会产生任何结果,

> accuracy(fc, dt_tsbl)
# A tibble: 9 x 10
  .model series.id .type    ME  RMSE   MAE   MPE  MAPE  MASE  ACF1
  <chr>      <int> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 arima        225 Test    NaN   NaN   NaN   NaN   NaN   NaN    NA
2 arima        365 Test    NaN   NaN   NaN   NaN   NaN   NaN    NA
3 arima        585 Test    NaN   NaN   NaN   NaN   NaN   NaN    NA
4 ets          225 Test    NaN   NaN   NaN   NaN   NaN   NaN    NA
5 ets          365 Test    NaN   NaN   NaN   NaN   NaN   NaN    NA
6 ets          585 Test    NaN   NaN   NaN   NaN   NaN   NaN    NA
7 snaive       225 Test    NaN   NaN   NaN   NaN   NaN   NaN    NA
8 snaive       365 Test    NaN   NaN   NaN   NaN   NaN   NaN    NA
9 snaive       585 Test    NaN   NaN   NaN   NaN   NaN   NaN    NA
Warning messages:
1: The future dataset is incomplete, incomplete out-of-sample data will be treated as missing. 
1 observation is missing at 2019 Jan 
2: 1 error encountered
[1] subscript out of bounds

3: 1 error encountered
[1] subscript out of bounds

4: 1 error encountered
[1] subscript out of bounds

5: 1 error encountered
[1] subscript out of bounds

6: 1 error encountered
[1] subscript out of bounds

7: 1 error encountered
[1] subscript out of bounds

8: 1 error encountered
[1] subscript out of bounds

9: 1 error encountered
[1] subscript out of bounds

10: 1 error encountered
[1] subscript out of bounds

有人可以帮我弄清楚这里出了什么问题吗?

这里有一个使用forecast软件包的similar post,但这并不能帮助我理解为什么我有NaN

1 个答案:

答案 0 :(得分:1)

正如警告消息所暗示的那样,dt_tsbl不包含未来的观察结果2019 Jan,因此,样本外的准确性不可用({{1 }}。

对于样本内准确性,NaN就足够了。

accuracy(fit1)

reprex package(v0.3.0)于2019-11-18创建

要获得样本外的准确性,您需要将library(tidyverse) library(tsibble) library(fable) fit1 <- dt_tsbl %>% model( arima = ARIMA(series.total), ets = ETS(series.total), snaive = SNAIVE(series.total), ) accuracy(fit1) #> # A tibble: 9 x 10 #> series.id .model .type ME RMSE MAE MPE MAPE MASE ACF1 #> <int> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> #> 1 225 arima Traini… 6.32 66.6 49.8 -1.14 13.2 0.746 -4.34e-2 #> 2 365 arima Traini… 0.0255 9.76 6.50 -12.9 28.5 0.661 -1.42e-2 #> 3 585 arima Traini… 0.945 30.8 24.6 -1.26 10.3 0.820 1.06e-1 #> 4 225 ets Traini… 1.26 48.8 36.5 -0.983 9.52 0.547 -3.38e-2 #> 5 365 ets Traini… -0.735 8.27 6.18 -10.7 28.0 0.628 7.54e-4 #> 6 585 ets Traini… 0.0185 32.7 25.8 -1.84 10.9 0.861 1.34e-1 #> 7 225 snaive Traini… 21.0 87.5 66.8 3.74 16.0 1.000 3.10e-1 #> 8 365 snaive Traini… -0.625 14.2 9.83 -16.9 44.0 1 3.55e-2 #> 9 585 snaive Traini… 3.25 36.0 30.0 0.323 11.9 1 1.30e-1 分为训练集和测试集,然后将dt_tsbl替换为accuracy(fc, dt_tsbl)。 / p>