créer une variable de décalage de l'objet xts en utilisant la notation $ vs []

J'essaie de créer un vecteur décalé dans un objet xts en utilisant la fonction lag . Il fonctionne lors de la définition du nouveau vecteur dans l'objet xts en utilisant la notation $ (par exemple x.ts $ r1_lag ), mais il le fait lors de la définition de la nouvelle variable entre crochets, xts [ "r1_lag"] . Voir le code ci-dessous:

library(xts)
x <- data.frame(date=seq(as.Date('2015-01-01'), by='days', length=100),
                runif(1e2), runif(1e2), runif(1e2))
colnames(x) <- c("date", "r1", "r2", "r3")

#the following command works
x.ts <- xts(x, order.by=x$date)
x.ts$r1_lag <- lag(x.ts$r1)
# but the following does not (says subscript is out of bounds)
x.ts <- xts(x, order.by=x$date)
x.ts[,"r1_lag"] <- lag(x.ts[,"r1"])

Je dois utiliser la notation [] plutôt que la notation $ pour référencer les vecteurs car si je veux exécuter la transformation de décalage sur des vecteurs dans plus d'un objet xts (vecteurs dans un liste de plusieurs objets xts), je ne peux pas définir les nouveaux vecteurs dans les objets en utilisant la notation $ , ie je ne peux pas définir les nouveaux vecteurs en utilisant la notation dans la boucle stylisée ci-dessous:

for (i in letters) {
  for (j in variables) {
    macro.set.ts$i$paste(j,"_L1",sep="") <- lag(macro.set.ts[[i]][,j])
    macro.set.ts$i$paste(j,"_L2",sep="") <- lag(macro.set.ts[[i]][,j], 2)
    macro.set.ts$i$paste(j,"_L4",sep="") <- lag(macro.set.ts[[i]][,j], 4)
  }
}

Merci!

0
Side note: pourquoi avez-vous une colonne de date dans vos xts? vous devriez avoir seulement des colonnes numériques et utiliser la date comme un index. Sinon, vous ne profiterez pas de l'utilisation de xts (dans votre exemple, il s'agit juste d'une sorte de matrice de caractères)
ajouté l'auteur agstudy, source

4 Réponses

L'erreur n'est pas liée à la fonction lag . Vous obtenez une erreur car vous essayez d'affecter un objet xts avec un autre objet xts. Cet exemple reproduit l'erreur:

x.date= seq(as.Date('2015-01-01'), 
                        by = 'days' , length = 5)
x1 <- xts(data.frame(c1=runif(5)), order.by=x.date)
x2 <- xts(data.frame(c2=runif(5)), order.by=x.date)
x1[,'r2'] <- x2

## Error in `[<-.default`(`*tmp*`, , "r2", 
##   subscript out of bounds

Je trouve cela cohérent dans la logique xts, car les xts sont des objets indexés. Il est donc préférable ici de fusionner des objets ou de joindre et conserver la nature indexée de vos séries temporelles.

merge(x1,x2) 

Ceci cbind la série 2 fois et corrige n'importe quel problème d'index. en fait, cbind est juste un merge :

identical(cbind(x1,x2),merge(x1,x2)

That's said I think it is a kind of bug that this works for $<- operator and not with [<- operator.

0
ajouté
Notez qu'il n'y a pas de $ <-. Xts , donc $ <-. Zoo est distribué. Et l'erreur avec [<-. Xts est cohérente avec zoo (c'est-à-dire que vous obtenez la même erreur si vous essayez ceci avec des objets zoo au lieu de xts).
ajouté l'auteur Joshua Ulrich, source

J'ai la même sortie avec:

x.ts <- cbind(x.ts,lag(x.ts[,"r1"]))

Et

x.ts <- transform(x.ts, r1_lag = lag(x.ts[,'r1']))

Mais, soyez prudent avec la sortie. Il peut sembler la même chose mais avec une structure altérée.

0
ajouté

You don't need to use [<-.xts. You can use merge instead:

for (i in letters) {
  for (j in variables) {
    # create all lags
    mst_ij <- macro.set.ts[[i]][,j]
    jL <- merge(lag(mst_ij), lag(mst_ij, 2), lag(mst_ij, 4))
    colnames(jL) <- paste(j, c("L1","L2","L4"), sep="_")
    # merge back with original data
    macro.set.ts[[i]] <- merge(macro.set.ts[[i]], jL)
  }
}
0
ajouté
Merci, la commande de fusion est très utile ici. Cependant, il semble que ce soit une sorte de bogue que ma méthode originale de simplement réattribuer l'objet xts avec un vecteur supplémentaire fonctionne avec l'opérateur $ <- et non avec le [<- comme @agstudy mentionné.
ajouté l'auteur lrclark, source
@lrclark: comme je l'ai commenté sur la réponse d'agstudy: il n'y a pas $ <-. xts , donc $ <-. zoo est envoyé; et l'erreur avec [<-. xts est cohérente avec zoo (c'est-à-dire que vous obtenez la même erreur si vous essayez ceci avec des objets zoo au lieu de xts). Je ne suis pas sûr que cela soit considéré comme un bug dans [<-. Zoo , puisque c'est le même comportement que vous obtenez avec une matrix et/ou ts object (qui est ce que zoo étend).
ajouté l'auteur Joshua Ulrich, source

Cela devrait fonctionner:

x.ts <- merge(x.ts,lag(x.ts[,"r1"]))

Vous voudrez alors probablement renommer la dernière colonne qui a été ajoutée:

dimnames(x.ts)[[2]][5] <- "r1_lag"

C'est le résultat:

> head(x.ts)
           date         r1           r2           r3             r1_lag      
2015-01-01 "2015-01-01" "0.23171030" "0.44174424" "0.3396816640" NA          
2015-01-02 "2015-01-02" "0.97292220" "0.74909452" "0.2793033421" "0.23171030"
2015-01-03 "2015-01-03" "0.52320743" "0.49288463" "0.0193637393" "0.97292220"
2015-01-04 "2015-01-04" "0.36574297" "0.69571803" "0.6411834760" "0.52320743"
2015-01-05 "2015-01-05" "0.37563137" "0.13841216" "0.3087215754" "0.36574297"
2015-01-06 "2015-01-06" "0.48089356" "0.32702759" "0.3967609401" "0.37563137"

> class(x.ts)
[1] "xts" "zoo"

J'espère que cela t'aides.

0
ajouté