Функция do в dplyr позволяет вам делать много классных моделей быстро и легко, но я стараюсь использовать эти модели для хороших прогнозов прокатки.
# Data illustration
require(dplyr)
require(forecast)
df <- data.frame(
Date = seq.POSIXt(from = as.POSIXct("2015-01-01 00:00:00"),
to = as.POSIXct("2015-06-30 00:00:00"), by = "hour"))
df <- df %>% mutate(Hour = as.numeric(format(Date, "%H")) + 1,
Wind = runif(4320, min = 1, max = 5000),
Temp = runif(4320, min = - 20, max = 25),
Price = runif(4320, min = -15, max = 45)
)
Моя переменная-фактор Hour
, мои экзогенные переменные Wind
и temp
, и то, что я хочу прогнозировать, Price
. Итак, в основном, у меня есть 24 модели, с которыми мне хотелось бы иметь возможность делать скользящие прогнозы.
Теперь мой фрейм данных содержит 180 дней. Я хотел бы вернуться на 100 дней и сделать прогноз на 1 день, а затем сравнить его с фактическим Price
.
Выполнение этой грубой силы будет выглядеть примерно так:
# First I fit the data frame to be exactly the right length
# 100 days to start with (2015-03-21 or so), then 99, then 98.., etc.
n <- 100 * 24
# Make the price <- NA so I can replace it with a forecast
df$Price[(nrow(df) - n): (nrow(df) - n + 24)] <- NA
# Now I make df just 81 days long, the estimation period + the first forecast
df <- df[1 : (nrow(df) - n + 24), ]
# The actual do & fit, later termed fx(df)
result <- df %>% group_by(Hour) %>% do ({
historical <- .[!is.na(.$Price), ]
forecasted <- .[is.na(.$Price), c("Date", "Hour", "Wind", "Temp")]
fit <- Arima(historical$Price, xreg = historical[, 3:4], order = c(1, 1, 0))
data.frame(forecasted[],
Price = forecast.Arima(fit, xreg = forecasted[3:4])$mean )
})
result
Теперь я бы изменил n
на 99 * 24. Но было бы здорово иметь это в цикле или применять, но я просто не могу понять, как это сделать, а также сохранить каждый новый прогноз.
Я пробовал такой цикл, но еще не получилось:
# 100 days ago, forecast that day, then the next, etc.
for (n in 1:100) {
nx <- n * 24 * 80 # Because I want to start after 80 days
df[nx:(nx + 23), 5] <- NA # Set prices to NA so I can forecast them
fx(df) # do the function
df.results[n] <- # Write the results into a vector / data frame to save them
# and now rinse and repeat for n + 1
}
Поистине удивительные бонусные очки для broom
-подобного решения:)