多变量时间序列 - 在 IRF 的一个变量后拆分
Multivariate time series - splitting after one variable for IRF
我有一个阈值 VAR。由于非线性 IRF 在 R 中是不可能的,我想用 IRF 绕过它。
以下是我的多变量时间序列的代码,然后是 TVAR
complete=ts.intersect(GDPdiff2,Inflationdiff2,Euribordiff2,CISSdiff2)
tvarcomplete= TVAR(complete, lag=4, nthresh=1, thDelay=1, thVar=complete[,1], trim=0.15)
我想将包含 4 个变量的现有时间序列分成两部分(一个 VAR 的所有变量的实际 GDP 增长值 > 0 和一个 < 0 )并计算相应的 IRF。
SPLITGDPup <- complete[(GDPdiff2>(0))]
没有成功。
我对您的问题有两个部分的回答:(1) 我将向您展示如何正确地对 complete
进行子集化,(2) 我将向您指出非线性脉冲响应函数的资源VAR。
子集多元时间序列
您尝试对 complete
进行子集化的方式存在一些问题:(1) 您实际上是在对矩阵进行子集化,就像它是一个向量一样,并且 (2) 您使用的是一个逻辑向量length 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:
Because matrices and arrays are implemented as vectors with special attributes, you can subset them with a single vector. In that case, they will behave like a vector.
此外,它从 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 的脉冲响应函数
我会提醒你在发表像 "Since nonlinear irf's are not possible in R" 这样的声明之前多做一些谷歌搜索。在 R 中,几乎任何事情都是 可能 ,并且由于 R 社区的强大,如果您知道的话,您可能想做的很多事情(关于现存的统计方法)已经被某人实现了去哪里看。
在您的情况下,如果您查看了 GitHub repository for the package you're using you'd see that while a generalized impulse response function hasn't been implemented in the tsDyn package, one of the authors has made code for it that you can find here 执行此操作以获得 TVAR
结果。
我有一个阈值 VAR。由于非线性 IRF 在 R 中是不可能的,我想用 IRF 绕过它。
以下是我的多变量时间序列的代码,然后是 TVAR
complete=ts.intersect(GDPdiff2,Inflationdiff2,Euribordiff2,CISSdiff2)
tvarcomplete= TVAR(complete, lag=4, nthresh=1, thDelay=1, thVar=complete[,1], trim=0.15)
我想将包含 4 个变量的现有时间序列分成两部分(一个 VAR 的所有变量的实际 GDP 增长值 > 0 和一个 < 0 )并计算相应的 IRF。
SPLITGDPup <- complete[(GDPdiff2>(0))]
没有成功。
我对您的问题有两个部分的回答:(1) 我将向您展示如何正确地对 complete
进行子集化,(2) 我将向您指出非线性脉冲响应函数的资源VAR。
子集多元时间序列
您尝试对 complete
进行子集化的方式存在一些问题:(1) 您实际上是在对矩阵进行子集化,就像它是一个向量一样,并且 (2) 您使用的是一个逻辑向量length 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:
Because matrices and arrays are implemented as vectors with special attributes, you can subset them with a single vector. In that case, they will behave like a vector.
此外,它从 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 的脉冲响应函数
我会提醒你在发表像 "Since nonlinear irf's are not possible in R" 这样的声明之前多做一些谷歌搜索。在 R 中,几乎任何事情都是 可能 ,并且由于 R 社区的强大,如果您知道的话,您可能想做的很多事情(关于现存的统计方法)已经被某人实现了去哪里看。
在您的情况下,如果您查看了 GitHub repository for the package you're using you'd see that while a generalized impulse response function hasn't been implemented in the tsDyn package, one of the authors has made code for it that you can find here 执行此操作以获得 TVAR
结果。