Create a delay variable for the xts object using the notation $ vs. []

I am trying to create a lagging vector inside an xts object using a function lag. It works when defining a new vector in an xts object using notation $(for example, x.ts$r1_lag), but when defining a new variable, square brackets are used, i.e. xts[,"r1_lag"]. See the following code:

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"])

I need to use a notation []instead of a notation $to refer to vectors, because if I want to start the delay conversion in vectors in more than one xts object (vectors in a list of several xts objects), I cannot define new vectors inside objects using the notation $, those. I cannot define new vectors using the notation in the following stylized loop:

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)
  }
}

Thank!

+4
source share
4 answers

You do not need to use [<-.xts. Instead, you can use merge:

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)
  }
}
+5
source

lag. , xts xts. :

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

, xts, xts . .

merge(x1,x2) 

cbind 2 . , cbind a merge:

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

, , $<-, [<-.

+3

:

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

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

. , .

+1

:

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

Then, you probably want to rename the last added column:

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

This is the result:

> 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"

Hope this helps.

+1
source

All Articles