使用 $ 与 [] 表示法创建 xts 对象的滞后变量
create lag variable of xts object using $ vs. [] notation
我正在尝试使用 lag
函数在 xts 对象中创建滞后向量。它在使用 $
符号(例如 x.ts$r1_lag
)在 xts 对象中定义新向量时有效,但在使用方括号定义新变量时有效,即 xts[,"r1_lag"]
。请参阅下面的代码:
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"])
我需要使用 []
表示法而不是 $
表示法来引用向量,因为如果我想 运行 多个 xts 对象(向量在多个 xts 对象的列表中),我无法使用 $
表示法在对象内定义新向量,即我无法使用以下程式化循环中的表示法定义新向量:
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)
}
}
谢谢!
您不需要使用[<-.xts
。您可以使用 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)
}
}
我得到了相同的输出:
x.ts <- cbind(x.ts,lag(x.ts[,"r1"]))
和
x.ts <- transform(x.ts, r1_lag = lag(x.ts[,'r1']))
但是,请注意输出。它可能看起来一样,但结构有所改变。
这应该有效:
x.ts <- merge(x.ts,lag(x.ts[,"r1"]))
然后您可能想要重命名添加的最后一列:
dimnames(x.ts)[[2]][5] <- "r1_lag"
这是结果:
> 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"
希望对您有所帮助。
该错误与 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
只是一个 merge
:
identical(cbind(x1,x2),merge(x1,x2)
也就是说,我认为这是一种错误,它适用于 $<-
运算符而不适用于 [<-
运算符。
我正在尝试使用 lag
函数在 xts 对象中创建滞后向量。它在使用 $
符号(例如 x.ts$r1_lag
)在 xts 对象中定义新向量时有效,但在使用方括号定义新变量时有效,即 xts[,"r1_lag"]
。请参阅下面的代码:
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"])
我需要使用 []
表示法而不是 $
表示法来引用向量,因为如果我想 运行 多个 xts 对象(向量在多个 xts 对象的列表中),我无法使用 $
表示法在对象内定义新向量,即我无法使用以下程式化循环中的表示法定义新向量:
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)
}
}
谢谢!
您不需要使用[<-.xts
。您可以使用 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)
}
}
我得到了相同的输出:
x.ts <- cbind(x.ts,lag(x.ts[,"r1"]))
和
x.ts <- transform(x.ts, r1_lag = lag(x.ts[,'r1']))
但是,请注意输出。它可能看起来一样,但结构有所改变。
这应该有效:
x.ts <- merge(x.ts,lag(x.ts[,"r1"]))
然后您可能想要重命名添加的最后一列:
dimnames(x.ts)[[2]][5] <- "r1_lag"
这是结果:
> 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"
希望对您有所帮助。
该错误与 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
只是一个 merge
:
identical(cbind(x1,x2),merge(x1,x2)
也就是说,我认为这是一种错误,它适用于 $<-
运算符而不适用于 [<-
运算符。