1

R のベクトル誤り訂正モデル (VECM) を使用してグレンジャー因果関係テストを計算しようとしています。tsDynパッケージを使用して R で VECM を計算しました。I (1) と共和分変数あるため、VECM はグレンジャー因果性検定を実装すると想定されます。ただし、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)

どんな助けでも大歓迎です。前もって感謝します!

4

2 に答える 2

1

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
}

そしてもちろん、causfinder::adfcstable によって与えられる (Procedia の CAD ペーパーで行ったように) テーブルに関連する ADF 統計全体を表示することもできます。

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 オプションは、共和分方程式の切片がない場合は「none」、共和分方程式の定数項は「const」、共和分方程式のトレンド変数は「trend」です。

長期的な関係の正規化は、mydata の 1 番目の列に従って指定されます。たとえば、mydata[,"X2","X1","X3", 「X4」]。

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 回だけ含めることができます。1 または p だけ遅れます。ここで、p は VECM の遅れ次数です。VECM の対応する表現は、長期および一時的として知られています。表現が異なるだけで、モデルは同じです。私たちは好きなものを選びます。

4 VECM を VAR に変換するには:

vars::vec2var

分析:
http://www.r-bloggers.com/cointegration-r-irish-mortgage-debt-and-property-prices/ もあなたの質問に答えます。

2 変数 VAR システムを使用している場合は、従来の G 因果関係を維持します。">2" 変数 VAR システムを使用している場合は、高度な G 因果関係に進む必要があります: 条件付き G 因果関係、部分 G 因果関係、調和 G 因果関係、正準 G 因果関係、グローバル G 因果関係など。

次の論文も学習できます。

  1. 「Causfinder: An R package for Systemwise Analysis of Conditional and Partial Granger Causalities」、International Journal of Science and Advanced Technology、2014 年 10 月。http://www.ijsat.com/view.php?id=2014:October:Volume% 204%20発行%2010

  2. 「トルコにおける経常収支赤字の決定要因: 条件付きおよび部分的なグレンジャー因果関係アプローチ」(拡張; 33 ページ)

「トルコにおける経常収支赤字の決定要因: 条件付きおよび部分的グレンジャー因果関係アプローチ」(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 パッケージの一般化です (FIAR は CRAN アーカイブにあります。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 を 1 つずつ見つけます。causfinder では、すべての CGC を体系的に一度に提供します。6 変数システムでは、6*5=30 個の CGC と 30 個の PGC があります。これらの 30+30=60 個の CGC と PGC は、FIAR (60 コマンド) で 1 つずつ計算されます。causfinder では、これらの 30+30 GC が 2 つのコマンドのみで計算されます。5 変数システムでは、5*4=20 個の CGC と 20 個の PGC があります。これらの 20+20=40 個の CGC と PGC は、FIAR (40 コマンド) で 1 つずつ計算されます。causfinder では、これらの 20+20 GC が 2 つのコマンドのみで計算されます。

causfinder が (FIAR を介して) 提供するものは、極端な速度/ペース、単純さ、視覚化、および分析の容易さです。他には何もありません。

CGC または PGC を勉強したい場合は、FIAR を介して行うこともできます: Journal of Statistical Software (JSS): https://www.jstatsoft.org/article/view/v044i13 FIAR: An R Package for Analyzing Functional Integration in脳

ご了承ください:

Rで:

CGC および PGC 分析を実行できるパッケージ: FIAR および causfinder

マトラブでは:

CGC および PGC 分析を実行できるパッケージ:

GCCA (Granger Causal Connectivity Analysis) (Anil SETH) 2009:
MVGC (Multivariate Granger Causality) 2014: GCCA
GrangerCausalityGUI の新バージョン (2008 年から 2013 年にかけていくつかの論文に伴って開発された Jianfeng FENG グループの成果物。

2011 年、高度な G 因果分析を処理する Roelstraete と Rosseel の FIAR R パッケージで、GCCA のバグが明らかになりました。

私の知る限り、他の統計/計量経済学ソフトウェアには、CGC と PGC を実行できるパッケージ/機能はありません。
Matlab でのプログラミングは、R よりも間違いなく難しいです。したがって、Causfinder を R で作成しました (Gretl と Eviews でのコーディングを経験した後)。(だから私たちはRだと思います!)

5共和分による制限が VAR の係数にロードされた VAR (VECM から) を取得した後。(ステップ 0 で ">2" 変数システムがある場合は、次の手順を実行します。そうでない場合は、R に既に古典的な G 因果関係パッケージがあります。それらを使用してください)

FIAR::condGranger
FIAR::partGranger

また

causfinder::conditionalGgFp
causfinder::partialGgFp

ブートストラップも必要な場合は、次のようにします。

causfinder::conditionalGblup
causfinder::partialGblup
于 2016-05-03T13:01:59.470 に答える