0
votes

I want to calculate correlation statistics using cor.test(). I have a data matrix where the two pairs to be tested are on consecutive lines (I have more than thousand pairs so I need to correct for that also later). I was thinking that I could loop through every two and two lines in the matrix and perform the test (i.e. first test correlation between row1 and row2, then row3 and row4, row5 and row6 etc.), but I don't know how to make this kind of loop.

This is how I do the test on a single pair:

d = read.table(file="cor-test-sample-data.txt", header=T, sep="\t", row.names = 1)
d = as.matrix(d)
cor.test(d[1,], d[2,], method = "spearman")
3
Does it means that you want cor.test for row1 and row2, then row2 and row3 etc. or row1 and row2, row3, and row4 etc.? - akrun
The last one, row1&2, then row3&4 etc. I updated the question also, thanks. - Jon

3 Answers

2
votes

You could try

 res <-  lapply(split(seq_len(nrow(mat1)),(seq_len(nrow(mat1))-1)%/%2 +1),
               function(i){m1 <-  mat1[i,]
                if(NROW(m1)==2){ 
                 cor.test(m1[1,], m1[2,], method="spearman")
                  }
                else NA 
         })

To get the p-values

 resP <- sapply(res, function(x) x$p.value)
 indx <- t(`dim<-`(seq_len(nrow(mat1)), c(2, nrow(mat1)/2)))
 names(resP) <- paste(indx[,1], indx[,2], sep="_")
 resP  
 #       1_2        3_4        5_6        7_8       9_10      11_12      13_14 
 #0.89726818 0.45191660 0.14106085 0.82532260 0.54262680 0.25384239 0.89726815 
 #     15_16      17_18      19_20      21_22      23_24      25_26      27_28 
 #0.02270217 0.16840791 0.45563229 0.28533447 0.53088721 0.23453161 0.79235990 
 #    29_30      31_32 
 #0.01345768 0.01611903 

Or using mapply (assuming that the rows are even)

  ind <- seq(1, nrow(mat1), by=2) #similar to the one used by @CathG in for loop
  mapply(function(i,j) cor.test(mat1[i,], mat1[j,],
                method='spearman')$p.value , ind, ind+1) 

data

set.seed(25)
mat1 <- matrix(sample(0:100, 20*32, replace=TRUE), ncol=20)    
1
votes

Try

d = matrix(rep(1:9, 3), ncol=3, byrow = T)
sapply(2*(1:(nrow(d)/2)), function(pair) unname(cor.test(d[pair-1,], d[pair,], method="spearman")$estimate))
1
votes
pvalues<-c()    

for (i in seq(1,nrow(d),by=2)) {
        pvalues<-c(pvalues,cor.test(d[i,],d[i+1,],method="spearman")$p.value)
}

names(pvalues)<-paste(row.names(d)[seq(1,nrow(d),by=2)],row.names(d)[seq(2,nrow(d),by=2)],sep="_")