我对您的问题有两个部分的答案:(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 repository for the package you're using,您会发现虽然a generalized impulse response function hasn't been implemented in the tsDyn package,但其中一位作者已经为它编写了代码,您可以找到here 为TVAR 结果执行此操作.