我对您的问题有两个部分的答案:(1)我将向您展示如何complete
正确地进行子集化,(2)我将为您指出非线性 VAR 的脉冲响应函数的资源。
子集多元时间序列
您尝试对子集进行子集化的方式存在几个问题complete
:(1)您实际上是在对矩阵进行子集化,就像它是一个向量一样,以及(2)length(GDPdiff2)
当您想要一个长度的逻辑向量时,您使用的是一个长度的逻辑向量nrow(complete)
。为了说明,我首先制作一些示例数据,因为您没有提供您的数据:
# set the seed for reproducibility
set.seed(123)
# make example data
ts1 <- ts(rnorm(10))
ts2 <- ts(rnorm(8))
complete <- ts.intersect(ts1, ts2)
complete
Time Series:
Start = 1
End = 8
Frequency = 1
ts1 ts2
1 -0.56047565 1.2240818
2 -0.23017749 0.3598138
3 1.55870831 0.4007715
4 0.07050839 0.1106827
5 0.12928774 -0.5558411
6 1.71506499 1.7869131
7 0.46091621 0.4978505
8 -1.26506123 -1.9666172
现在我们将尝试像您一样对它进行子集化:
# attempt to subset like yours
complete[ts1 > 0]
[1] 1.55870831 0.07050839 0.12928774 1.71506499 0.46091621 -0.55584113
[7] 1.78691314 0.49785048 -1.96661716
这导致了一个向量而不是一个矩阵。为什么?来自 Hadley Wickham 的Advanced R:
由于矩阵和数组是作为具有特殊属性的向量实现的,因此您可以使用单个向量对它们进行子集化。在这种情况下,它们的行为就像一个向量。
此外,它从第二列中complete
提取的元素与第一列的正元素不对齐。为什么?让我们看看您将用于子集的逻辑向量:
ts1 > 0
[1] FALSE FALSE TRUE TRUE TRUE TRUE TRUE FALSE FALSE FALSE
有 10 个元素,而complete
只有 8 行,因为您使用过ts.intersect
它只给出完整的案例(ts2
观察结果少于ts1
)。这两个问题的结合是您的子集设置策略不起作用的原因。以下是如何正确执行此操作:
complete[complete[, 'ts1'] > 0, ]
ts1 ts2
[1,] 1.55870831 0.4007715
[2,] 0.07050839 0.1106827
[3,] 0.12928774 -0.5558411
[4,] 1.71506499 1.7869131
[5,] 0.46091621 0.4978505
或者,如果您知道并且更愿意使用列号:
complete[complete[, 1] > 0, ]
ts1 ts2
[1,] 1.55870831 0.4007715
[2,] 0.07050839 0.1106827
[3,] 0.12928774 -0.5558411
[4,] 1.71506499 1.7869131
[5,] 0.46091621 0.4978505
TVAR 的脉冲响应函数
我会提醒您在做出诸如“由于非线性 irf 在 R 中是不可能的”之类的声明之前,请先进行更多的谷歌搜索。在 R 中几乎任何事情都是可能的,并且由于 R 社区非常强大,如果您知道去哪里寻找,那么您可能想做的许多事情(关于现存的统计方法)已经被某人实现了。
在您的情况下,如果您查看了您正在使用的包的 GitHub 存储库,您会发现虽然tsDyn 包中尚未实现通用脉冲响应函数,但其中一位作者已经为其编写了代码你可以在这里找到这样做的TVAR
结果。