2016-05-27 5 views
0

Quelqu'un peut-il m'aider à courir dans R VAR (1) (autorégression vectorielle) avec une fenêtre roulante sur une série chronologique multiple ET en quelque sorte stocker les Bcoef (coefficients) et résiduels? Il semble que je ne peux pas trouver un moyen de tout faire à la fois.VAR (1) fenêtre glissante (Autorégression vectorielle)

Mon code: (en utilisant des paquets library(vars) pour vecteur autoregressions

varcoef <- function(x) Bcoef(VAR(x, p=1, type =c("const"), lag.max = NULL)) 
varr <- function(x) resid(VAR(x, p=1, type =c("const"), lag.max = NULL)) 
rolling.var.coef <- rollapply(eur.var,width=120,varcoef, by.column=FALSE) 
var.resids<-as.data.frame(rollapplyr(eur.var,width=120,varr, by.column=FALSE)) 

les deux problèmes avec cette approche:

  • I ont 3000 jours et les matrices de sortie rolling.var.coef et var.resids sont également de la longueur 3000, alors que les longueurs doivent être 7x3000 (il y a 7 coefficients) et 119 * 3000 (chaque régression a 119 résidus), donc il calcule le VAR (1) seulement pour les quelques premiers jours
  • ET la chose la plus importante: comment le faire dans une fonction, pas deux. parce que la sortie est deux matrices

Voici la vue approximative de mes données - 3000 jours comme ceci.

V1 V2 V3 V4 V5 V6 V7 
2016-05-10 -0.34 -0.35 -0.37 -0.40 -0.41 -0.30 0.14 
2016-05-09 -0.36 -0.35 -0.37 -0.40 -0.41 -0.30 0.15 
+0

Bienvenue sur Stacko verflow. S'il vous plaît jeter un oeil à des conseils sur la façon de créer un [exemple minimum] (http://stackoverflow.com/help/mcve) et ce post sur [produisant un bon exemple] (http://stackoverflow.com/questions/5963269/comment-faire-un-grand-r-reproductible-exemple) dans R. Aussi, cela vous dérangerait-il d'inclure dans votre question les paquets que vous utilisez? 'Bcoef', par exemple, ne fait pas partie de la base R. – lmo

+0

Merci pour le commentaire! ajouté le nom du paquet .. – Katia

+0

Comme mentionné dans les liens, c'est aussi une bonne idée d'inclure un exemple de jeu de données (probablement plus petit que votre original) qui reproduit votre problème pour les personnes à travailler avec. Jetez un coup d'oeil à la première réponse du lien de l'exemple R pour voir comment utiliser 'dput'. – lmo

Répondre

1

Alors, essayez quelque chose dans ces lignes (approche est empruntée à des morceaux de code du paquet frequencyConnectedness).

library(vars) 

data(Canada) 
data <- data.frame(Canada) 
window <- 10 

# your VAR function, saving both matrices in a list 
caller <- function(j) { 
    var.2c <- VAR(data[(1:window)+j,],p=1,type = "const") 
    B <- Bcoef(var.2c) 
    r <- resid(var.2c) 
    list(B,r) 
} 

# Roll the fn over moving windows 
out <- pbapply::pblapply(0:(nrow(Canada)-window), caller) 

La beauté est là que de grandes et plus de temps des fonctions telles que la consommation (SVAR) vous pouvez aller parallel.

calculs en parallèle sous Linux/Mac

Par exemple, sur les systèmes linux/mac cela devrait rendre plus facile la vie de votre ordinateur (toute autre histoire pour les fenêtres, voir le lien ci-dessus, et la solution ci-dessous):

library(vars) 
library(pbapply) 

data(Canada) 
data <- data.frame(Canada) 
window <- 10 

caller <- function(j) { 
    var.2c <- VAR(data[(1:window)+j,],p=1,type = "const") 
    B <- Bcoef(var.2c) 
    r <- resid(var.2c) 
    list(B,r) 
} 

# Calculate the number of cores and define cluster 
no_cores <- detectCores() - 1 
cluster <- makeCluster(no_cores, type ="FORK") 

out <- pbapply::pblapply(0:(nrow(Canada)-window), caller, cl = cluster) 

stopCluster(cluster) 

calculs parallèles utilisant les fenêtres

# Calculate the number of cores and create PSOCK cluster 
no_cores <- detectCores() - 1 
cluster <- makeCluster(no_cores) 

# Export necessary data and functions to the global environment of the cluster workers 
# and necessary packages on the cluster workers 
clusterExport(cluster, c("Canada","data","window","caller"), envir=environment()) 
clusterEvalQ(cluster, library(vars)) 

#Moving window estimation 
out <- pblapply(0:(nrow(Canada)-window), caller,cl = cluster) 

stopCluster(cluster) 
+1

La question était périmée, mais y a répondu pour référence future – Luks