如何将多个 forecast::accuracy() 结果的输出组合成 table 以进行比较和绘图
How to combine outputs of multiple forecast::accuracy() results into table for comparison and plotting
我对 4 对时间序列调用了 forecast::accuracy()
,每对的输出都是一个 2x8 精度测量矩阵。
> acc1
ME RMSE MAE MPE MAPE MASE
ACF1 Theil's U
Training set -3.918303e-05 0.5315159 0.3574662 86.62683 164.6431 0.6785569
-0.00042333 NA
Test set 6.959079e-02 0.6452657 0.4388499 61.94763 105.3055 0.8330428
0.45847534 0.9572293
实际上,我想要 ggplot
仅 RMSE 列 的结果,对于 两行 ,对于每个系列。该图可能应该包括每个系列的不同颜色,以及对应于 train/test 行的 2 个点符号。但为此,我需要将此信息放入 整洁的数据框 。
从这 4 个矩阵到整洁的数据框需要执行哪些步骤?我已经加载了 tidyverse
但我也对 base R 持开放态度。
可重现的数据:
library(forecast)
x <- NULL
x$obs <- runif(3652)
x <- as.data.frame(df)
y <- NULL
y$obs <- runif(365)
y <- as.data.frame(df)
x1 <- ts(x$obs, start=c(2007, 10), end=c(2017, 9), frequency = 365)
y1 <- ts(y$obs, start=c(2016, 9), end=c(2017, 9), frequency = 365)
x2 <- ts(x$obs, start=c(2007, 10), end=c(2017, 9), frequency = 365)
y2 <- ts(y$obs, start=c(2016, 9), end=c(2017, 9), frequency = 365)
x3 <- ts(x$obs, start=c(2007, 10), end=c(2017, 9), frequency = 365)
y3 <- ts(y$obs, start=c(2016, 9), end=c(2017, 9), frequency = 365)
x4 <- ts(x$obs, start=c(2007, 10), end=c(2017, 9), frequency = 365)
y4 <- ts(y$obs, start=c(2016, 9), end=c(2017, 9), frequency = 365)
acc1 <- accuracy(x1,y1)
acc2 <- accuracy(x2,y2)
acc3 <- accuracy(x3,y3)
acc4 <- accuracy(x4,y4)
<基础 R 解决方案>
我绘制了训练和测试数据的 RMSE,使用不同的颜色和不同的符号。
acc1 = data.frame(matrix(data =
c(-3.918303e-05, 0.5315159, 0.3574662, 86.62683, 164.6431, 0.6785569, -0.00042333, NA,
6.959079e-02, 0.6452657, 0.4388499, 61.94763, 105.3055, 0.8330428, 0.45847534, 0.9572293), nrow = 2, byrow = TRUE) )
rownames(acc1) = c("Training set", "Test set")
colnames(acc1) = c("ME", "RMSE", "MAE", "MPE", "MAPE", "MASE", "ACF1", "Theil's U")
acc2 = acc1 + 1
acc3 = acc1 + 2
acc4 = acc1 + 3
lsAcc = list(acc1, acc2, acc3, acc4)
dfAcc = do.call(what = rbind, args = lsAcc)
dfAcc$rowPair = ceiling(1:8 * 0.5)
plot(0, cex=0, xlim=c(0,5), ylim=c(0,4))
points(x = dfAcc$rowPair[grepl(pattern = "Training", rownames(dfAcc))],
y = dfAcc$RMSE[ grepl(pattern = "Training", rownames(dfAcc))],
pch = 2, col="blue")
points(x = dfAcc$rowPair[grepl(pattern = "Test", rownames(dfAcc))],
y = dfAcc$RMSE[ grepl(pattern = "Test", rownames(dfAcc))],
pch = 3, col="red")
作为。 Z.Lin问你,你的代码不可复现。您缺少定义对象 x 和 y。
我使用您的部分数据重新创建了一个数据集。
我对 4 对时间序列调用了 forecast::accuracy()
,每对的输出都是一个 2x8 精度测量矩阵。
> acc1
ME RMSE MAE MPE MAPE MASE
ACF1 Theil's U
Training set -3.918303e-05 0.5315159 0.3574662 86.62683 164.6431 0.6785569
-0.00042333 NA
Test set 6.959079e-02 0.6452657 0.4388499 61.94763 105.3055 0.8330428
0.45847534 0.9572293
实际上,我想要 ggplot
仅 RMSE 列 的结果,对于 两行 ,对于每个系列。该图可能应该包括每个系列的不同颜色,以及对应于 train/test 行的 2 个点符号。但为此,我需要将此信息放入 整洁的数据框 。
从这 4 个矩阵到整洁的数据框需要执行哪些步骤?我已经加载了 tidyverse
但我也对 base R 持开放态度。
可重现的数据:
library(forecast)
x <- NULL
x$obs <- runif(3652)
x <- as.data.frame(df)
y <- NULL
y$obs <- runif(365)
y <- as.data.frame(df)
x1 <- ts(x$obs, start=c(2007, 10), end=c(2017, 9), frequency = 365)
y1 <- ts(y$obs, start=c(2016, 9), end=c(2017, 9), frequency = 365)
x2 <- ts(x$obs, start=c(2007, 10), end=c(2017, 9), frequency = 365)
y2 <- ts(y$obs, start=c(2016, 9), end=c(2017, 9), frequency = 365)
x3 <- ts(x$obs, start=c(2007, 10), end=c(2017, 9), frequency = 365)
y3 <- ts(y$obs, start=c(2016, 9), end=c(2017, 9), frequency = 365)
x4 <- ts(x$obs, start=c(2007, 10), end=c(2017, 9), frequency = 365)
y4 <- ts(y$obs, start=c(2016, 9), end=c(2017, 9), frequency = 365)
acc1 <- accuracy(x1,y1)
acc2 <- accuracy(x2,y2)
acc3 <- accuracy(x3,y3)
acc4 <- accuracy(x4,y4)
<基础 R 解决方案>
我绘制了训练和测试数据的 RMSE,使用不同的颜色和不同的符号。
acc1 = data.frame(matrix(data =
c(-3.918303e-05, 0.5315159, 0.3574662, 86.62683, 164.6431, 0.6785569, -0.00042333, NA,
6.959079e-02, 0.6452657, 0.4388499, 61.94763, 105.3055, 0.8330428, 0.45847534, 0.9572293), nrow = 2, byrow = TRUE) )
rownames(acc1) = c("Training set", "Test set")
colnames(acc1) = c("ME", "RMSE", "MAE", "MPE", "MAPE", "MASE", "ACF1", "Theil's U")
acc2 = acc1 + 1
acc3 = acc1 + 2
acc4 = acc1 + 3
lsAcc = list(acc1, acc2, acc3, acc4)
dfAcc = do.call(what = rbind, args = lsAcc)
dfAcc$rowPair = ceiling(1:8 * 0.5)
plot(0, cex=0, xlim=c(0,5), ylim=c(0,4))
points(x = dfAcc$rowPair[grepl(pattern = "Training", rownames(dfAcc))],
y = dfAcc$RMSE[ grepl(pattern = "Training", rownames(dfAcc))],
pch = 2, col="blue")
points(x = dfAcc$rowPair[grepl(pattern = "Test", rownames(dfAcc))],
y = dfAcc$RMSE[ grepl(pattern = "Test", rownames(dfAcc))],
pch = 3, col="red")
作为。 Z.Lin问你,你的代码不可复现。您缺少定义对象 x 和 y。 我使用您的部分数据重新创建了一个数据集。