Granger-causality

Allgemeine Statistik mit R, die Test-Methode ist noch nicht bekannt, ich habe noch keinen Plan!

Moderatoren: EDi, jogo

Antworten
tr206

Granger-causality

Beitrag 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
Benutzeravatar
EDi
Beiträge: 1599
Registriert: Sa Okt 08, 2016 3:39 pm

Re: Granger-causality

Beitrag 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"]]
Bitte immer ein reproduzierbares Minimalbeispiel angeben. Meinungen gehören mir und geben nicht die meines Brötchengebers wieder.

Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
Bild.
tr206

Re: Granger-causality Matrix erstellen

Beitrag 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.
Dateianhänge
VAR_analsis_DataUSA.csv
(34.47 KiB) 142-mal heruntergeladen
Benutzeravatar
EDi
Beiträge: 1599
Registriert: Sa Okt 08, 2016 3:39 pm

Re: Granger-causality

Beitrag 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.
Bitte immer ein reproduzierbares Minimalbeispiel angeben. Meinungen gehören mir und geben nicht die meines Brötchengebers wieder.

Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
Bild.
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Granger-causality

Beitrag 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
tr206

Re: Granger-causality

Beitrag 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.
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Granger-causality

Beitrag 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
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Granger-causality

Beitrag 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
Antworten