tsibble как можно обойти неявные пробелы, когда их нет

Я новичок в пакете tsibble. У меня есть ежемесячные данные, которые я принудил к тсибблу, чтобы использовать пакет fable. У меня есть несколько проблем

  • Похоже, что индексная переменная (из моего тестирования) не относится к дате класса, хотя я применил к ней функцию lubridate ymd.
  • Функция has_gaps возвращает FALSE, но когда я моделирую данные, я получаю сообщение об ошибке, что «.data содержит неявные пробелы во времени»
library(dplyr)
library(fable)
library(lubridate)
library(tsibble)

test <- data.frame(
   YearMonth = c(20160101, 20160201, 20160301, 20160401, 20160501, 20160601,
                 20160701, 20160801, 20160901, 20161001, 20161101, 20161201),
      Claims = c(13032647, 1668005, 24473616, 13640769, 17891432, 11596556,
                 23176360, 7885872, 11948461, 16194792, 4971310, 18032363),
     Revenue = c(12603367, 18733242, 5862766, 3861877, 15407158, 24534258,
                 15633646, 13720258, 24944078, 13375742, 4537475, 22988443)
)

test_ts <- test %>% 
  mutate(YearMonth = ymd(YearMonth)) %>% 
  as_tsibble(
    index = YearMonth,
    regular = FALSE       #because it picks up gaps when I set it to TRUE
    )

# Are there any gaps?
has_gaps(test_ts, .full = T)

model_new <- test_ts %>% 
  model(
  snaive = SNAIVE(Claims))
Warning messages:
1: 1 error encountered for snaive
[1] .data contains implicit gaps in time. You should check your data and convert implicit gaps into explicit missing values using `tsibble::fill_gaps()` if required.

Любая помощь будет оценена по достоинству.


person Punxsutawney    schedule 31.12.2019    source источник


Ответы (2)


У вас есть дневной индекс, но вам нужен ежемесячный индекс. Самый простой способ - использовать функцию tsibble::yearmonth(), но сначала вам нужно будет преобразовать дату в символ.

library(dplyr)
library(tsibble)

test <- data.frame(
  YearMonth = c(20160101, 20160201, 20160301, 20160401, 20160501, 20160601,
    20160701, 20160801, 20160901, 20161001, 20161101, 20161201),
  Claims = c(13032647, 1668005, 24473616, 13640769, 17891432, 11596556,
    23176360, 7885872, 11948461, 16194792, 4971310, 18032363),
  Revenue = c(12603367, 18733242, 5862766, 3861877, 15407158, 24534258,
    15633646, 13720258, 24944078, 13375742, 4537475, 22988443)
)

test_ts <- test %>%
  mutate(YearMonth = yearmonth(as.character(YearMonth))) %>%
  as_tsibble(index = YearMonth)
person Rob Hyndman    schedule 31.12.2019
comment
Спасибо большое. Это было очень полезно. - person Punxsutawney; 31.12.2019

Похоже, as_tsibble не может правильно распознать интервал в столбце YearMonth, потому что это объект класса Date. В разделе «Указатель» на странице справки скрыто, что это может быть проблемой:

Для tbl_ts регулярного интервала необходимо выбрать представление индекса. Например, ежемесячные данные должны соответствовать временному индексу, созданному с помощью yearmonth или zoo :: yearmon, а не Date или POSIXct.

Как видно из этого отрывка, вы можете обойти проблему с yearmonth(). Но для этого сначала требуется небольшая манипуляция со строкой, чтобы преобразовать ее в формат, который будет правильно анализировать.

test_ts <- test %>% 
  mutate(YearMonth = gsub("(.{2})01$", "-\\1", YearMonth) %>% 
           yearmonth()
         ) %>%
  as_tsibble(
    index = YearMonth
  )

Теперь модель должна работать без ошибок! Не уверен, почему тест has_gaps() говорит, что в вашем примере все в порядке ...

person Nate    schedule 31.12.2019
comment
Я ценю вашу помощь. - person Punxsutawney; 31.12.2019
comment
Небольшое примечание: интервал в один день подходит для ежемесячных данных, представленных классами дат. Это связано с тем, что в месяцах нерегулярное количество дней, и поэтому, когда они представлены в виде ежедневных измерений, наибольший общий знаменатель составляет один день. - person Mitchell O'Hara-Wild; 23.01.2020