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 因果関係など。
次の論文も学習できます。
「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
「トルコにおける経常収支赤字の決定要因: 条件付きおよび部分的なグレンジャー因果関係アプローチ」(拡張; 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