使用 R 中的预测包对天然气电力需求执行时间序列 ARIMA 模型

机器算法验证 r 时间序列 预测 有马
2022-03-20 17:01:55

我一直在尝试预测天然气电力需求以及它如何受温度和价格的影响。我不确定我是否正确地完成了所有操作(对 R 来说相对较新),但我似乎确实获得了相关数据,但我似乎无法更改我的预测期,我也不确定这是一个合适的模型数据。希望有人能给我一些指导。

数据:需求.csv

library(forecast)
data = read.csv("demand.csv")

# Create matrix of numeric predictors
xreg <- cbind(weather=data$Weather,price=data$Price,m1=data$M1,
m2=data$M2,m3=data$M3,m4=data$M4,m5=data$M5,m6=data$M6,
m7=data$M7,m8=data$M8,m9=data$M9,m10=data$M10,m11=data$M11)

# Rename columns
colnames(xreg) <- c("Weather","Price","Jan","Feb","Mar","Apr",
"May","Jun","Jul","Aug","Sep","Oct","Nov")

# Variable to be modelled
demandTS <- ts(data$Demand, frequency=12)

# Find ARIMAX model
demandArima <- auto.arima(demandTS, xreg=xreg)
demand.fcast <- forecast(demandArima, xreg=xreg)
plot(demand.fcast)

感谢您的任何帮助。

参考:

如何在 R 中的自动 ARIMA 中设置 xreg 参数 从自动 ARIMA 到 R 中的预测

3个回答

不幸的是,您在这里几乎没有技术错误。

您不能使用库(预测)函数 auto.arima 制作 ARIMAX 模型。Xreg 参数使它成为带有 ARMA 错误的回归模型。这是我必须通过想知道结果来努力学习的东西...... :)

并且您必须为预测函数中的 xreg 参数提供 FUTURE 值。将您的数据分成两部分:1)一个适合模型 2)外生变量的未来值。Auto.arima 不会通过 ARIMA 模型预测 xreg 变量的未来值。

如果您想尝试 ARIMAX 模型,请尝试使用 arimax-function 的 library(TSA),它的语法当然与 auto.arima - function 不同... :)

编辑:

这是使用带有 xreg 参数的 auto.arima 的示例,其中数据集具有用于模型参数估计的第一个数据,然后用于预测。

library(forecast);  
apu=read.table("demo_1.csv",sep=";",dec=",",header=TRUE);  
apux=read.table("demo_2.csv",sep=";",dec=",",header=TRUE);  
apuxx=read.table("demo_3_xreg.csv",sep=";",dec=",",header=TRUE);  
apu2=ts(data=apu[2],start=c(2011,1),deltat=1/365);  
apu3=ts(data=apu[3],start=c(2011,1),deltat=1/365);  
apu4=ts(data=apux[1],start=c(2011,1),deltat=1/365);  
Acf(apu2);  
Pacf(apu2);  
apu5=ts.intersect(apu3,apu4);  
apu6=ts(data=apuxx[3],start=c(2013,263),deltat=1/365);  
apu7=ts(data=apuxx[2],start=c(2013,263),deltat=1/365);  
apu8=ts.intersect(apu6,apu7);   


sarimax=auto.arima(apu2, d=NA, D=NA, max.p=5, max.q=5,  
     max.P=365, max.Q=365, max.order=5, start.p=2, start.q=2,  
     start.P=1, start.Q=1, stationary=FALSE, seasonal=TRUE,  
     ic=c("aicc","aic", "bic"), stepwise=TRUE, trace=FALSE,  
     approximation=(length(apu2)>100 | frequency(apu2)>12), xreg=apu5,  
     test=c("kpss","adf","pp"), seasonal.test=c("ocsb","ch"),  
     allowdrift=TRUE, lambda=0, parallel=FALSE, num.cores=NULL);  
print(sarimax$arma);  
    print(accuracy(sarimax));  
    print(sarimax$coef);  
plot(sarimax$residuals);    
    print(Box.test(sarimax$residuals,lag=30,type=c("Ljung-Box")));    

sarimaxpredicts=forecast(sarimax, h=7,level=c(75,80,90,95), fan=FALSE, xreg=apu8,  lambda=sarimax$lambda,bootstrap=FALSE, npaths=5000);  
plot(sarimaxpredicts);  

Unobserved Components Model (UCM) 是一种用于时间序列预测和回归分析的状态空间建模方法。它是一种非常灵活的建模方法,易于解释的方法。我没有受过统计学方面的培训。UCM 是一种非常直观的方法,像我这样的非统计学家可以轻松采用并专注于解决问题,而不是花时间在模型构建上。UCM 也是一个非常通用的模型,每个明智的 ARIMA 都有一个 UCM 等效模型,但并非所有 UCM 都具有等效的 ARIMA 模型。

我使用SAS对 UCM 进行建模。然而,还有其他工具,如 Stata、Oxmetrics 也有 UCM。我认为 R 中没有易于使用的 UCM 包。您可以参考 Jacques JF Commandeur(作者)和 Siem Jan Koopman(作者)的优秀文本An Introduction to State Space Time Series Analysis 。

下面是我用来建模的代码,我还回归了价格的滞后值,因为假设当前月份的价格会对未来月份的需求产生影响是合理的。

data demandm;
            set demand;

            weather_1 = lag(weather); *lag 1;
            price_1 = lag(price); *lag 1;

            weather_2 = lag2(weather); *lag 2;
            price_2 = lag2(price); *lag 2;

            if weather_2 = . then delete;
            if price_2 = . then delete;
    run;

ods graphics on ; 
   proc ucm data = demandm; 
      id date interval = month; 
      model demand =weather price price_1; 
      irregular p = 1; 
      season length = 12 variance = 0 noest plot = smooth;
      estimate back=5 plot=(normal acf);
      forecast lead=5 back=5 plot=decomp; 
   run ; 
  ods graphics off ;

关于代码:

  • 我为天气和价格创建了一个带有 lag1 和 lag2 变量的数据集,并删除了前 2 个观测值,因为它不包含 2 个滞后。
  • 我在 Proc UCM 中使用了一个基本结构模型,只有不规则分量和季节性分量。此外,我回归了对天气、当前月份价格和过去月份价格的需求。所有其他变量均不显着。我还坚持了过去 5 个月,看看这个模型对未知的未来数据的预测效果如何。
  • 您可以通过简单地更改 proc ucm 中的预测语句来预测数据,但是您需要为未来值提供自变量天气和价格。

下面是输出:

    Irregular           Error Variance    2.416887E12     3.6646E11       6.60      <.0001
    Irregular           AR_1                  0.35428       0.10069       3.52      0.0004
    Weather             Coefficient             97713       11412.6       8.56      <.0001
    Price               Coefficient            496679      156407.4       3.18      0.0015
    price_1             Coefficient           -770025      164737.7      -4.67      <.0001

由于残差分析显示了一些模式,我将不规则分量建模为自回归顺序 = 1。请参阅我放置的不规则分量中的代码p = 1lag2 的价格和两个滞后的天气并不重要。关于重要的个体变量,

  • 天气的每单位变化都会增加约 98,000 单位的
    需求量。
  • 本月价格增加了约 496,000 单位的需求量。
  • 本月价格上涨导致下个月需求减少约 770,000 单位。

该模型还自动识别了 2012 年 7 月和 2007 年 8 月的 2 个异常值,可以通过使用虚拟代码变量更改 SAS 代码来纠正这些异常值。

下面是一些不错的图形输出(顺时针读取):

  1. 最重要的图是残差自相关,它表明没有留下任何模式。
  2. 在季节图中,您可以看到夏季和收卷机的需求增加,而春季和秋季的需求低。看起来很直观,但 UCM 的强大之处在于它为您提供了诸如此类的可解释组件。
  3. 最终图是具有拟合数据的模型。
  4. 是样本外预测,您已经保留了 5 个值,并且您可以直观地看到应用的模型,当前模型非常适合样本外数据,您可以使用它来比较其他类别的模型。 在此处输入图像描述

希望这会有所帮助。

幸运的是,不必假设适当的滞后结构,因为这可以通过脉冲响应权重提出,可以通过模型诊断经验性地修改。此外,不必假设季节性指标的数量及其开始日期,因为这可以通过干预检测轻松找到。最重要的是,不必假设误差方差是恒定的,因为可以选择自动评估不同变换的 Box-Cox 测试。最后,不必手动添加脉冲指示器,因为现代软件会执行此操作。

以下是使用http://www.autobox.com/30day.exe上免费提供的演示自动开发的模型(使用缩放数据)。您可以自己下载此 30 天试用版并复制这些结果分钟(不限制对模型形式的猜测)。我是 AUTOBOX 的开发人员之一,可以保证它的彻底性。如果您有任何疑问/问题,请联系 Automatic Forecasting Systems 的人员。

在此处输入图像描述

实际/已清理图表说明了识别季节性指标和豆类的点。在此处输入图像描述

预测表在这里

在此处输入图像描述

附图表

在此处输入图像描述

在关闭实际/拟合和预测

80 的第一个周期预测值高于观测值 53,但标准差约为 28,53 的值大约相差 1 个标准差。预报员对第一个时期的预测更为准确,但正如有人曾经说过的“一燕不成夏天”。

在此处输入图像描述