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