我被指派解决一个涉及预测百分比的问题。我面临的主要问题是数据不足。我只有2.5年的数据(按周记录),需要预测今年剩余时间的百分比。
我所拥有的数据看起来类似于下面的示例:
week year date percentage1 1 2019 2019-03-31 0.10682 2 2019 2019-04-07 0.09543 3 2019 2019-04-14 0.08454 4 2019 2019-04-21 0.07135 5 2019 2019-04-28 0.07626 6 2019 2019-05-05 0.0671
这些百分比确实表现出一定的季节性特征,但通过一些探索性数据分析(EDA),还不足以将其归类为完全的季节性数据集。
我最初尝试使用LSTM/Keras序列模型,但未能成功。
我对任何可能适用于这种类型数据的方法都不熟悉,因此如果有人对如何最好地处理这项任务有任何想法,将不胜感激。
回答:
你可以从fable
包及其环境开始。请注意,这只是一个示例,并且请记住,使用你提供的样本数据,结果可能不具有参考价值。
library(fable)library(tsibble) # 转换为日期df$date <- as.Date(df$date, "%Y-%m-%d")# 转换为tsibble,这是一种对tsibble环境非常有用的数据框类型,它# 也非常有助于你有多个时间序列需要预测的情况df <- tsibble(df, index = date)# 将数据分为训练集和测试集:这将帮助你确定哪个模型适合预测,预测你已经知道的数据。train <- df[df$date < as.Date('2019-04-21',"%Y-%m-%d"),]test <- df[df$date >= as.Date('2019-04-21',"%Y-%m-%d"),]# 在这里进行预测,如果你的R不支持|>,请用%>%替代# (可能需要library(magrittr))training <- train |> # 定义模型,你可以添加多个模型 model(arima = ARIMA(percentage), croston = CROSTON(percentage))training # A mable: 1 x 2 arima croston <model> <model>1 <ARIMA(0,2,0)> <croston>forecasting <- training |> # 预测未来3个时间点 forecast(h = 3)# 在这里查看你的结果(由于这些数据,结果可能不太有用)autoplot(forecasting) + autolayer(train)# 以及一些准确性指标accuracy(forecasting, test) # A tibble: 2 x 10 .model .type ME RMSE MAE MPE MAPE MASE RMSSE ACF1 <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>1 arima Test 0.00883 0.0119 0.0104 12.4 14.6 NaN NaN -0.1162 croston Test -0.0184 0.0188 0.0184 -26.1 26.1 NaN NaN -0.525
显然,你将为每个时间序列选择最佳模型(在这种情况下,是一个时间序列),并将其用于预测你需要的内容。
在这个简单的案例中,ARIMA(0,2,0)似乎是最好的选择,所以你可以做类似的事情,但你可以在指南中找到更好的预测方法:
df |> model(arima_0_2_0 = ARIMA(percentage ~ 0 + pdq(0,2,0))) |> forecast(h = 10)
一些模型允许你添加回归变量,因此如果需要,你可以尝试对“奇怪”的时期(如COVID封锁、节假日等)进行建模。
使用数据:
df <- read.table(text = 'week year date percentage1 1 2019 2019-03-31 0.10682 2 2019 2019-04-07 0.09543 3 2019 2019-04-14 0.08454 4 2019 2019-04-21 0.07135 5 2019 2019-04-28 0.07626 6 2019 2019-05-05 0.0671', header = T)