Ниже нулевых интервалов прогнозирования в R от stlf

Я пытаюсь предсказать количество дополнительных заказов, которые мы можем ожидать в том, что осталось от дня. У меня есть фрейм данных, который находится на уровне минут от начала временного ряда до конца.

Я использую ежедневные, еженедельные и годовые сезонные периоды.

Я хотел бы выяснить, как не использовать отрицательные числа заказов в моих более низких интервалах прогнозирования.

Я пытался установить lambda = 0, но это выдает ошибку:

Ошибка в stl (ts (deseas, частота = msts[i]), s.window = s.window[i],: NA/NaN/Inf при вызове внешней функции (аргумент 1)

Вот сценарий, который я написал:

# Load packages
library(RMySQL)
library(dplyr)
library(lubridate)
library(forecast)

# Load the SQL Driver
mydb = dbConnect(MySQL(max.con = 16, fetch.default.rec = 500),
                 user=,
                 password=,
                 dbname=,
                 host=)

# Find the length of the table
recordCountQuery = dbSendQuery(mydb, "SELECT count(*) FROM orders")
recordCount = fetch(recordCountQuery, n=-1)[1,1]

# Get the last 1M records
rs = dbSendQuery(mydb, paste0("SELECT orders_id, date_purchased, orders_status
    FROM orders
    LIMIT 1000000 
    OFFSET ", recordCount-1000000))

data = fetch(rs, n=-1) %>%
    mutate(date_purchased = ymd_hms(date_purchased)) %>%
    filter(orders_status != 2099,
           orders_status != 2105) 

# Close connections
lapply(dbListConnections(dbDriver(drv = "MySQL")), dbDisconnect)

# Make minute level aggrigation for forecast
ordersByMinute <- data %>%
    select(orders_id, date_purchased) %>%
    mutate(time = round_date(date_purchased, unit = "minute")) %>%
    group_by(time) %>%
    summarize(orderCount = n()) %>%
    ungroup() %>%
    slice(1:n()-1) #drop last row

# Find the min and max times
timeMin <- min(ordersByMinute$time)
timeMax <- max(ordersByMinute$time)

# Create a sequence of times from min to max by minute
minuteFrame <- as.data.frame(list(time = seq(timeMin, timeMax, by="1 min"))) %>%
    merge(ordersByMinute, all = TRUE)

# Set times with no orders to 0 instead of NA
minuteFrame$orderCount[which(is.na(minuteFrame$orderCount))] <- 0

# Create multiple time series
minuteFrame <- minuteFrame %>%
    mutate(mts = msts(orderCount, seasonal.periods = c(60*24, 60*24*7, 60*24*365.25)))

# Calculate how many minutes are left in the day
minutesLeftToday <- 1440 - hour(timeMax)*60 - minute(timeMax)

# Make a forecast for the remaining minutes in the day
fcSTL <- stlf(minuteFrame$mts, h = minutesLeftToday, etsmodel = "ANN")

# Number of orders so far today
ordersSoFarToday <- data %>%
    nrow()

# Mean forecast of additional orders expected
meanFcst <- round(sum(fcSTL$mean),0)
lo80 <- round(sum(fcSTL$lower[,1]),0)
lo95 <- round(sum(fcSTL$lower[,2]),0)
hi80 <- round(sum(fcSTL$upper[,1]),0)
hi95 <- round(sum(fcSTL$upper[,2]),0)

Как я могу сделать интервалы прогнозирования не отрицательными? Сегодня невозможно получить меньше заказов, чем мы уже получили.

0 ответов

Другие вопросы по тегам