Быстро применяйте векторные операции xts к широким объектам зоопарка в R

Это действительно расширение моего вчерашнего вопроса, где я узнал о apply.weekly. Это прекрасно работает, но я хочу сделать это с широкими zoo объектами. Если я использую apply.weekly для широкого zoo, он суммирует столбцы, а затем выполняет еженедельную агрегацию:

> library(xts)
> set.seed(2001)
> zoo.daily <- zoo(data.frame(a=rnorm(20), b=rnorm(20), c=rnorm(20)), order.by=as.Date("2001-05-25") + 0:19)
> apply.weekly(zoo.daily, sum)
2001-05-27 2001-06-03 2001-06-10 2001-06-13 
  1.091999  -3.017688   3.842305   2.045370 
> apply.weekly(zoo.daily[, 1] + zoo.daily[, 2] + zoo.daily[, 3], sum) 
2001-05-27 2001-06-03 2001-06-10 2001-06-13 
  1.091999  -3.017688   3.842305   2.045370 

Я попробовал семейство операторов apply, но они, кажется, вырезают индекс даты zoo. Я могу сделать это в цикле for, но это действительно отнимает много времени (гораздо больше, чем в четыре раза медленнее, чем функция aggregate с периодичностью as.yearmon). Вот цикл for:

week.ends <- index(zoo.daily[endpoints(zoo.daily, "weeks")[-1], ])
num.weeks <- nweeks(zoo.daily)
num.stocks <- ncol(zoo.daily)
zoo.weeks <- zoo(matrix(NA, num.weeks, num.stocks), order.by=week.ends)
for (i in seq(num.stocks)) {
    zoo.weeks[, i] <- apply.weekly(zoo.daily[, i], mean)
}

Что работает (т.е. сохраняет каждый вектор отдельно):

2001-05-27 -0.36663040 -0.108648725  0.8392788
2001-06-03  0.33032998  0.003025018 -0.7644534
2001-06-10  0.07816992  0.620198931 -0.1494681
2001-06-13  0.02114608  0.956226189 -0.2955824

Есть ли способ быстро работать со всеми столбцами с помощью apply.weekly? Спасибо!

ОБНОВЛЕНИЕ: Джошуа Ульрих указывает, что мне нужна функция, поддерживающая столбцы (например, colMeans или colSums). Когда я это делаю, я получаю правильные ответы, но в виде транспонированной матрицы. Должен ли я просто переквалифицироваться и двигаться дальше? Или у меня неправильный параметр/настройка?

> apply.weekly(zoo.daily, colSums)
        [,1]        [,2]       [,3]        [,4]
a -1.0998912  2.31230989  0.5471894  0.06343824
b -0.3259462  0.02117512  4.3413925  2.86867857
c  2.5178365 -5.35117351 -1.0462765 -0.88674717

person Richard Herron    schedule 30.11.2010    source источник
comment
По поводу вашего обновления: установите xts из R-forge. Джефф исправил это несколько недель назад, но оно еще не попало в CRAN.   -  person Joshua Ulrich    schedule 01.12.2010


Ответы (1)


Вам нужно использовать функцию, учитывающую столбцы, в apply.weekly. Например, используйте colSums вместо sum или colMeans вместо mean.

Более поздние версии xts на R-forge дают вывод ниже. Текущая версия CRAN возвращает транспонированные данные.

# install.packages("xts", repos="http://r-forge.r-project.org")
> apply.weekly(zoo.daily, colSums)
                     a           b          c
2001-05-27 -1.09989120 -0.32594617  2.5178365
2001-06-03  2.31230989  0.02117512 -5.3511735
2001-06-10  0.54718941  4.34139252 -1.0462765
2001-06-13  0.06343824  2.86867857 -0.8867472
> apply.weekly(zoo.daily, colMeans)
                     a            b          c
2001-05-27 -0.36663040 -0.108648725  0.8392788
2001-06-03  0.33032998  0.003025018 -0.7644534
2001-06-10  0.07816992  0.620198931 -0.1494681
2001-06-13  0.02114608  0.956226189 -0.2955824

Если вам нужно использовать пользовательскую функцию, вы можете использовать комбинацию apply.weekly и apply:

> apply.weekly(zoo.daily, function(x) apply(x,2,mean))
                     a            b          c
2001-05-27 -0.36663040 -0.108648725  0.8392788
2001-06-03  0.33032998  0.003025018 -0.7644534
2001-06-10  0.07816992  0.620198931 -0.1494681
2001-06-13  0.02114608  0.956226189 -0.2955824
person Joshua Ulrich    schedule 30.11.2010
comment
Спасибо! Меня всегда смущает, насколько это легко. - person Richard Herron; 01.12.2010
comment
@richardh, если тебя это утешит, другие обычно очень усердно работают, чтобы сделать это так просто. ;-) - person Joshua Ulrich; 01.12.2010
comment
Есть ли настройка/опция, которую мне нужно установить, чтобы избежать транспонирования и преобразования в zoo? - person Richard Herron; 01.12.2010
comment
@richardh apply.weekly вернет любой переданный ему класс временных рядов (timeSeries, zoo, its и т. д.). Я включил команду для загрузки более новой версии xts с R-forge. - person Joshua Ulrich; 01.12.2010
comment
Понятно! Спасибо за образование. И утешение: смущение от этого только усиливается... Буду учиться и постараюсь отплатить! Спасибо! - person Richard Herron; 01.12.2010