Seite 1 von 1
Granger-causality
Verfasst: So Jan 22, 2017 6:57 pm
von tr206
Hallo,
ich versuche einen Granger-causality test in R zu machen. Hierzu verwende ich das vars package. Der code sieht so aus aus basiert auf das Canada Beispiel das bereits im package vars enthalten ist
Code: Alles auswählen
library(vars)
Canada<-Canada[, c("prod", "e", "U", "rw")]
p1ct<-VAR(Canada, p=1, type = "both")
p1ct
causality(p1ct, cause = c("prod","e","U","rw"))
Die Zeile mit causality() sagt aus, dass ich den Einfluss aller variablen auf die anderen variablen darstellen will. D.h. ich will eine Matrix mit F-values erstellen in der gezeigt wird ob z.B. die Variable prod einen signifikanten Einfluss auf z.B. e, U oder rw hat. Mein Problem ist das R mir den Fehler ausgibt
Code: Alles auswählen
Error in `[<-`(`*tmp*`, i, w[i], value = 1) : subscript out of bounds
Es stellen sich konkret 2 Fragen:
1. Was heisst die Fehlermeldung und wieso bekomme ich diesen Fehler?
2. Wie kann ich eine Matrix von F-values in R erstellen?
Vielen Dank und Gruss.
tr206
Re: Granger-causality
Verfasst: Mo Jan 23, 2017 1:53 pm
von EDi
So wie ich das sehe, muss man eine Variable immer weglassen (habe aber keine blassen Schimmer von dem was da gerechnet wird! - Also ganz vorsichtig mit meiner Antwort. ).
Tut das was du willst?
Code: Alles auswählen
library(vars)
Canada<-Canada[, c("prod", "e", "U", "rw")]
p1ct<-VAR(Canada, p=1, type = "both")
p1ct
# create all combinations of 4 variables
allc <- data.frame(t(combn(c("prod", "e", "U", "rw"), 3)))
# add missing one
allc$var <- apply(allc, MARGIN = 1, function(y) c("prod", "e", "U", "rw")[!c("prod", "e", "U", "rw") %in% y])
allc
# run causality on each variable
res <- apply(allc, 1, function(y) causality(p1ct, cause = y[1:3]))
names(res) <- allc$var
# check
causality(p1ct, cause = c('prod', 'e', 'U'))
res[["rw"]]
Re: Granger-causality Matrix erstellen
Verfasst: Mi Feb 08, 2017 12:44 pm
von tr206
Danke. Das klappt aber ich habe nochmal das mit dem MSBVAR package versucht. Der code ist wie folgt
Code: Alles auswählen
library(MSBVAR)
VAR_analsis_DataUSA<-VAR_analsis_DataUSA[,-1]
Granger<-granger.test(VAR_analsis_DataUSA,p=2)
Granger
Ich erhalte eine Tabelle mit 2 Spalten so wie in der Zusammenfassung zu dem package beschrieben. Meine Frage ist nun wie ich die Tabelle in eine Matrix umwandeln kann. Das soll in etwa wie eine Korrelationsmatrix aussehen in der die F-values drin stehen.
Wie kann ich das machen?
Vielen Dank vorab.
Re: Granger-causality
Verfasst: Mi Feb 08, 2017 12:55 pm
von EDi
Ich würde sagen, du musst dir eine Methode ausdenken wie du aus den Namen ('x -> y') die koordinaten in der korrelationsmatrix erstellen kannst.
Wenn du das hast, muss du nur noch die Matrix mit den F-Werte füllen.
Re: Granger-causality
Verfasst: Mi Feb 08, 2017 4:20 pm
von jogo
Also bei mir ist
Granger eine Matrix
Code: Alles auswählen
> str(Granger)
num [1:42, 1:2] 1.304 0.374 30.955 1.289 0.388 ...
- attr(*, "dimnames")=List of 2
..$ : chr [1:42] "tau -> g" "MILL -> g" "equity.premium -> g" "Zt.rw -> g" ...
..$ : chr [1:2] "F-statistic" "p-value"
Willst Du so etwas:
Code: Alles auswählen
matrix(Granger[,"F-statistic"], 6)
# > matrix(Granger[,"F-statistic"], 6)
# [,1] [,2] [,3] [,4] [,5] [,6] [,7]
# [1,] 1.3038989 109.8588820 0.06811689 4.711651 3.4744614 3.754708 0.9675240
# [2,] 0.3739337 0.4289219 0.22170191 3.406178 0.4462931 1.138805 2.8414209
# [3,] 30.9546512 16.8900565 2.61500621 6.719902 3.2668339 2.017266 0.7035866
# [4,] 1.2887051 15.9566951 0.59160061 6.447569 113.5338678 1.126141 943.8700153
# [5,] 0.3881923 5.3792961 1.65712643 4.689760 2.3997168 7.733261 0.3006921
# [6,] 3.2307103 16.6811598 0.17686592 24.249872 0.8018749 1.495003 6.0659622
Gruß, Jörg
Re: Granger-causality
Verfasst: Mo Feb 13, 2017 1:16 pm
von tr206
Ja, so sollte es in etwa aussehen. Wenn ich jetzt noch weiß wie mann die Spalten und Zeilen beschriften kann und die p-values einfügen kann ist es perfekt. Alternativ statt den p-Werten wäre auch eine Kennzeichnung okay, die die Signifikanz auf dem 1%, 5% und 10% Niveau der F-Werte kennzeichnet, so dass ich sagen kann ob die F-statistic signifikant ist.
Re: Granger-causality
Verfasst: Mi Feb 15, 2017 9:16 am
von jogo
tr206 hat geschrieben: ↑Mo Feb 13, 2017 1:16 pm
Ja, so sollte es in etwa aussehen. Wenn ich jetzt noch weiß wie mann die Spalten und Zeilen beschriften kann und die p-values einfügen kann ist es perfekt. Alternativ statt den p-Werten wäre auch eine Kennzeichnung okay, die die Signifikanz auf dem 1%, 5% und 10% Niveau der F-Werte kennzeichnet, so dass ich sagen kann ob die F-statistic signifikant ist.
In Deiner ersten Nachricht zu diesem Thema hattest Du gefragt:
2. Wie kann ich eine Matrix von F-values in R erstellen?
Diese Frage habe ich beantwortet. Für die p-values sieht die Antwort nicht wesentlich anders aus. Offenbar möchtest Du eine sehr spezielle Druckaufbereitung der Ergebnisse, ohne dieses gewünschte Aussehen exakt zu beschreiben.
Bitte schau in die Druckaufbereitung für
summary.lm; den Teil mit den Signifikanzsternchen findest Du in der Funktion
printCoefmat()
Zu dem Wunsch, Zeilen- und Spaltenbeschriftung der Matrix hinzuzufügen, ist ersichtlich, dass dies bezüglich der Spalten recht gut zu bewerkstelligen ist, jedoch für die Zeilen nicht möglich ist, solange nicht die Werte für "g -> g", "tau -> tau" usw. (wahrscheinlich triviale Werte?) hinzugefügt werden.
Code: Alles auswählen
> matrix(dimnames(Granger)[[1]], 6)
[,1] [,2] [,3] [,4]
[1,] "tau -> g" "g -> tau" "g -> MILL" "g -> equity.premium"
[2,] "MILL -> g" "MILL -> tau" "tau -> MILL" "tau -> equity.premium"
[3,] "equity.premium -> g" "equity.premium -> tau" "equity.premium -> MILL" "MILL -> equity.premium"
[4,] "Zt.rw -> g" "Zt.rw -> tau" "Zt.rw -> MILL" "Zt.rw -> equity.premium"
[5,] "SENT -> g" "SENT -> tau" "SENT -> MILL" "SENT -> equity.premium"
[6,] "Cape -> g" "Cape -> tau" "Cape -> MILL" "Cape -> equity.premium"
[,5] [,6] [,7]
[1,] "g -> Zt.rw" "g -> SENT" "g -> Cape"
[2,] "tau -> Zt.rw" "tau -> SENT" "tau -> Cape"
[3,] "MILL -> Zt.rw" "MILL -> SENT" "MILL -> Cape"
[4,] "equity.premium -> Zt.rw" "equity.premium -> SENT" "equity.premium -> Cape"
[5,] "SENT -> Zt.rw" "Zt.rw -> SENT" "Zt.rw -> Cape"
[6,] "Cape -> Zt.rw" "Cape -> SENT" "SENT -> Cape"
Gruß, Jörg
Re: Granger-causality
Verfasst: Mo Feb 20, 2017 8:37 am
von jogo
Hier ein Vorschlag zum setzen der Spaltennamen:
Code: Alles auswählen
matrix(dimnames(Granger)[[1]], 6)
cnames <- sub(".* ", "", matrix(dimnames(Granger)[[1]], 6)[1,])
matrix(Granger[,"F-statistic"], 6, dimnames=list(NULL, cnames))
Da in Matrix der F-Werte (und auch die der p-values) kompaktifiziert sind (d.h. ohne die Hauptdiagonalelemente), kann man nicht in konsistenter Weise die Zeilennamen setzen.
Das kann man erst, wenn man die fehlende Hauptdiagonale wieder einsetzt, z.B. so:
Code: Alles auswählen
# make n*n from (n-1)*n matrix
m <- matrix(1:12, 3)
m
insdiag <- function(x) {
n <- ncol(x)
matrix(c(rbind(NA, matrix(x, n)), NA), n)
}
insdiag(m)
Gruß, Jörg