0

我已经使用寓言进行预测,并在尝试获得预测输出的准确性时 - 我收到错误消息,因为 UseMethod("key_vars") 中的错误:没有适用于“key_vars”的方法应用于类“data.frame”的对象"

输出预测对象的类是“fbl_ts”“tbl_ts”“tbl_df”“tbl”“data.frame”

我使用了预测包中的 accuracy() 函数。

library(dplyr)
library(tsibble)
library(fpp3)
library(tidyverse)
library(ISOweek)

Original.df <- structure(list(YearWeek = c("201901", "201902", "201903", "201904", 
"201905", "201906", "201907", "201908", "201909", "201910", "201911", 
"201912", "201913", "201914", "201915", "201916", "201917", "201918", 
"201919", "201920", "201921", "201922", "201923", "201924", "201925", 
"201926", "201927", "201928", "201929", "201930", "201931", "201932", 
"201933", "201934", "201935", "201936", "201937", "201938", "201939", 
"201940", "201941", "201942", "201943", "201944", "201945", "201946", 
"201947", "201948", "201949", "201950", "201951", "201952", "202001", 
"202002", "202003", "202004", "202005", "202006", "202007", "202008", 
"202009", "202010", "202011", "202012", "202013", "202014", "202015", 
"202016", "202017", "202018", "202019", "202020", "202021", "202022", 
"202023", "202024", "202025", "202026", "202027", "202028", "202029", 
"202030", "202031", "202032", "202033", "202034", "202035", "202036", 
"202037", "202038", "202039", "202040", "202041", "202042", "202043", 
"202044", "202045", "202046", "202047", "202048", "202049", "202050", 
"202051", "202052", "202053", "202101", "202102", "202103", "202104", 
"202105", "202106", "202107", "202108", "202109", "202110", "202111", 
"202112", "202113", "202114", "202115", "202116", "202117", "202118", 
"202119", "202120", "202121", "202122", "202123", "202124", "202125", 
"202126", "202127", "202128", "202129", "202130", "202131", "202132", 
"202133", "202134", "202135", "202136", "202137", "202138", "202139", 
"202140", "202141", "202142", "202143", "202144", "202145", "202146", 
"202147"), Shipment = c(399, 1336, 1018, 1126, 1098, 1235, 1130, 
1258, 897, 1333, 1221, 1294, 1628, 1611, 1484, 1238, 1645, 1936, 
1664, 1482, 2060, 1964, 1875, 1645, 2039, 1640, 733, 1764, 1639, 
1968, 1692, 1677, 1542, 1299, 1328, 1130, 1741, 1929, 1843, 1427, 
1467, 1450, 1041, 1238, 1721, 1757, 1813, 1001, 1208, 1916, 1435, 
540, 681, 1436, 1170, 938, 1206, 1648, 1169, 1311, 1772, 1333, 
1534, 1365, 1124, 846, 732, 753, 1266, 1652, 1772, 1814, 1649, 
1191, 1298, 986, 1296, 1066, 777, 1041, 1388, 1289, 1097, 1356, 
1238, 1732, 1109, 1104, 1155, 1334, 1094, 770, 1411, 1304, 1269, 
1093, 1096, 1121, 943, 695, 1792, 2033, 1586, 768, 685, 993, 
1406, 1246, 1746, 1740, 938, 160, 1641, 1373, 1023, 1173, 1611, 
928, 1038, 1009, 1274, 1369, 1231, 1053, 1163, 880, 870, 1131, 
882, 1143, 632, 394, 510, 543, 535, 824, 874, 591, 512, 448, 
247, 452, 470, 747, 545, 639, 326, 414, 590, 675, 438, 272), 
    Production = c(794, 1400, 1505, 1055, 1396, 1331, 1461, 1623, 
    1513, 1667, 1737, 1264, 1722, 1587, 2094, 1363, 2007, 1899, 
    1749, 1693, 1748, 1455, 2078, 1702, 1736, 1885, 860, 1372, 
    1716, 1290, 1347, 1451, 1347, 1409, 1203, 1235, 1397, 1557, 
    1406, 1451, 1704, 670, 1442, 1336, 1611, 1401, 1749, 744, 
    1558, 1665, 1317, 0, 441, 1351, 1392, 1180, 1447, 1265, 1485, 
    1494, 1543, 1581, 1575, 1597, 1191, 1386, 889, 1002, 1573, 
    1380, 1346, 1243, 1009, 965, 1051, 905, 1094, 1194, 891, 
    1033, 921, 880, 1135, 1058, 1171, 1022, 956, 880, 902, 983, 
    1014, 945, 1021, 1058, 1191, 1139, 1292, 573, 1173, 514, 
    1292, 1310, 1239, 0, 0, 1182, 1028, 1028, 1196, 1214, 1045, 
    256, 1451, 1344, 1352, 1257, 1444, 786, 1369, 1185, 1262, 
    1025, 949, 1051, 941, 727, 911, 951, 987, 1136, 884, 770, 
    959, 1102, 1109, 1098, 988, 983, 1002, 904, 1147, 1149, 919, 
    1058, 1112, 479, 1028, 1154, 1126, 1155, 1208, 536)), row.names = c(NA, 
152L), class = "data.frame")
# Converting the df to accomodate leap year for weekly observations
Original.df <- Original.df %>%
  mutate(
    isoweek =stringr::str_replace(YearWeek, "^(\\d{4})(\\d{2})$", "\\1-W\\2-1"),
    date = ISOweek::ISOweek2date(isoweek)
  )
# creating test and train data
Original.train.df <- Original.df %>%
  filter(date >= "2018-12-31", date <= "2021-10-25")
Original.test.df <- Original.df %>%
  filter(date >= "2021-11-01", date <= "2021-11-22")

# splitting the original train data to contain only Week, Dependent and Independent variables

Total.train.df<-Original.train.df %>%
  mutate(Week.1 = yearweek(ISOweek::ISOweek(date))) %>%
  select(-YearWeek,-date,-isoweek) %>%
  as_tsibble(index = Week.1)

Shipment.Test.df<- Original.test.df %>%
  select(-YearWeek, -Production, -date,-isoweek)

#Model.1-Fitting forecast model(Arima with Fourier terms) to Production.qty 

bestfit.Prod.1.AICc <- Inf

for(K in seq(25)){
  fit.Prod.1 <- Total.train.df %>% 
    model(ARIMA(Production ~ fourier(K = K),stepwise = FALSE, approximation = FALSE))
  
  if(purrr::pluck(glance(fit.Prod.1), "AICc") < bestfit.Prod.1.AICc)
  {
    bestfit.Prod.1.AICc <- purrr::pluck(glance(fit.Prod.1), "AICc")
    bestfit.Prod.1<- fit.Prod.1
    bestK.Prod.1 <- K
  }
}

bestK.Prod.1
glance(bestfit.Prod.1)

#Extracting fitted values of Production qty-Model.1
Fitted.Prod.1<-fitted(bestfit.Prod.1)
Fitted.Prod.1<-as_tibble(Fitted.Prod.1) %>% select(.fitted)
Fitted.Prod.1

#Model.1-Forecasting Net.Production.Qty for 30 steps using the fitted model above
Forecast.Prod.1<-bestfit.Prod.1 %>% 
  forecast(h = 4)

Final.Prod.1<-Forecast.Prod.1$.mean

Final.Prod.1

#Model.1-Fitting forecast model(Arima with Fourier terms) to Shipment Qty

bestfit.Shipment.1.AICc <- Inf

for(K in seq(25)){
  fit.Shipment.1 <- Total.train.df %>% 
    model(ARIMA(Shipment ~Production + fourier(K = K),stepwise = FALSE, approximation = FALSE))
  
  if(purrr::pluck(glance(fit.Shipment.1), "AICc") < bestfit.Shipment.1.AICc)
  {
    bestfit.Shipment.1.AICc <- purrr::pluck(glance(fit.Shipment.1), "AICc")
    bestfit.Shipment.1<- fit.Shipment.1
    bestK.Shipment.1 <- K
  }
}

bestK.Shipment.1
glance(bestfit.Shipment.1)

#Extracting fitted values of Shipment Qty-Model.1
Fitted.Shipment.1<-fitted(bestfit.Shipment.1)
Fitted.Shipment.1<-as_tibble(Fitted.Shipment.1) %>% select(.fitted)
Fitted.Shipment.1

#Model.1-Forecasting Shipment Qty using Forecasted Production.Qty and Fourier terms of
#Shipment variable as regressors

Shipment.future.1<- new_data(Total.train.df,4) %>%
  mutate(Production= Final.Prod.1)

Forecast.Shipment.1 <- bestfit.Shipment.1 %>%
  forecast(Shipment.future.1)

class(Forecast.Shipment.1)

Final.Shipment.1<-Forecast.Shipment.1[".mean"]

accuracy.1<-accuracy(Forecast.Shipment.1,Shipment.Test.df)

我在代码的最后一步收到上述错误。谁能告诉我我在这里做错了什么

谢谢你的指导

4

0 回答 0