Bernzweig, Bruce (Consultant)
2007-Jul-24 17:37 UTC
[R] Calculating subsets of row pairs using somthing faster than a for loop.
Hi all, Situation: - I have two matrices each w/ 4 rows and 20 columns. mat1 <- matrix(sample(1:500,80), ncol = 20, dimnames=list(paste("mat1row", 1:4, sep=""), paste("mat1col", 1:20, sep=""))) mat2 <- matrix(sample(501:1000,80), ncol = 20, dimnames=list(paste("mat2row", 1:4, sep=""), paste("mat2col", 1:20, sep=""))) - Each column represents a value in a time series. Q: What do I want: Calculate moving average correlations for each row x row pair: For each row x row pair I want 10 values representing moving average correlations for 10 sets of time-values: cor(mat1[1,1:10], mat2[1,1:10]) cor(mat1[1,2:11], mat2[1,2:11]) ... cor(mat1[1,11:20], mat2[1,11:20]) cor(mat1[1,1:10], mat2[2,1:10]) ... cor(mat1[4,11:20], mat2[4,11:20]) Result would be a 16 (rows) x 10 (col) matrix matMA ma1, ma2, ..., ma10 for (mat1 row1) x (mat2 row1) ma1, ma2, ..., ma10 for (mat1 row1) x (mat2 row2) ... ma1, ma2, ..., ma10 for (mat1 row4) x (mat2 row3) ma1, ma2, ..., ma10 for (mat1 row4) x (mat2 row4) I would like to be able to do this without using a for loop due to the slowness of that method. Is it possible to iterate through subsets w/o using a for loop? Thanks, - Bruce P -------------- next part -------------- ********************************************************************** Please be aware that, notwithstanding the fact that the pers...{{dropped}}
Gabor Grothendieck
2007-Jul-24 20:15 UTC
[R] Calculating subsets of row pairs using somthing faster than a for loop.
I doubt its any faster than using a loop but probably less code is: library(zoo) z1 <- zoo(t(mat1)); z2 <- zoo(t(mat2)) idx <- 1:ncol(z1) out <- rollapply(cbind(z1, z2), 11, by.column = FALSE, FUN = function(x) cor(x[,idx],x[,-idx])) will give you a 10 x 16 multivariate zoo series such that: out[1, ] is c(cor(t(mat1[,1:11]), t(mat2[,1:11]))) out[2, ] is c(cor(t(mat1[,2:12]), t(mat2[,2:12]))) etc. and t(out) is a matrix in the orientation you asked for. Try library(zoo) vignette("zoo") for an intro to zoo. On 7/24/07, Bernzweig, Bruce (Consultant) <bbernzwe at bear.com> wrote:> Hi all, > > > > Situation: > > > > - I have two matrices each w/ 4 rows and 20 columns. > > > > mat1 <- matrix(sample(1:500,80), ncol = 20, > > dimnames=list(paste("mat1row", 1:4, sep=""), > > paste("mat1col", 1:20, sep=""))) > > > > mat2 <- matrix(sample(501:1000,80), ncol = 20, > > dimnames=list(paste("mat2row", 1:4, sep=""), > > paste("mat2col", 1:20, sep=""))) > > > > - Each column represents a value in a time series. > > > > Q: What do I want: > > > > Calculate moving average correlations for each row x row pair: > > > > For each row x row pair I want 10 values representing moving average > > correlations for 10 sets of time-values: > > > > cor(mat1[1,1:10], mat2[1,1:10]) > > cor(mat1[1,2:11], mat2[1,2:11]) > > ... > > cor(mat1[1,11:20], mat2[1,11:20]) > > cor(mat1[1,1:10], mat2[2,1:10]) > > ... > > cor(mat1[4,11:20], mat2[4,11:20]) > > > > Result would be a 16 (rows) x 10 (col) matrix matMA > > > > ma1, ma2, ..., ma10 for (mat1 row1) x (mat2 row1) > > ma1, ma2, ..., ma10 for (mat1 row1) x (mat2 row2) > > ... > > ma1, ma2, ..., ma10 for (mat1 row4) x (mat2 row3) > > ma1, ma2, ..., ma10 for (mat1 row4) x (mat2 row4) > > > > I would like to be able to do this without using a for loop > > due to the slowness of that method. > > > > Is it possible to iterate through subsets w/o using a for loop? > > > > Thanks, > > > > - Bruce > > > > P > > > > > ********************************************************************** > Please be aware that, notwithstanding the fact that the pers...{{dropped}} > > > ______________________________________________ > R-help at stat.math.ethz.ch mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code. > >