Прогноз с использованием модели ARIMA с использованием указанных c месяцев и лет в R? - PullRequest
1 голос
/ 10 июля 2020

Я хочу обучить свою модель, используя определенные c лет и месяцев (которые не являются непрерывной последовательностью). Затем используйте подобранный коэффициент модели вместе с данными из July 10 to August 31 из year 2017 для прогнозирования Yr20 July 10 to August 31 Flow данных

library(tidyverse)
library(dplyr)
library(lubridate)
library(tseries)
library(forecast)

set.seed(1500)

DF <- data.frame(Date = seq(as.Date("2010-01-01"), to = as.Date("2018-12-31"), by = "day"),
                            Flow = runif(3287,25,75)) %>% 
  mutate(Year = year(Date), Month = month(Date), Day = day(Date), JDay = yday(Date)) %>% 
  filter(Year %in% c(2011,2012,2015,2017)) %>% 
  filter(between(Month, 7,8))

Yr20 <- data.frame(Date = seq(as.Date("2020-01-01"), to = as.Date("2020-07-09"), by = "day"),
                  Flow = runif(191,20,60))

# acf(DF$Flow)
AA <- auto.arima(DF$Flow) # this will gave me order of the model
fitModel <- arima(DF$Flow, order = c(1,1,1)) # fit the model
#Forecast_flow <- forecast(fitModel, h = 10) # just a rough example using forecast function

1 Ответ

1 голос
/ 10 июля 2020

Вы обнаружите, что для этого гораздо проще использовать пакет fable, чем пакет прогнозов, не в последнюю очередь потому, что он намного лучше обрабатывает ежедневные данные. Вот код, который, как я думаю, делает то, что вы хотите.

library(tidyverse)
library(lubridate)
library(tsibble)
library(fable)

# Generate artificial data and create a tsibble object
set.seed(1500)
DF <- tibble(
    Date = seq(as.Date("2010-01-01"),
               to = as.Date("2020-07-09"),
               by = "day"),
    Flow = runif(length(Date), 25, 75)
  ) %>%
  mutate(
    Year = year(Date),
    Month = month(Date),
  ) %>%
  as_tsibble(index=Date)
DF
#> # A tsibble: 3,843 x 4 [1D]
#>    Date        Flow  Year Month
#>    <date>     <dbl> <dbl> <dbl>
#>  1 2010-01-01  56.2  2010     1
#>  2 2010-01-02  73.6  2010     1
#>  3 2010-01-03  58.0  2010     1
#>  4 2010-01-04  42.1  2010     1
#>  5 2010-01-05  40.5  2010     1
#>  6 2010-01-06  37.9  2010     1
#>  7 2010-01-07  44.8  2010     1
#>  8 2010-01-08  73.1  2010     1
#>  9 2010-01-09  72.5  2010     1
#> 10 2010-01-10  65.7  2010     1
#> # … with 3,833 more rows
# Fit model to July/August from 2011, 2012, 2015, 2017
modelFit <- DF %>% filter(
    Year %in% c(2011, 2012, 2015, 2017),
    between(Month, 7, 8)
  ) %>%
  # Add NAs to fill in the missing observations
  fill_gaps() %>%
  # Estimate non-seasonal ARIMA model
  model(
    ARIMA(Flow ~ PDQ(0,0,0))
  )
modelFit
#> # A mable: 1 x 1
#>   `ARIMA(Flow ~ PDQ(0, 0, 0))`
#>                        <model>
#> 1       <ARIMA(1,0,0) w/ mean>
modelFit %>%
  # Apply to all data up to 9 July 2020 without re-estimating parameters
  refit(new_data = DF) %>%
  # Forecast to end of August 2020
  forecast(
    new_data=tsibble(Date = seq(as.Date("2020-07-10"),
                        to = as.Date("2020-08-31"),
                        by = "day"),
                     index=Date)
  )
#> # A fable: 53 x 4 [1D]
#> # Key:     .model [1]
#>    .model                     Date             Flow .mean
#>    <chr>                      <date>         <dist> <dbl>
#>  1 ARIMA(Flow ~ PDQ(0, 0, 0)) 2020-07-10 N(49, 208)  49.4
#>  2 ARIMA(Flow ~ PDQ(0, 0, 0)) 2020-07-11 N(50, 208)  49.6
#>  3 ARIMA(Flow ~ PDQ(0, 0, 0)) 2020-07-12 N(50, 208)  49.6
#>  4 ARIMA(Flow ~ PDQ(0, 0, 0)) 2020-07-13 N(50, 208)  49.6
#>  5 ARIMA(Flow ~ PDQ(0, 0, 0)) 2020-07-14 N(50, 208)  49.6
#>  6 ARIMA(Flow ~ PDQ(0, 0, 0)) 2020-07-15 N(50, 208)  49.6
#>  7 ARIMA(Flow ~ PDQ(0, 0, 0)) 2020-07-16 N(50, 208)  49.6
#>  8 ARIMA(Flow ~ PDQ(0, 0, 0)) 2020-07-17 N(50, 208)  49.6
#>  9 ARIMA(Flow ~ PDQ(0, 0, 0)) 2020-07-18 N(50, 208)  49.6
#> 10 ARIMA(Flow ~ PDQ(0, 0, 0)) 2020-07-19 N(50, 208)  49.6
#> # … with 43 more rows

Создан 10.07.2020 с помощью пакета REPEX (v0.3.0)

...