2017-03-10 37 views
3

我有一个较大的XTS对象,它是在1343个数据点中使用横跨12 x 12变量的XTS ZOO对象的滑动窗口进行相关性计算的结果。将大型XTS对象转换为数组以计算Eignevalues和特征向量

我的大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()函数需要一个方阵计算矩阵拉姆达1,2和3的特征值?

我怎样才能平方上面的xts对象找到每个矩阵的特征值和向量跨时间?

我猜我会在上面的XTS对象中的每个时间段(1-4)都有一个矩阵,矩阵应该通过取前三个值(1.1.4)并将他们进入第一列,再接下来的三个值(.1 1 .3),然后进入第二列,最后一列(-.4.31)的最后三个值进入最后一列以弥补不需要计算本征值

矩阵T1

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

也许从XTS对象转变,但如果我通过在步骤:其中示出下面的3×3矩阵我的头这些是计算我的XTS对象的特征值所需的步骤。

在理想情况下,从每个矩阵的特征值将被存储在一个数据帧或基质,在上述情况下我将具有3个变量的12个观测一个数据帧或矩阵3×4

谁能告诉如果我以这种错误的方式进行讨论,并且eigen()是否可以将XTS对象作为当前形式并计算特征值?

dput

回答

2

出于演示的目的,我只返回的最大特征值集,但你可以修改代码,返回任何你所需要的。

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 
+0

非常感谢您的快速回复,非常感谢。我从R的帮助中看到,对于不同的时间段,例如每周,每天,每月等,有许多应用函数,但我的数据实际上是15分钟的数据,是否有另一个函数可以处理这种粒度?顺便说一下,我将值[1]更改为值[1:12],以返回我需要的12个特征值。 – TheGoat

+1

@PigWolf您可以使用'period.apply'指定任意的时间段。或者使用base [apply(dfx,1,...)',然后转换回xts。 – tonytonov

+0

非常感谢,我在矩阵的行数部分卡住了一点。如果我错误地解释了这个,请让我知道。从左到右,对于dfx的每个日常值,由于x或dfx的长度为36(4 * 9),因此可以应用函数x计算nrows = 6的矩阵的特征值。虽然当我在dfx上运行你的代码时,只有4行数据,所以我对matix的设置感到困惑。顺便说一句,我的数据有144列和1343行,所以sqrt不适合我。我还添加了原始帖子,因为这很难传达。 – TheGoat

相关问题