TS объект не работает для ежедневных данных в R - действительно запутался - PullRequest
1 голос
/ 31 марта 2020

Я потратил 1 день на поиск ответа на этот вопрос и все еще не мог понять, как это работает (относительно плохо знакомый с R).

Данные: у меня ежедневный доход магазина. Дата начала - ноябрь 2017 года, а дата окончания - февраль 2020 года. (Это не типичные данные за январь - де c каждый год). Там нет пропущенной стоимости, и каждый день продажи записываются. Есть 2 столбца: дата (в правильном формате даты) и доход (в числовом формате).

Я пытаюсь построить модель прогнозирования временных рядов для моих данных о продажах. Одним из предварительных условий является то, что мне нужно преобразовать мои данные в объект TS. Все эти сообщения в Интернете, которые я видел, имели дело с годовыми или месячными данными, но я пока не видел, чтобы кто-нибудь упоминал ежедневные данные.

Я пытался преобразовать свои данные в объект ts таким образом (я назвал свои данные "d"):

d_ts <- ts(d$revenue, start=min(d$date), end = max(d$date), frequency = 365)

Затем я получил очень странные результаты, как например:

Start = c(17420, 1) 
End = c(18311, 1)
Frequency = 365 

[1]    1174.77     214.92      10.00     684.86    7020.04   11302.50   30613.55   29920.98   24546.49   22089.89   30291.65   32993.05   26517.11   39670.38   30361.32   17510.72
  [17]    9888.76    3032.27    1229.74    2426.36 ....... [ reached getOption("max.print") -- omitted 324216 entries ]

В этом наборе данных 892 дня, почему размер объекта ts равен 325 216 x 1 ????

Я заглянул в эту книгу под названием «Практические временные ряды с R» и нашел следующую выдержку:

введите описание изображения здесь

Это в основном означает, что объект ts () НЕ работает для ежедневных данных. Вот почему мое преобразование ts () испортилось?

Мои вопросы ...

(1) Как я могу сделать свои данные о ежедневном доходе объектом временных рядов до подачи в модель, если ts () не работает для ежедневного данные? Все эти модели временных рядов требуют, чтобы мои данные были в формате временных рядов.

(2) Есть ли какие-либо осложнения в том, что мои данные не начинаются в январе 2017 года и не заканчиваются в декабре c 2019 (т. Е. Эти идеальные данные за 12 месяцев в году, показанные во многих онлайн-сообщениях) имеют какие-либо осложнения? Если так, что я должен отрегулировать так, чтобы прогнозирование временных рядов было значимым?

Я застрял в этом вопросе и не мог обернуть голову вокруг. Я действительно очень ценю вашу помощь!

Ответы [ 2 ]

0 голосов
/ 01 апреля 2020

С ежедневными данными вам лучше использовать класс tsibble, а не класс ts. В пакете fable доступны инструменты моделирования и прогнозирования.

library(tsibble)
library(fable)

set.seed(1)
d_tsibble <- data.frame(
    date = seq(as.Date("2017-11-01"), by = "day", length.out = 892),
    revenue = rnorm(892)
  ) %>%
  as_tsibble(index = date)

d_tsibble
#> # A tsibble: 892 x 2 [1D]
#>    date       revenue
#>    <date>       <dbl>
#>  1 2017-11-01  -0.626
#>  2 2017-11-02   0.184
#>  3 2017-11-03  -0.836
#>  4 2017-11-04   1.60 
#>  5 2017-11-05   0.330
#>  6 2017-11-06  -0.820
#>  7 2017-11-07   0.487
#>  8 2017-11-08   0.738
#>  9 2017-11-09   0.576
#> 10 2017-11-10  -0.305
#> # … with 882 more rows

d_tsibble %>%
  model(
    arima = ARIMA(revenue)
  ) %>%
  forecast(h = "14 days")
#> # A fable: 14 x 4 [1D]
#> # Key:     .model [1]
#>    .model date          revenue .distribution   
#>    <chr>  <date>          <dbl> <dist>          
#>  1 arima  2020-04-11 -0.0178    N(-1.8e-02, 1.1)
#>  2 arima  2020-04-12 -0.0117    N(-1.2e-02, 1.1)
#>  3 arima  2020-04-13 -0.00765   N(-7.7e-03, 1.1)
#>  4 arima  2020-04-14 -0.00501   N(-5.0e-03, 1.1)
#>  5 arima  2020-04-15 -0.00329   N(-3.3e-03, 1.1)
#>  6 arima  2020-04-16 -0.00215   N(-2.2e-03, 1.1)
#>  7 arima  2020-04-17 -0.00141   N(-1.4e-03, 1.1)
#>  8 arima  2020-04-18 -0.000925  N(-9.2e-04, 1.1)
#>  9 arima  2020-04-19 -0.000606  N(-6.1e-04, 1.1)
#> 10 arima  2020-04-20 -0.000397  N(-4.0e-04, 1.1)
#> 11 arima  2020-04-21 -0.000260  N(-2.6e-04, 1.1)
#> 12 arima  2020-04-22 -0.000171  N(-1.7e-04, 1.1)
#> 13 arima  2020-04-23 -0.000112  N(-1.1e-04, 1.1)
#> 14 arima  2020-04-24 -0.0000732 N(-7.3e-05, 1.1)

Создано в 2020-04-01 пакетом представ (v0.3.0)

0 голосов
/ 31 марта 2020

Функция ts может работать с любым временным интервалом, который определяется начальной и конечной точками. Поскольку вы используете даты, одна единица соответствует одному дню, так как они хранятся внутри. В файле справки ?ts также приведены примеры использования годовых или квартальных данных,

. Для правильного считывания ежедневных данных необходимо установить frequency=1. Используя некоторые данные, сходные по структуре с тем, что вы получили:

#Compile a dataframe like yours
library(lubridate)
set.seed(0)
d <- data.frame(date=seq.Date(dmy("01/11/2017/"), by="day", length.out=892))
d$revenue <- runif(892)

head(d)
#date   revenue
# 1 2017-11-01 0.8966972
# 2 2017-11-02 0.2655087
# 3 2017-11-03 0.3721239
# 4 2017-11-04 0.5728534
# 5 2017-11-05 0.9082078
# 6 2017-11-06 0.2016819

#Convert to timeseries object
d_ts <- ts(d$revenue, start=min(d$date), end = max(d$date), frequency = 1)

d_ts
# Time Series:
#   Start = 17471 
# End = 18362 
# Frequency = 1 
# [1] 0.896697200 0.265508663 0.372123900 0.572853363 0.908207790 0.201681931 0.898389685 0.944675269 0.660797792
# [10] 0.629114044 0.061786270 0.205974575 0.176556753 0.687022847 0.384103718 0.769841420 0.497699242 0.717618508
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...