Преобразование большого объекта XTS в массив для вычисления собственных значений и собственных векторов

У меня есть большой объект XTS, который является результатом расчета корреляции с использованием скользящего окна в объекте XTS ZOO из 12 x 12 переменных для 1343 точек данных во времени.

Мой большой объект XTS структурирован следующим образом: строки представляют время, а столбцы представляют комбинации корреляций. Упрощенный пример показан ниже:

    AA  BA  CA   AB  BB  CB   AC  BC  CC
t1  1   .1  -.4  .1  1   .3  -.4  .3   1
t2  1   .4  .8   .4  1   .2   .8  .2   1
t3  1   .5  .5   .5  1   .3   .5  .3   1
t4  1   .6  .1   .6  1   .7   .1  .7  .1

Поправьте меня, если я ошибаюсь, но я считаю, что функция eigen() в R требует квадратной матрицы для вычисления собственных значений матрицы лямбда 1,2 и 3?

Как я могу возвести в квадрат объект xts выше, чтобы найти собственные значения и векторы с каждой матрицей во времени?

Я предполагаю, что у меня будет матрица для каждого периода времени (1-4) в объекте XTS выше, и матрица должна быть построена, взяв первые 3 значения (1.1-.4) и поместив их в первый столбец, снова следующие три значения (.1 1 .3), и это идет во второй столбец, и, наконец, последние три значения строки один (-.4 .3 1) идут в последний столбец, чтобы составить 3 x 3 матрица, показанная ниже:

матрица для t1

   A   B   C
A   1 .1 -.4
B  .1  1  .3
C -.4 .3   1

Возможно, преобразование из объекта XTS не требуется для вычисления собственных значений, но если я пройдусь по нему в уме, это будут шаги, необходимые для вычисления собственных значений для моего объекта XTS.

В идеале собственные значения из каждой матрицы затем будут храниться в фрейме данных или матрице, в приведенном выше случае у меня будет фрейм данных из 12 наблюдений за 3 переменными или матрица 3 x 4.

Может ли кто-нибудь сказать мне, если я делаю это неправильно, и может ли eigen() взять объект XTS в его текущей форме и вычислить собственные значения?

dput


person TheGoat    schedule 10.03.2017    source источник


Ответы (1)


В демонстрационных целях я возвращаю только наибольшее из множества собственных значений, но вы можете изменить код, чтобы он возвращал все, что вам нужно.

library(xts)
dfx <- structure(c(1, 1, 1, 1, 0.1, 0.4, 0.5, 0.6, -0.4, 0.8, 0.5, 0.1, 
0.1, 0.4, 0.5, 0.6, 1, 1, 1, 1, 0.3, 0.2, 0.3, 0.7, -0.4, 0.8, 
0.5, 0.1, 0.3, 0.2, 0.3, 0.7, 1, 1, 1, 1), .Dim = c(4L, 9L), .Dimnames = list(
    NULL, c("AA", "BA", "CA", "AB", "BB", "CB", "AC", "BC", "CC"
    )), index = structure(c(1167685200, 1167771600, 1167858000, 
1167944400), tzone = "", tclass = c("POSIXct", "POSIXt")), .indexCLASS = c("POSIXct", 
"POSIXt"), tclass = c("POSIXct", "POSIXt"), .indexTZ = "", tzone = "", class = c("xts", 
"zoo"))

apply.daily(dfx, function(x) eigen(matrix(x, nrow = sqrt(length(x))))$values[1])
#               [,1]
#2007-01-02 1.455287
#2007-01-03 1.984869
#2007-01-04 1.872842
#2007-01-05 1.972804
person tonytonov    schedule 10.03.2017
comment
большое спасибо за быстрый ответ, очень признателен. Из справки в R я вижу, что существует ряд функций применения для разных периодов времени, т. е. еженедельно, ежедневно, ежемесячно и т. д., но мои данные на самом деле представляют собой 15-минутные данные, есть ли другая функция, которая может обрабатывать такую ​​степень детализации? Кстати, я изменил значения [1] на значения [1:12], чтобы вернуть нужные мне 12 собственных значений. - person TheGoat; 10.03.2017
comment
@PigWolf Вместо этого вы можете указать произвольные периоды, используя period.apply. Или используйте базу apply(dfx, 1, ...), а затем конвертируйте обратно в xts. - person tonytonov; 10.03.2017
comment
Большое спасибо, я немного застрял в разделе количества строк в матрице. Если я интерпретирую это неправильно, пожалуйста, дайте мне знать. Слева направо для каждого дневного значения dfx вы применяете функцию x, которая вычисляет собственные значения матрицы с nrows = 6, поскольку длина x или dfx равна 36 (4*9). Хотя, когда я запускаю ваш код на dfx, есть только 4 строки данных, поэтому я запутался в настройке матрицы. Кстати, мои данные имеют 144 столбца и 1343 строки, поэтому sqrt у меня не работает. Я также добавил dput к исходному сообщению, так как это трудно передать. - person TheGoat; 10.03.2017
comment
@PigWolf Нет - я делаю то, что вы описываете в посте: берете всю строку (9 значений), составляете матрицу (sqrt (9) - размер 3x3), запускаете на ней eigen, повторяете эту процедуру каждый день. Если у вас 144 столбца, корматрицы имеют размер 12x12, поэтому тот же код должен работать нормально. - person tonytonov; 10.03.2017
comment
У меня была куча значений NA в начале моего объекта xts, которые я удалил с помощью na,rm(). Я также немного изменил его, так как не мог заставить работать length(x), так как длина dfx равна 36. Я использую eigen <- apply(slidingCornoNA, 1, function(x) eigen(matrix(x, nrow = sqrt(ncol(slidingCornoNA))))$values[1:12]) . Спасибо за вашу помощь. - person TheGoat; 10.03.2017