r - R:如何在单个图中显示预测和实际数据?
问题描述
我有一些 2000-Q1 到 2010-Q4 的时间序列数据。我使用了 2000 年第一季度到 2008 年第二季度的数据,使用 HoltWinters 预测了未来 10 个季度
CPI.HI.fit <- HoltWinters(CPI.HI.pre, gamma=FALSE)
CPI.HI.cfr <- forecast(CPI.HI.fit, 10)
这是数据——
CPI.HI.pre
(该课程的先前时间序列ts
)CPI.HI.pos
(类的后验时间序列ts
)CPI.HI.cfr
(forecast
班级危机预测)
> CPI.HI.pre
# Qtr1 Qtr2 Qtr3 Qtr4
# 2000 83.12262 83.72945 84.10338 84.58881
# 2001 85.03111 85.92120 85.86388 85.74424
# 2002 86.01310 86.89452 87.05565 87.31702
# 2003 87.93231 88.23959 88.43708 88.56572
# 2004 89.02891 90.05139 90.17285 90.68677
# 2005 90.82155 91.74464 92.18774 92.57043
# 2006 92.91782 94.15888 94.58178 94.13807
# 2007 94.58282 95.99794 96.12194 97.08308
# 2008 97.72470 99.54615
> CPI.HI.pos
# Qtr1 Qtr2 Qtr3 Qtr4
# 2008 100.39960 99.11151
# 2009 98.79588 99.36900 99.75832 99.90321
# 2010 100.17990 100.96250 100.99250 101.40690
> CPI.HI.cfr
# Point Forecast Lo 80 Hi 80 Lo 95 Hi 95
# 2008 Q3 99.86646 99.26724 100.4657 98.95002 100.7829
# 2008 Q4 100.69200 99.93567 101.4483 99.53529 101.8487
# 2009 Q1 101.51754 100.57777 102.4573 100.08028 102.9548
# 2009 Q2 102.34308 101.19808 103.4881 100.59195 104.0942
# 2009 Q3 103.16862 101.79962 104.5376 101.07492 105.2623
# 2009 Q4 103.99416 102.38447 105.6038 101.53236 106.4560
# 2010 Q1 104.81970 102.95412 106.6853 101.96654 107.6729
# 2010 Q2 105.64524 103.50968 107.7808 102.37918 108.9113
# 2010 Q3 106.47077 104.05204 108.8895 102.77163 110.1699
# 2010 Q4 107.29631 104.58191 110.0107 103.14499 111.4476
我能够在一个情节中获得以前的数据和预测
> autoplot(CPI.HI.cfr)
以及预测期间的实际数据在一个单独的图中
> autoplot(CPI.HI.pos)
我希望他们两个在同一个情节上。
我知道它可以最好地完成,ggplot()
但是在尝试了几种方法之后,例如
ggplot(aes(x=x, y=y), data=CPI.HI.pre) +
geom_line(CPI.HI.pos)
事情开始让我感到困惑!
解决方案
所以我发现你的问题不太方便重现,下次你可能会考虑使用dput()
. 我认为这是因为我不得不以下列方式处理复制粘贴的数据以获得类似于您输入的内容:
zz <- " Qtr1 Qtr2 Qtr3 Qtr4
2000 83.12262 83.72945 84.10338 84.58881
2001 85.03111 85.92120 85.86388 85.74424
2002 86.01310 86.89452 87.05565 87.31702
2003 87.93231 88.23959 88.43708 88.56572
2004 89.02891 90.05139 90.17285 90.68677
2005 90.82155 91.74464 92.18774 92.57043
2006 92.91782 94.15888 94.58178 94.13807
2007 94.58282 95.99794 96.12194 97.08308
2008 97.72470 99.54615 NA NA"
yy <- " Qtr1 Qtr2 Qtr3 Qtr4
2008 NA NA 100.39960 99.11151
2009 98.79588 99.36900 99.75832 99.90321
2010 100.17990 100.96250 100.99250 101.40690"
qq <- "Year Qtr PointForecast Lo80 Hi80 Lo95 Hi95
2008 Q3 99.86646 99.26724 100.4657 98.95002 100.7829
2008 Q4 100.69200 99.93567 101.4483 99.53529 101.8487
2009 Q1 101.51754 100.57777 102.4573 100.08028 102.9548
2009 Q2 102.34308 101.19808 103.4881 100.59195 104.0942
2009 Q3 103.16862 101.79962 104.5376 101.07492 105.2623
2009 Q4 103.99416 102.38447 105.6038 101.53236 106.4560
2010 Q1 104.81970 102.95412 106.6853 101.96654 107.6729
2010 Q2 105.64524 103.50968 107.7808 102.37918 108.9113
2010 Q3 106.47077 104.05204 108.8895 102.77163 110.1699
2010 Q4 107.29631 104.58191 110.0107 103.14499 111.4476"
CPI.HI.pre <- read.table(text = zz, header = T)
CPI.HI.pre$year <- rownames(CPI.HI.pre)
CPI.HI.pos <- read.table(text = yy, header = T)
CPI.HI.pos$year <- rownames(CPI.HI.pos)
CPI.HI.cfr <- read.table(text = qq, header = T)
我已经将行名复制到了一个实际变量中CPI.HI.pre
和CPI.HI.pos
。我还添加了Year
和Qtr
colnamesCPI.HI.cfr
并用 s 填补了任何空白NA
。接下来,我将数据从长格式转换为宽格式:
df1 <- reshape2::melt(CPI.HI.pre, id.vars = "year")
df2 <- reshape2::melt(CPI.HI.pos, id.vars = "year")
# data of origin saved as an extra column
df <- rbind(cbind(df1, data = "CPI.HI.pre"),
cbind(df2, data = "CPI.HI.pos"))
df <- df[!is.na(df$value),]
# CPI.HI.cfr is already in long format, but wanted to have a shorter variable
fc <- CPI.HI.cfr
然后我将年份季度对转换为可以通过 ggplot 轻松解释的数值。我确信有人有更好的想法来进行日期格式转换,例如使用 lubridate 包,但我并不精通这一点。
df$x <- as.numeric(df$year) + (as.numeric(factor(df$variable), levels = paste0("Qrt", 1:4)))/4
fc$x <- as.numeric(fc$Year) + (as.numeric(factor(fc$Qtr), levels = paste0("Q", 1:4)))/4
最后我们可以绘制数据。我们为 80% 和 95% 的置信区间使用了两个透明的 geom_ribbons,为预测点和实际点使用了两条线。
ggplot(df) +
geom_ribbon(data = fc, aes(x, ymin = Lo95, ymax = Hi95), fill = "blue", alpha = 0.25) +
geom_ribbon(data = fc, aes(x, ymin = Lo80, ymax = Hi80), fill = "blue", alpha = 0.25) +
geom_line(data = fc, aes(x, PointForecast), colour = "blue") +
geom_line(aes(x, value))
看起来像这样:
推荐阅读
- reporting-services - 如何在 SSRS 矩阵报告中包含未包含在数据集中的行值
- python - 使用python并行操作对象
- linux - linux新安装omnet的新路径
- axapta - 在采购申请行明细中控制财务维度的问题
- ansible - 为什么 Ansible 需要模块?
- flutter - 未来列表和刷新加载器 | 颤振问题
- android - 需要禁用点击以在android中共享wifi密码
- python - 高级切片:Python 列表 vs Numpy 数组
- javascript - initNumToRender 如何在 FlatList 上工作?
- python - 使用 list.pop() 从矩阵中删除元素返回 None,或者列表索引错误