Reputation: 2877
I have a large XTS object which is the result of a correlation calculation using a sliding window across an XTS ZOO object of 12 x 12 variables for 1343 data points in time.
My large XTS object is structured as follows, rows represent time and columns represent the correlation combinations. A simplified example is shown below:
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
Correct me if I'm wrong but I believe the eigen()
function in R requires a square matrix to calculate the eigenvalues of the matrix lambda 1,2 and 3?
How can I square the xts object above to find the eigenvalues and vectors with each matrix across time?
I'm guessing I'll have a matrix for each time period (1-4) in the XTS object above and the matrix should be constructed by taking the first 3 values (1 .1 -.4) and putting them into the first column, again the next three values (.1 1 .3) and this goes into the second column and finally the last three values of row one (-.4 .3 1) go into the last column to make up the 3 x 3 matrix which is shown below:
matrix for t1
A B C
A 1 .1 -.4
B .1 1 .3
C -.4 .3 1
Maybe the transformation from the XTS object is not required to calculate the eigenvalues but if I step through it in my head these are the steps required to calculate the eigenvalues for my XTS object.
Ideally the eigenvalues from each matrix would then be stored in a dataframe or matrix, in the case above I would have a dataframe of 12 observations of 3 variables or a matrix of 3 x 4.
Can anyone tell me if I'm going about this the wrong way and whether eigen()
can take the XTS object in it's current form and calculate the eigenvalues?
Upvotes: 2
Views: 276
Reputation: 25638
For demonstration purposes, I'm only returning the greatest of the eigenvalues set, but you can modify the code to return anything you need.
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
Upvotes: 2