干预分析 - 多个时期的脉搏

机器算法验证 时间序列 有马 干预分析
2022-03-22 13:27:16

我有几个每周的时间序列,并且在几周内发生了一次干预,然后在一段时间没有干预之后,又开始了一些干预。因此,该模式会关闭数周,然后开启数周,然后关闭数周,然后可能再次开启。

下图试图显示可能的模式:

在此处输入图像描述

当存在单个脉冲时,如此处所讨论,将干预编码为脉冲(1 或该周期,其他地方为零)并将传递函数编码为几种形状之一 - 例如仅影响单个周期(脉冲),永久的电平移动(一步)或可能具有持久(但衰减)的效果(脉冲,但具有衰减传递函数)。

但是,在此处描述的情况下,是否具有相同的灵活性,或者我们真的只能选择将干预编码为 10 个单独的干预(针对顶部系列)或 5 个单独的干预用于底部系列,并且只允许干预影响单期?我不确定如何让任何“脉冲”产生衰减效应,因为一个从哪里开始,另一个在哪里停止?

到目前为止,在我对此类分析的阅读中,我已经看到了脉搏和步幅,但没有像这样,在一段时间内“开启”,然后“关闭”,然后再次开启(也许)。

1个回答

假设您有一个时间序列数据 42 个观察值。观察 7 到 13 有步进(水平移位)干预,观察 29 到 35 有 5 个单位的步进干预。其余观察值为 0。例如,请参见下表,了解具有实际和实际 + 误差的模拟数据。在此处输入图像描述

如果您想使用 arima 传递函数将此数据建模为干预分析,您只需创建一个虚拟编码变量,其中 1 代表 7 到 13,1 代表 29 到 35,然后通过这是 ARIMAX 模型中的一步干预。我不知道如何使用 R 进行传递函数建模,所以我使用了 SAS。请参阅下面的实际数据和预测数据。ARIMAX 非常接近数据。请参阅下面我用来创建数据的 SAS 代码以及 ARIMAX。

如果您的第二次干预有第一次干预有衰减效应,您需要做的就是在第一步函数结束时创建第二次干预变量并对其进行适当的编码。

希望这有帮助。

在此处输入图像描述

data temp;
    input actual @@;
    error = rand("NORMAL");
    datalines;
0 0 0 0 0 0 5
5 5 5 5 5 5 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
5 5 5 5 5 5 5
0 0 0 0 0 0 0
;
run;

data temp;
    set temp;
      actual_error = actual+error; *add random error;

      if 7 <= _n_ <= 14 or 29 <= _n_ <= 35 then step = 1; * First Intervention step;
            else step = 0;

run;

ods graphics on;
proc arima data = temp plots = all;
    identify var=actual_error crosscorr = (step); 
     estimate input = (step) method = ml outest = mm1; /*Estimate Model using Transfer Function*/
     forecast out = out1 lead = 0;
run;
ods graphics off;

编辑:由于 b_miner 想知道如何使用具有线性衰减的临时电平移位来对此进行建模,因此我修改了示例。我只展示了第一个电平转换,第二个电平转换可以很容易地添加。如果您正在寻找线性衰减以外的衰减,那么这很容易做到,只需使用使用传递函数的步进+渐变永久衰减函数即可。干预建模与其说是科学,不如说是一门艺术。你假设一个形状,测试假设,如果可以接受,继续改变形状。干预建模本质上是确定性的。如果您有兴趣了解有关传递函数建模/干预检测的更多信息,我强烈推荐Forecasting-Dynamic-Regression-Models-Pankratz. 除了传递函数建模之外,本文还包含所有可能的不同类型的干预模型。

希望这可以帮助。

data temp;
    input actual @@;
    error = rand("NORMAL");
    datalines;
0 0 0 0 0 0 5
5 5 5 5 5 5 4.1
4 3.5 3 2.5 2 1.75 1.25
0.75 0.25 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
;
run;

data temp;
    set temp;
    retain ramp 0;
      actual_error = actual+error; *add random error;

      if 7 <= _n_ <= 13 then step = 1;
            else step = 0;


      if 14 <= _n_ <= 23  then do;
            step = (_n_ - 24)/(13-24); 

      end;

run;



ods graphics on;
proc arima data = temp plots = all;
    identify var=actual_error crosscorr = (step); 
     estimate input = (step) method = ml outest = mm1; /*Estimate Model using Transfer Function*/
     forecast out = out1 lead = 0;
run;
ods graphics off;

在此处输入图像描述