如何在 R 中通过一个脚本多次预测一个变量?

How can I Forecast One Variable Multiple Times by One Script in R?

假设您有一个如下所示的数据集:

|Month|Food|Sales|
|01|Apple|1564|
|02|Apple|1323|
....
|12|Apple|1645|
|01|Banana|2158|

...一直延续到 "Zucchini".

的模式

假设您希望这样预测 R 中的销售额:

ets <- forecast(ets(data))

我如何预测 "Food" 列中的每个值,使我能够分别获得它们的所有预测?

目前,我正在将我的数据设置为仅查看 "Apple" 并进行预测。然后,我必须回去将我的子设置数据更改为 "Banana" 并进行预测。我想将它们的每个输出分开,以便我可以将它们导出到 Excel.

谢谢!

您可以编写一个自定义函数来获取水果的名称并执行预测所需的所有步骤,然后 apply 该函数会生成您知道的所有水果的列表。我这里有一个代码示例,但请注意,您可能需要根据您的具体情况更改很多内容。

首先,一些数据:

df <- data.frame(
  month = rep(1:12, times = 5),
  fruit = rep(c("Apple", "Banana", "Citrus", "Date", "Elderberry"), each = 12),
  sales = runif(12*5, min = 100, max = 10000)
)

接下来,我想创建一个自定义函数。在这种情况下,我唯一的论据是水果的类型。我可能想添加更多参数,例如 "how long do I want my forecast to be" 等。请注意,此函数 returns 整个 forecast 对象 - 您可能想要 select,例如 fitted部分模型。

forecast_custom <- function(selected_fruit) {
  df_sub <- subset(df, fruit == selected_fruit)
  ts_sub <- ts(df_sub$sales)

  forecast(ets(ts_sub))
}

我可以 运行 这个函数,告诉它预测哪个水果:

forecast_custom("Apple")

我还可以使用 apply 家族的东西一次性 运行 所有类型的水果。

lapply(unique(df$fruit), forecast_custom)

如果需要,您还可以使用 purrr 包中的 map 函数来代替 lapplysapplymap 函数对于输入和输出的内容更加严格。例如,使用 purrr:

生成漂亮的数据框会更容易
forecast_custom <- function(selected_fruit) {
  df_sub <- subset(df, fruit == selected_fruit)
  ts_sub <- ts(df_sub$sales)

  data.frame(
    fruit = selected_fruit,
    month = 13:24,
    forecasted_sales = as.numeric(forecast(ets(ts_sub))$fitted)
  )
}

> map_df(unique(df$fruit), forecast_custom)
#>         fruit month forecasted_sales
#> 1       Apple    13        4781.3679
#> 2       Apple    14        4781.3330
#> 3       Apple    15        4780.8736
#> 4       Apple    16        4781.2790
#> 5       Apple    17        4781.3523

您可以使用 apply functions in R and the levels 函数创建多个预测,该函数可以找到水果类型的唯一值。

然后创建一个 "forecast function",它根据水果类型 [Fruit] 对输入数据帧 [DF] 进行切片,如下面的代码所示,以预测特定的输入水果。函数returns一个ets预测对象。

library(forecast)
DF <- data.frame(month = rep(seq(1,12,by=1),3),
                 fruit = c(rep("apples",12),rep("banana",12),rep("orange",12)),
                 Sales = sample(0:1000, 12*3))


forecastFruit <- function(Fruit, inputDF)
{
  timeSeries <- ts(inputDF[inputDF$fruit == Fruit,]$Sales)
  forecast(ets(timeSeries))
}

Forecast <- lapply(levels(DF$fruit), forecastFruit, inputDF = DF)


plot(Forecast[[1]])
plot(Forecast[[2]])
plot(Forecast[[3]])

lapply 的输出将由预测等中的三个对象组成。