首页 > 解决方案 > 在 KFAS 上自动使用 SSMcustom 以获得时间序列每日效果

问题描述

我想在时间序列分析中量化事件的结构效应。为此,我正在使用该KFAS软件包所提供的内容。

问题是,如果我想同时建模 n 个不同的日期,那么代码似乎有点棘手,所以n 个不同的事件。

这是一些应该澄清的例子,我希望:

library(fpp2)
library(KFAS)
# required libraries
y <- hyndsight # just for the example
plot(hyndsight)
abline(v = c(19, 35, 47), col = "red", lwd = 2)

在此处输入图像描述

假设我想检查每个“红线”事件是否是“永久性冲击”(即:它改变了后见之明系列的水平)。现在这是可以使用KFAS函数执行此操作的模型:

# Z and T component for event on pos 19
aZ1 <- array(0, c(1, 1, length(y)))
aZ1[1, 1, (19 + 1):length(y)] <- 1 # 1s from pos 19(+1) forward
aT1 <- array(1, c(1, 1, length(y)))

# Z and T component for event on pos 35
aZ2 <- array(0, c(1, 1, length(y)))
aZ2[1, 1, (35 + 1):length(y)] <- 1 # 1s from pos 35(+1) forward
aT2 <- array(1, c(1, 1, length(y)))

# Z and T component for event on pos 47
aZ3 <- array(0, c(1, 1, length(y)))
aZ3[1, 1, (47 + 1):length(y)] <- 1 # 1s from pos 47(+1) forward
aT3 <- array(1, c(1, 1, length(y)))

这是实际的模型:

mod <- SSModel(y~0+SSMtrend(2, list(NA, NA))+SSMseasonal(12, NA)+
        SSMcustom(Z = aZ1, T = aT1,
                  R = matrix(0, 1, 0), Q = matrix(0, 0, 0),
                  a1 = 0, P = matrix(0), P1inf = matrix(1))+ # first event
        SSMcustom(Z = aZ2, T = aT2,
                  R = matrix(0, 1, 0), Q = matrix(0, 0, 0),
                  a1 = 0, P = matrix(0), P1inf = matrix(1))+ # second event
        SSMcustom(Z = aZ3, T = aT3,
                  R = matrix(0, 1, 0), Q = matrix(0, 0, 0),
                  a1 = 0, P = matrix(0), P1inf = matrix(1)), # third event
H = NA)

initial_val <- c(0,0,0,0,0,0,0) # the first 4 are always there
fit <- fitSSM(mod, intits = initial_val)

现在,问题是,如何根据要建模的事件数量“自动化”这个过程?

如您所见,对于每个事件,我需要创建一个 vectoraZ和一个 vector aT。那些需要通过SSMcustom函数在模型中传递,如果我有一个新的时间序列,我只需要评估两个事件,或者四个或更多。

问题是我不能继续添加SSMcustom到模型中,我想传递一个包含n 个事件向量的新时间序列,并自动构建相同的模型,除了要评估的事件数量。我可以SSMcustom为所有事件建立一个独特的吗?

initial_val必须改变,但这并不那么复杂,它总是 4 + n,其中n是事件的数量。

我知道这个问题非常具体,也许它更适合 CrossValidated,但我不太确定。

标签: rtime-serieskalman-filter

解决方案


引入“永久冲击”变量,冲击前等于 0,冲击后等于 1(每次冲击一个变量)。然后将这些变量作为解释变量(回归变量)添加到您的模型中,并查看它们是否显着。

注意这些变量中的每一个都会降低自由度。因此,您可能希望针对所有冲击测试具有相同系数的模型。


推荐阅读