Рассмотрим by
для подстановки ваших данных уникальными группировками, чтобы создать список фреймов данных, равный rbind
один раз вне цикла.Ниже назначен обобщенный определяемый пользователем метод, который вводит и выводит поднастроенный фрейм данных и передает его в by
:
# Create actual data frame
Data_act <- subset(Data, Type=="Actual")
# Create empty data frame for forecast results
Data_fc <- subset(Data[1:12,6:9], Type=="Forecast")
# GENERALIZED METHOD
proc_forecast <- function(sub_df) {
# Create time series objects
dftsunits <- ts(sub_df$Units, start = c(2015,1), frequency = 4)
dftsasp <- ts(sub_df$ASP, start = c(2015,1), frequency = 4)
# Train forecasting models (Holt-Winters and ARIMA)
FC_Units_HW <- hw(dftsunits, h=12)
FC_Units_Arima <- auto.arima(dftsunits, lambda = 0)
FC_ASP_HW <- hw(dftsasp, h=12)
FC_ASP_Arima <- auto.arima(dftsasp, lambda = 0)
# Forecast models for 12 quarters and save results to new columns
sub_df <- within(Data_fc, {
Units_HW <- forecast(FC_Units_HW, h=12)$mean
Units_ARIMA <- forecast(FC_Units_Arima, h=12)$mean
ASP_HW <- forecast(FC_ASP_HW, h=12)$mean
ASP_ARIMA <- forecast(FC_ASP_Arima, h=12)$mean
})
return(sub_df)
}
# BY CALL
df_list <- by(Data_act, Data_act$forecast_name, proc_forecast)
# FINAL DF BUILD
final_df <- do.call(rbind, df_list)
final_df <- cbind(subset(Data[1:5], Type=="Forecast"), final_df)
final_df <- rbind(Data_act, final_df)