在 R 中将预测结果组合成一个内聚的数据框架
Combining Forecasts Results into a Cohesive Data Frame in R
循环计算并存储 auto.arima()
和 forecast()
结果到 Dataframe
我的带有随机数据的数据帧的小样本可以使用以下方法生成
df <- data.frame(col1 = runif(24, 400, 700),
col2 = runif(24, 350, 600),
col3 = runif(24, 600, 940),
col4 = runif(24, 2000, 2600),
col5 = runif(24, 950, 1200))
colnames(df) <- c("NorthHampton to EastHartford", "NorthHampton to Edison",
"NorthHampton to Yonkers", "North Hampton to Brooklyn", "NorthHampton to Rotterdam" )
我正在尝试 运行 在 R 中使用 auto.arima()
的一系列 ARIMA
模型,但在生成所需格式的输出时遇到困难。下面是我开始的示例部分。
ts <- ts(df, frequency = 12, start = c(2014, 1), end = c(2015, 12))
model <- list()
results <- list()
for (i in 1:ncol(ts)) {
fit <- auto.arima(ts[,i], stepwise = F, approximation = F)
model <- forecast(fit)$method
results <- forecast(fit, h = 3)$mean
# print(forecast(fit)$method)
# print(forecast(fit, h=3)$mean)
}
理想情况下,我希望我的循环填充一个 data.frame
,其格式如下:
Lane Model Time PointEstimate
Northampton to East Hartford "ARIMA(0,0,0) with non-zero mean" Jan-16
Northampton to East Hartford "ARIMA(0,0,0) with non-zero mean" Feb-16
Northampton to East Hartford "ARIMA(0,0,0) with non-zero mean" Mar-16
Northampton to Edison "ARIMA(0,0,0) with non-zero mean" Jan-16
Northampton to Edison "ARIMA(0,0,0) with non-zero mean" Feb-16
Northampton to Edison "ARIMA(0,0,0) with non-zero mean" Mar-16
Northampton to Yonkers "ARIMA(0,0,0) with non-zero mean" Jan-16
第 Lane
列的结果应与原始数据框中的列名相同。 Model
的结果是 forecast(fit)$method
的结果,点估计应该是 forecast(fit, h = 3)$mean
的结果,其中每个项目在 dataframe
h times
中重复] (3) 在这种情况下。
我认为我的循环正在执行我需要的计算我只是不知道如何存储结果,然后将结果附加到循环末尾的下一次迭代。我很感激我能得到的任何帮助。
您可以尝试类似的操作:
library(forecast)
fits <- lapply(1:ncol(ts), function(i) auto.arima(ts[,i], stepwise = F, approximation = F))
models <- sapply(1:ncol(ts), function(i) forecast(fits[[i]])$method)
results <- lapply(1:ncol(ts), function(i) forecast(fits[[i]], h = 3)$mean)
resultsdf <- data.frame(do.call(rbind, results))
colnames(resultsdf) <- format(as.Date(time(results[[1]])), "%b-%y")
resultsdf$Lane=colnames(df)
resultsdf$Model=models
library(reshape2)
res <- melt(resultsdf, id.vars=4:5, measure.vars=1:3, variable;name = "Time",value;name = "PointEstimate")
Lane Model variable value
1 NorthHampton to EastHartford ARIMA(0,0,0) with non-zero mean janv.-16 546.9441
2 NorthHampton to Edison ARIMA(0,0,0) with non-zero mean janv.-16 487.6225
3 NorthHampton to Yonkers ARIMA(0,0,0) with non-zero mean janv.-16 778.9514
4 North Hampton to Brooklyn ARIMA(1,0,0) with non-zero mean janv.-16 2459.3983
5 NorthHampton to Rotterdam ARIMA(1,0,0) with non-zero mean janv.-16 1098.1912
6 NorthHampton to EastHartford ARIMA(0,0,0) with non-zero mean févr.-16 546.9441
7 NorthHampton to Edison ARIMA(0,0,0) with non-zero mean févr.-16 487.6225
8 NorthHampton to Yonkers ARIMA(0,0,0) with non-zero mean févr.-16 778.9514
9 North Hampton to Brooklyn ARIMA(1,0,0) with non-zero mean févr.-16 2416.4848
10 NorthHampton to Rotterdam ARIMA(1,0,0) with non-zero mean févr.-16 1077.3921
11 NorthHampton to EastHartford ARIMA(0,0,0) with non-zero mean mars-16 546.9441
12 NorthHampton to Edison ARIMA(0,0,0) with non-zero mean mars-16 487.6225
13 NorthHampton to Yonkers ARIMA(0,0,0) with non-zero mean mars-16 778.9514
14 North Hampton to Brooklyn ARIMA(1,0,0) with non-zero mean mars-16 2397.1000
15 NorthHampton to Rotterdam ARIMA(1,0,0) with non-zero mean mars-16 1085.3332
了解如何将您使用的项目 data.frames
和 str
放在一起。这是一个相对简单的练习。
library(forecast)
library(data.table)
combine_ts <- function(df, h=3, frequency= 12, start= c(2014,1), end=c(2015,12)) {
results <- list()
ts <- ts(df, frequency = frequency, start = start, end = end)
for (i in 1:ncol(ts)) {
fit <- auto.arima(ts[,i], stepwise = F, approximation = F)
results[[i]] <- data.frame(Lane= rep(colnames(ts)[i], h),
Model= rep(forecast(fit)$method, h),
Date= format(as.Date(time(forecast(fit, h)$mean)), "%b-%y"),
PointEstimate= forecast(fit, h=h)$mean)
}
return(data.table::rbindlist(results))
}
R> combine_ts(df)
Lane Model Date PointEstimate
1: NorthHampton to EastHartford ARIMA(0,0,0) with non-zero mean Jan-16 536.1760
2: NorthHampton to EastHartford ARIMA(0,0,0) with non-zero mean Feb-16 536.1760
3: NorthHampton to EastHartford ARIMA(0,0,0) with non-zero mean Mar-16 536.1760
4: NorthHampton to Edison ARIMA(1,0,0) with non-zero mean Jan-16 488.9687
5: NorthHampton to Edison ARIMA(1,0,0) with non-zero mean Feb-16 498.8986
6: NorthHampton to Edison ARIMA(1,0,0) with non-zero mean Mar-16 502.4015
7: NorthHampton to Yonkers ARIMA(0,0,0) with non-zero mean Jan-16 764.8654
8: NorthHampton to Yonkers ARIMA(0,0,0) with non-zero mean Feb-16 764.8654
9: NorthHampton to Yonkers ARIMA(0,0,0) with non-zero mean Mar-16 764.8654
10: North Hampton to Brooklyn ARIMA(0,0,0) with non-zero mean Jan-16 2304.5727
11: North Hampton to Brooklyn ARIMA(0,0,0) with non-zero mean Feb-16 2304.5727
12: North Hampton to Brooklyn ARIMA(0,0,0) with non-zero mean Mar-16 2304.5727
13: NorthHampton to Rotterdam ARIMA(0,0,0) with non-zero mean Jan-16 1094.5927
14: NorthHampton to Rotterdam ARIMA(0,0,0) with non-zero mean Feb-16 1094.5927
15: NorthHampton to Rotterdam ARIMA(0,0,0) with non-zero mean Mar-16 1094.5927
循环计算并存储 auto.arima()
和 forecast()
结果到 Dataframe
我的带有随机数据的数据帧的小样本可以使用以下方法生成
df <- data.frame(col1 = runif(24, 400, 700),
col2 = runif(24, 350, 600),
col3 = runif(24, 600, 940),
col4 = runif(24, 2000, 2600),
col5 = runif(24, 950, 1200))
colnames(df) <- c("NorthHampton to EastHartford", "NorthHampton to Edison",
"NorthHampton to Yonkers", "North Hampton to Brooklyn", "NorthHampton to Rotterdam" )
我正在尝试 运行 在 R 中使用 auto.arima()
的一系列 ARIMA
模型,但在生成所需格式的输出时遇到困难。下面是我开始的示例部分。
ts <- ts(df, frequency = 12, start = c(2014, 1), end = c(2015, 12))
model <- list()
results <- list()
for (i in 1:ncol(ts)) {
fit <- auto.arima(ts[,i], stepwise = F, approximation = F)
model <- forecast(fit)$method
results <- forecast(fit, h = 3)$mean
# print(forecast(fit)$method)
# print(forecast(fit, h=3)$mean)
}
理想情况下,我希望我的循环填充一个 data.frame
,其格式如下:
Lane Model Time PointEstimate
Northampton to East Hartford "ARIMA(0,0,0) with non-zero mean" Jan-16
Northampton to East Hartford "ARIMA(0,0,0) with non-zero mean" Feb-16
Northampton to East Hartford "ARIMA(0,0,0) with non-zero mean" Mar-16
Northampton to Edison "ARIMA(0,0,0) with non-zero mean" Jan-16
Northampton to Edison "ARIMA(0,0,0) with non-zero mean" Feb-16
Northampton to Edison "ARIMA(0,0,0) with non-zero mean" Mar-16
Northampton to Yonkers "ARIMA(0,0,0) with non-zero mean" Jan-16
第 Lane
列的结果应与原始数据框中的列名相同。 Model
的结果是 forecast(fit)$method
的结果,点估计应该是 forecast(fit, h = 3)$mean
的结果,其中每个项目在 dataframe
h times
中重复] (3) 在这种情况下。
我认为我的循环正在执行我需要的计算我只是不知道如何存储结果,然后将结果附加到循环末尾的下一次迭代。我很感激我能得到的任何帮助。
您可以尝试类似的操作:
library(forecast)
fits <- lapply(1:ncol(ts), function(i) auto.arima(ts[,i], stepwise = F, approximation = F))
models <- sapply(1:ncol(ts), function(i) forecast(fits[[i]])$method)
results <- lapply(1:ncol(ts), function(i) forecast(fits[[i]], h = 3)$mean)
resultsdf <- data.frame(do.call(rbind, results))
colnames(resultsdf) <- format(as.Date(time(results[[1]])), "%b-%y")
resultsdf$Lane=colnames(df)
resultsdf$Model=models
library(reshape2)
res <- melt(resultsdf, id.vars=4:5, measure.vars=1:3, variable;name = "Time",value;name = "PointEstimate")
Lane Model variable value
1 NorthHampton to EastHartford ARIMA(0,0,0) with non-zero mean janv.-16 546.9441
2 NorthHampton to Edison ARIMA(0,0,0) with non-zero mean janv.-16 487.6225
3 NorthHampton to Yonkers ARIMA(0,0,0) with non-zero mean janv.-16 778.9514
4 North Hampton to Brooklyn ARIMA(1,0,0) with non-zero mean janv.-16 2459.3983
5 NorthHampton to Rotterdam ARIMA(1,0,0) with non-zero mean janv.-16 1098.1912
6 NorthHampton to EastHartford ARIMA(0,0,0) with non-zero mean févr.-16 546.9441
7 NorthHampton to Edison ARIMA(0,0,0) with non-zero mean févr.-16 487.6225
8 NorthHampton to Yonkers ARIMA(0,0,0) with non-zero mean févr.-16 778.9514
9 North Hampton to Brooklyn ARIMA(1,0,0) with non-zero mean févr.-16 2416.4848
10 NorthHampton to Rotterdam ARIMA(1,0,0) with non-zero mean févr.-16 1077.3921
11 NorthHampton to EastHartford ARIMA(0,0,0) with non-zero mean mars-16 546.9441
12 NorthHampton to Edison ARIMA(0,0,0) with non-zero mean mars-16 487.6225
13 NorthHampton to Yonkers ARIMA(0,0,0) with non-zero mean mars-16 778.9514
14 North Hampton to Brooklyn ARIMA(1,0,0) with non-zero mean mars-16 2397.1000
15 NorthHampton to Rotterdam ARIMA(1,0,0) with non-zero mean mars-16 1085.3332
了解如何将您使用的项目 data.frames
和 str
放在一起。这是一个相对简单的练习。
library(forecast)
library(data.table)
combine_ts <- function(df, h=3, frequency= 12, start= c(2014,1), end=c(2015,12)) {
results <- list()
ts <- ts(df, frequency = frequency, start = start, end = end)
for (i in 1:ncol(ts)) {
fit <- auto.arima(ts[,i], stepwise = F, approximation = F)
results[[i]] <- data.frame(Lane= rep(colnames(ts)[i], h),
Model= rep(forecast(fit)$method, h),
Date= format(as.Date(time(forecast(fit, h)$mean)), "%b-%y"),
PointEstimate= forecast(fit, h=h)$mean)
}
return(data.table::rbindlist(results))
}
R> combine_ts(df)
Lane Model Date PointEstimate
1: NorthHampton to EastHartford ARIMA(0,0,0) with non-zero mean Jan-16 536.1760
2: NorthHampton to EastHartford ARIMA(0,0,0) with non-zero mean Feb-16 536.1760
3: NorthHampton to EastHartford ARIMA(0,0,0) with non-zero mean Mar-16 536.1760
4: NorthHampton to Edison ARIMA(1,0,0) with non-zero mean Jan-16 488.9687
5: NorthHampton to Edison ARIMA(1,0,0) with non-zero mean Feb-16 498.8986
6: NorthHampton to Edison ARIMA(1,0,0) with non-zero mean Mar-16 502.4015
7: NorthHampton to Yonkers ARIMA(0,0,0) with non-zero mean Jan-16 764.8654
8: NorthHampton to Yonkers ARIMA(0,0,0) with non-zero mean Feb-16 764.8654
9: NorthHampton to Yonkers ARIMA(0,0,0) with non-zero mean Mar-16 764.8654
10: North Hampton to Brooklyn ARIMA(0,0,0) with non-zero mean Jan-16 2304.5727
11: North Hampton to Brooklyn ARIMA(0,0,0) with non-zero mean Feb-16 2304.5727
12: North Hampton to Brooklyn ARIMA(0,0,0) with non-zero mean Mar-16 2304.5727
13: NorthHampton to Rotterdam ARIMA(0,0,0) with non-zero mean Jan-16 1094.5927
14: NorthHampton to Rotterdam ARIMA(0,0,0) with non-zero mean Feb-16 1094.5927
15: NorthHampton to Rotterdam ARIMA(0,0,0) with non-zero mean Mar-16 1094.5927