R中使用VECM的格兰杰因果关系检验

时间:2014-07-14 15:46:20

标签: r causality

我正在尝试使用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)

任何帮助将不胜感激。 提前谢谢!

2 个答案:

答案 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-因果关系等。

你也可以学习以下论文:

  1. &#34; Causfinder:用于系统分析条件和部分格兰杰因果关系的R包&#34;,国际科学与先进技术期刊,2014年10月。http://www.ijsat.com/view.php?id=2014:October:Volume%204%20Issue%2010

  2. &#34;土耳其经常账户赤字的决定因素:有条件和部分格兰杰因果关系方法&#34; (扩展; 33页) https://www.academia.edu/17698799/Determinants_of_Current_Account_Deficit_in_Turkey_The_Conditional_and_Partial_Granger_Causality_Approach_Extended_

  3. &#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