2015-06-18 1 views
4

Я пытаюсь создать запаздывающий вектор в объекте xts с помощью функции lag. Он работает при определении нового вектора в объекте xts с использованием нотации $ (например, x.ts$r1_lag), но это происходит при определении новой переменной с использованием квадратных скобок, то есть 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) 
    } 
} 

Спасибо!

+1

Сторона примечания: почему у вас есть столбец даты в ваших xts? вы должны иметь только числовые столбцы и использовать дату в качестве индекса.В противном случае вы не будете получать прибыль от использования 'xts' (в вашем примере это всего лишь своего рода матрица символов) – agstudy

ответ

5

Вы не нуждаетесь использовать [<-.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) 
    } 
} 
+0

Спасибо, команда merge очень полезна здесь. Однако, похоже, что-то вроде ошибки, что мой первоначальный метод просто переназначения объекта xts с дополнительным вектором работает с оператором '$ <-', а не с оператором '[<-' как упомянутым @agstudy. – lrclark

+0

@lrclark: как я прокомментировал ответ agstudy: нет '$ <-. Xts', поэтому отправляется' $ <-. Zoo'; и ошибка с '[<-. xts' согласуется с зоопарком (т. е. вы получаете ту же ошибку, если попытаетесь сделать это с объектами зоопарка вместо xts). Я не уверен, что это будет считаться ошибкой в ​​'[<-. Zoo', так как это то же самое поведение, которое вы получаете с помощью объекта' matrix' и/или 'ts' (который является тем, что расширяет зоопарк). –

1

я получил тот же результат с:

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

Вы тогда, вероятно, хотите переименовать последний столбец, который был добавлен:

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" 

Надеется, что это помогает.

3

Ошибка не связана с функцией 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 логики, потому что X индексируются объекты. Поэтому здесь лучше объединить объекты или присоединиться и сохранить индексированный характер ваших временных рядов.

merge(x1,x2) 

Это cbind времен серии 2 и зафиксировать любую проблему индекса. на самом деле, cbind только в merge:

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

Вот сказал, что я думаю, что это своего рода ошибка, что это работает для $<- оператора, а не с [<- оператором.

+1

Обратите внимание, что нет '$ <-. Xts', поэтому отправляется' $ <-. Zoo'. И ошибка с '[<-. Xts' согласуется с зоопарком (т. Е. Вы получаете ту же ошибку, если попытаетесь сделать это с объектами zoo вместо xts). –