我正在尝试使用R中的矢量误差校正模型(VECM)来计算Granger因果关系检验。我使用 tsDyn 包计算了R中的VECM。由于我有 I (1)和协整变量,因此假设VECM实现了Granger因果关系检验。但是我没有在R中找到任何可以执行VECM格兰杰格兰杰因果关系检验的函数。我想问你,是否有人确实知道这样的功能。这是我的例子:
dols.est <- dynlm(ts_ln.API.real.1~ts_MR.var.nom.1+L(d(ts_MR.var.nom.1), -3:3)) # Estimate θ with DOLS
est.theta <- dols.est$coefficients[2]
int.mts <- ts.union(ts_ln.API.real.1, ts_MR.var.nom.1) # Create a multivariate time series
VEC.est <- VECM(int.mts, lag=1, r=1, include = c("both"), beta = est. theta)
任何帮助将不胜感激。 提前谢谢!
答案 0 :(得分:0)
0 毕竟,通过考虑所有滞后的普通样本的使用来执行ADF测试。例如:(causfinder :: adfcs和causfinder :: adfcstable):
adfcs <- function (t, max = floor(12 * (length(t)/100)^(1/4)), type = c("c"))
# Augmented Dickey-Fuller function that takes into account the usage of common sample for all the lags
{
x <- ts(t)
x1d <- diff(x, differences = 1)
x1l <- lag(x, -1)
if (max == 0) {
x_names <- c("x1d", "x1l")
DLDlag <- ts.intersect(x1d, x1l)
DLDlag.df <- data.frame(DLDlag, obspts = c(time(DLDlag)))
}
else {
x_names <- c("x1d", "x1l", sapply(1:max, function(i) paste("x1d", i, "l", sep = "")))
}
if (max != 0) {
for (i in as.integer(1:max)) {
assign(x_names[i + 2], lag(x1d, -i))
}
DLDlag <- do.call(ts.intersect, sapply(x_names, as.symbol))
DLDlag.df <- data.frame(DLDlag, obspts = c(time(DLDlag)))
DifferenceLags <- as.vector(names(DLDlag.df), mode = "any")[3:(length(DLDlag.df) - 1)]
}
lmresults <- array(list())
SBCvalues <- array(list())
AICvalues <- array(list())
for (i in as.integer(0:max)) {
if (type == c("nc")) {
if (i == 0) {
lmresults[[max + 1]] <- lm(as.formula(paste("x1d ~x1l")), data = DLDlag.df)
SBCvalues[[max + 1]] <- BIC(lmresults[[max + 1]])
AICvalues[[max + 1]] <- AIC(lmresults[[max + 1]])
}
if (i > 0) {
lmresults[[i]] <- lm(as.formula(paste("x1d ~ x1l+", paste(DifferenceLags[1:i], collapse = "+"))), data = DLDlag.df)
SBCvalues[[i]] <- BIC(lmresults[[i]])
AICvalues[[i]] <- AIC(lmresults[[i]])
}
}
if (type == c("c")) {
if (i == 0) {
lmresults[[max + 1]] <- lm(as.formula(paste("x1d ~1+x1l")), data = DLDlag.df)
SBCvalues[[max + 1]] <- BIC(lmresults[[max + 1]])
AICvalues[[max + 1]] <- AIC(lmresults[[max + 1]])
}
if (i > 0) {
lmresults[[i]] <- lm(as.formula(paste("x1d ~ 1+x1l+", paste(DifferenceLags[1:i], collapse = "+"))), data = DLDlag.df)
SBCvalues[[i]] <- BIC(lmresults[[i]])
AICvalues[[i]] <- AIC(lmresults[[i]])
}
}
if (type == c("ct")) {
if (i == 0) {
lmresults[[max + 1]] <- lm(as.formula(paste("x1d ~ 1+x1l+seq_along(x1d)", collapse = "")), data = DLDlag.df)
SBCvalues[[max + 1]] <- BIC(lmresults[[max + 1]])
AICvalues[[max + 1]] <- AIC(lmresults[[max + 1]])
}
if (i > 0) {
lmresults[[i]] <- lm(as.formula(paste("x1d ~ 1+x1l+seq_along(x1d)+", paste(DifferenceLags[1:i], collapse = "+"))), data = DLDlag.df)
SBCvalues[[i]] <- BIC(lmresults[[i]])
AICvalues[[i]] <- AIC(lmresults[[i]])
}
}
}
out <- list()
out$optmins <- list(which.min(SBCvalues), which.min(AICvalues))
out$SBCAIC <- as.data.frame(cbind(SBCvalues, AICvalues))
typespecified <- type
if (which.min(SBCvalues) == max + 1) {
scs <- (max + 2) - (0 + 1)
out$adfcst <- unitrootTest(x[scs:length(x)], lags = 0,
type = typespecified)
}
else {
scs <- (max + 2) - (which.min(SBCvalues) + 1)
out$adfcst <- unitrootTest(x[scs:length(x)], lags = which.min(SBCvalues),
type = typespecified)
}
out
}
当然,可以在表格中呈现相关的ADF统计数据(正如我们在“程序”中的CAD论文中所做的那样),这是由causfinder :: adfcstable给出的:
adfcstable <- function (d, max = 5)
{
d <- as.data.frame(d)
LevelADFtable <- matrix(, nrow = dim(d)[[2]] * 3, ncol = 10)
FirstDiffADFtable <- matrix(, nrow = dim(d)[[2]] * 3, ncol = 9)
Result <- matrix(, nrow = dim(d)[[2]] * 3, ncol = 1)
ADFtable <- as.data.frame(cbind(LevelADFtable, FirstDiffADFtable, Result), stringsAsFactors = FALSE)
colnames(ADFtable) <- c("var", "type", "inc", "levelt", "Pc", "c", "Pt", "t", "prob", "omlo", "type", "inc", "1stDifft", "Pc", "c", "Pt", "t", "prob", "omlo", "intorder")
for (i in as.integer(1:dim(d)[[2]])) {
for (j in as.integer(1:3)) {
ADFtable[3 * (i - 1) + j, 1] <- colnames(d)[[i]]
}
ADFtable[3 * i - 2, 2] <- "dt"
ADFtable[3 * i - 2, 11] <- "dt"
ADFtable[3 * i - 1, 2] <- "d"
ADFtable[3 * i - 1, 11] <- "d"
ADFtable[3 * i, 2] <- "-"
ADFtable[3 * i, 11] <- "-"
ADFtable[3 * i - 2, 3] <- round(adfcs(d[, i], type = c("ct"))$adfcst@test$regression$coefficients[2, 1], digits = 3)
ADFtable[3 * i - 1, 3] <- round(adfcs(d[, i], type = c("c"))$adfcst@test$regression$coefficients[2, 1], digits = 3)
ADFtable[3 * i, 3] <- round(adfcs(d[, i], type = c("nc"))$adfcst@test$regression$coefficients[1, 1], digits = 3)
ADFtable[3 * i - 2, 12] <- round(adfcs(diff(d[, i], differences = 1), type = c("ct"))$adfcst@test$regression$coefficients[2, 1], digits = 3)
ADFtable[3 * i - 1, 12] <- round(adfcs(diff(d[, i], differences = 1), type = c("c"))$adfcst@test$regression$coefficients[2, 1], digits = 3)
ADFtable[3 * i, 12] <- round(adfcs(diff(d[, i], differences = 1), type = c("nc"))$adfcst@test$regression$coefficients[1, 1], digits = 3)
ADFtable[3 * i - 2, 4] <- round(adfcs(d[, i], type = c("ct"))$adfcst@test$statistic, digits = 3)
ADFtable[3 * i - 1, 4] <- round(adfcs(d[, i], type = c("c"))$adfcst@test$statistic, digits = 3)
ADFtable[3 * i, 4] <- round(adfcs(d[, i], type = c("nc"))$adfcst@test$statistic, digits = 3)
ADFtable[3 * i - 2, 13] <- round(adfcs(diff(d[, i], differences = 1), type = c("ct"))$adfcst@test$statistic, digits = 3)
ADFtable[3 * i - 1, 13] <- round(adfcs(diff(d[, i], differences = 1), type = c("c"))$adfcst@test$statistic, digits = 3)
ADFtable[3 * i, 13] <- round(adfcs(diff(d[, i], differences = 1), type = c("nc"))$adfcst@test$statistic, digits = 3)
ADFtable[3 * i - 2, 5] <- round(adfcs(d[, i], type = c("ct"))$adfcst@test$regression$coefficients[1, 4], digits = 3)
ADFtable[3 * i - 2, 7] <- round(adfcs(d[, i], type = c("ct"))$adfcst@test$regression$coefficients[3, 4], digits = 3)
ADFtable[3 * i - 1, 5] <- round(adfcs(d[, i], type = c("c"))$adfcst@test$regression$coefficients[1, 4], digits = 3)
ADFtable[3 * i - 1, 7] <- "X"
ADFtable[3 * i, 5] <- "X"
ADFtable[3 * i, 7] <- "X"
ADFtable[3 * i - 2, 14] <- round(adfcs(diff(d[, i], differences = 1), type = c("ct"))$adfcst@test$regression$coefficients[1, 4], digits = 3)
ADFtable[3 * i - 2, 16] <- round(adfcs(diff(d[, i], differences = 1), type = c("ct"))$adfcst@test$regression$coefficients[3, 4], digits = 3)
ADFtable[3 * i - 1, 14] <- round(adfcs(diff(d[, i], differences = 1), type = c("c"))$adfcst@test$regression$coefficients[1, 4], digits = 3)
ADFtable[3 * i - 1, 16] <- "X"
ADFtable[3 * i, 14] <- "X"
ADFtable[3 * i, 16] <- "X"
if (ADFtable[3 * i - 2, 5] < 0.05) {
ADFtable[3 * i - 2, 6] <- "s"
}
else {
ADFtable[3 * i - 2, 6] <- " "
}
if (ADFtable[3 * i - 2, 7] < 0.05) {
ADFtable[3 * i - 2, 8] <- "s"
}
else {
ADFtable[3 * i - 2, 8] <- " "
}
if (ADFtable[3 * i - 1, 5] < 0.05) {
ADFtable[3 * i - 1, 6] <- "s"
}
else {
ADFtable[3 * i - 1, 6] <- " "
}
ADFtable[3 * i - 1, 8] <- "X"
ADFtable[3 * i, 6] <- "X"
ADFtable[3 * i, 8] <- "X"
if (ADFtable[3 * i - 2, 14] < 0.05) {
ADFtable[3 * i - 2, 15] <- "s"
}
else {
ADFtable[3 * i - 2, 15] <- " "
}
if (ADFtable[3 * i - 2, 16] < 0.05) {
ADFtable[3 * i - 2, 17] <- "s"
}
else {
ADFtable[3 * i - 2, 17] <- " "
}
if (ADFtable[3 * i - 1, 14] < 0.05) {
ADFtable[3 * i - 1, 15] <- "s"
}
else {
ADFtable[3 * i - 1, 15] <- " "
}
ADFtable[3 * i - 1, 17] <- "X"
ADFtable[3 * i, 15] <- "X"
ADFtable[3 * i, 17] <- "X"
ADFtable[3 * i - 2, 9] <- round(adfcs(d[, i], type = c("ct"))$adfcst@test$p.value[[1]], digits = 3)
ADFtable[3 * i - 1, 9] <- round(adfcs(d[, i], type = c("c"))$adfcst@test$p.value[[1]], digits = 3)
ADFtable[3 * i, 9] <- round(adfcs(d[, i], type = c("nc"))$adfcst@test$p.value[[1]], digits = 3)
ADFtable[3 * i - 2, 18] <- round(adfcs(diff(d[, i], differences = 1), type = c("ct"))$adfcst@test$p.value[[1]], digits = 3)
ADFtable[3 * i - 1, 18] <- round(adfcs(diff(d[, i], differences = 1), type = c("c"))$adfcst@test$p.value[[1]], digits = 3)
ADFtable[3 * i, 18] <- round(adfcs(diff(d[, i], differences = 1), type = c("nc"))$adfcst@test$p.value[[1]], digits = 3)
ADFtable[3 * i - 2, 10] <- round(adfcs(d[, i], type = c("ct"))$adfcst@test$parameter, digits = 3)
ADFtable[3 * i - 1, 10] <- round(adfcs(d[, i], type = c("c"))$adfcst@test$parameter, digits = 3)
ADFtable[3 * i, 10] <- round(adfcs(d[, i], type = c("nc"))$adfcst@test$parameter, digits = 3)
ADFtable[3 * i - 2, 19] <- round(adfcs(diff(d[, i], differences = 1), type = c("ct"))$adfcst@test$parameter, digits = 3)
ADFtable[3 * i - 1, 19] <- round(adfcs(diff(d[, i], differences = 1), type = c("c"))$adfcst@test$parameter, digits = 3)
ADFtable[3 * i, 19] <- round(adfcs(diff(d[, i], differences = 1), type = c("nc"))$adfcst@test$parameter, digits = 3)
if (sum(as.numeric(c(ADFtable[3 * i - 2, 9] < 0.05 && ADFtable[3 * i - 2, 3] < 0, ADFtable[3 * i - 1, 9] < 0.05 && ADFtable[3 * i - 1, 3] < 0, ADFtable[3 * i, 9] < 0.05 && ADFtable[3 * i, 3] < 0))) > 1) {
ADFtable[3 * i - 1, 20] <- "I(0)"
}
else {
if (sum(as.numeric(c(ADFtable[3 * i - 2, 18] < 0.05 && ADFtable[3 * i - 2, 12] < 0, ADFtable[3 * i - 1, 18] < 0.05 && ADFtable[3 * i - 1, 12] < 0, ADFtable[3 * i, 18] < 0.05 && ADFtable[3 * i, 12] < 0))) > 1) {
ADFtable[3 * i - 1, 20] <- "I(1)"
}
else {
ADFtable[3 * i - 1, 20] <- "variableoi"
}
}
ADFtable[3 * i - 2, 20] <- ""
ADFtable[3 * i, 20] <- ""
}
ADFtable
}
1 即使对于VECM模型(例如,我们的变量是I(1)和协整),我们根据VAR模型的信息标准在我们的时间序列级别上选择滞后数。具有不同容量的相同职责的职能:
vars::VARselect # or
FIAR::ARorder # or
causfinder::ARorderG # or
causfinder::VARomlop (the last package is not free)
将在级别中的变量上运行(没有差异)。
2 要检查协整,请使用
ca.jo(..,K=cointegrationLength)
ca.jo中的参数K控制VECM模型的滞后数。将VARomlop(或其他)中找到的滞后数作为参数K传递。使用ca.jo确定协整等级。 ecdet选项是&#34;无&#34;因为协整方程中没有截距,&#34; const&#34;对于协整方程中的常数项和&#34;趋势&#34;对于协整方程中的趋势变量。
根据mydata中的第一列指定长期关系的规范化,可以通过改变提交的mydata的列来改变(如果需要),例如,mydata [,&#34; X2&#34;, &#34; X1&#34;&#34; X3&#34;&#34; X4&#34;。]
K是VAR级别的滞后数,因此K-1是VECM表示中的滞后数。例如,
summary(ca.jo(mydata, ecdet="none", type="eigen", K=29))
根据特征/轨迹测试的结果,确定协整的存在性和协整等级r。
3 如果在系统中的系列中检测到协整,则通过考虑协整等级来拟合矢量误差修正模型(VECM)。即,我们在上述步骤中使用ca.jo的协整向量拟合VECM模型。 ca.jo的结果和协整向量的数量被传递给cajorls。 cajorls有r(协整等级)。
通过使用命令cajorls()估计受限制的VECM来生成归一化的协整向量。例如,
cajorls(...,K=lagLength)
cajorls(ca.jo(mydata, ecdet="none", type="eigen", K=29),r=1)
错误校正项可以仅包含在VECM的每个等式中一次。它要么滞后1,要么滞后p,其中p是VECM的滞后阶数; VECM的相应表示称为长期和短暂的;它仍然是同一个模型,只是不同的表现形式;我们选择我们喜欢的那个。
4 将VECM转换为VAR:
vars::vec2var
分析:
http://www.r-bloggers.com/cointegration-r-irish-mortgage-debt-and-property-prices/
这也回答了你的问题。
如果您有一个双变量VAR系统,则保留古典G-因果关系。 如果你有一个&#34;&gt;&#34; -variable VAR系统,你必须进入高级G因果关系: 条件G-因果关系,部分G-因果关系,调和G-因果关系,规范G-因果关系,全局G-因果关系等。
你也可以学习以下论文:
&#34; Causfinder:用于系统分析条件和部分格兰杰因果关系的R包&#34;,国际科学与先进技术期刊,2014年10月。http://www.ijsat.com/view.php?id=2014:October:Volume%204%20Issue%2010
&#34;土耳其经常账户赤字的决定因素:有条件和部分格兰杰因果关系方法&#34; (扩展; 33页) https://www.academia.edu/17698799/Determinants_of_Current_Account_Deficit_in_Turkey_The_Conditional_and_Partial_Granger_Causality_Approach_Extended_
&#34;土耳其经常账户赤字的决定因素:有条件和部分格兰杰因果关系方法&#34; (9页),Procedia Economics and Finance,Vol。 26,2015,p.92-100 https://www.academia.edu/17057780/Determinants_of_Current_Account_Deficit_in_Turkey_The_Conditional_and_Partial_Granger_Causality_Approach
causfinder是FIAR包的一般化(你可以在CRAN archieve中找到FIAR。FIAR 0.3,0.4和0.5。FIAR是完全免费的)。 https://cran.r-project.org/src/contrib/Archive/FIAR 我强烈建议FIAR 0.3,因为0.3版本显然比后来的版本更加可扩展。即使您不需要分析0.4和0.5版本。 因此,我在FIAR 0.3上构建了causfinder。
在FIAR中,您可以逐个找到CGC。在causfinder中,它以系统方式同时提供所有CGC。在6变量系统中,有6 * 5 = 30个CGC和30个PGC。这些30 + 30 = 60个CGC和PGC在FIAR中逐个计算(60个命令)。在causfinder中,这些30 + 30 GC仅使用2个命令计算。在5变量系统中,有5 * 4 = 20个CGC和20个PGC。这些20 + 20 = 40个CGC和PGC在FIAR中逐个计算(40个命令)。在causfinder中,这些20 + 20 GC仅使用2个命令计算。
causfinder提供的(超过FIAR)是极速/速度,简单,可视化和易于分析;没别的。
如果您想学习CGC或PGC,您也可以通过FIAR学习: 统计软件期刊(JSS):https://www.jstatsoft.org/article/view/v044i13 FIAR:用于分析大脑功能整合的R包
请注意:
在R:
可以执行CGC和PGC分析的包:FIAR和causfinder
在Matlab中:
可以执行CGC和PGC分析的包:
GCCA(格兰杰因果连通性分析)(Anil SETH)2009:
MVGC(多变格兰杰因果关系)2014:新版GCCA
GrangerCausalityGUI(由于一些论文在2008-2013期间开发的建峰丰集团的成果。
2011年,Roelstraete和Rosseel的FIAR R软件包处理高级G因果关系分析,揭示了GCCA中的一个错误!
据我所知,在其他统计/计量经济学软件中,没有可以执行CGC和PGC的软件包/功能。
在Matlab中编程肯定比在R中编程更困难。因此,我在R中编写了causfinder(在我体验Gretl和Eviews中的编码之后)。
(因此我们认为我们是R!)
5 在获得VAR(来自VECM)之后,其中由协整引起的限制被加载到VAR的系数上; (如果你有&#34;&gt; 2&#34; - 在步骤0中变量系统,请执行以下操作。如果没有,R中已经有经典的G因果关系包;使用它们)
FIAR::condGranger
FIAR::partGranger
或
causfinder::conditionalGgFp
causfinder::partialGgFp
如果你想要自举,那么:
causfinder::conditionalGblup
causfinder::partialGblup
答案 1 :(得分:0)
您可以使用Toda-Yamamoto方法Toda-Yamamoto implementation in R。