将大型 XTS 对象转换为数组以计算特征值和特征向量

Convert large XTS object to array to calculate Eignevalues and Eigenvectors

我有一个大的 XTS 对象,它是使用滑动 window 跨 1343 个数据点的 12 x 12 变量的 XTS ZOO 对象进行相关计算的结果。

我的大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

如果我错了请纠正我,但我相信 R 中的 eigen() 函数需要一个方阵来计算矩阵 lambda 1,2 和 3 的特征值?

如何对上面的 xts 对象求平方以找到每个矩阵随时间变化的特征值和向量?

我猜我会在上面的 XTS 对象中为每个时间段 (1-4) 建立一个矩阵,矩阵应该通过取前 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 对象的特征值所需的步骤。

理想情况下,每个矩阵的特征值将存储在数据框或矩阵中,在上述情况下,我将有一个数据框,其中包含 3 个变量的 12 个观测值或 3 x 4 的矩阵。

任何人都可以告诉我我是否以错误的方式进行此操作以及 eigen() 是否可以采用当前形式的 XTS 对象并计算特征值?

dput

出于演示目的,我只return使用最大的特征值集,但您可以将代码修改为return任何您需要的内容。

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