首页 > 解决方案 > 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)

这是数据——

  1. CPI.HI.pre(该课程的先前时间序列ts
  2. CPI.HI.pos(类的后验时间序列ts
  3. CPI.HI.cfrforecast班级危机预测)
> 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)

事情开始让我感到困惑!

标签: rggplot2forecast

解决方案


所以我发现你的问题不太方便重现,下次你可能会考虑使用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.preCPI.HI.pos。我还添加了YearQtrcolnamesCPI.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))

看起来像这样:

在此处输入图像描述


推荐阅读