debra ragland
2015-Dec-09 12:49 UTC
[R] applying wilcox.test to every combination of rows in a matrix (pairwise)
Hello All, I have written the following loop which will apply/split the same vector of numbers (pc1.eigv) to each (logical) row of a matrix and run a wilcox.test on those values that line up with TRUE and those that line up with FALSE. It works fine. However, I am now interested in using the same vector and (logical)matrix run the wilcox.test only this time I would like information about pairs of rows (not just single rows as it already does). The loop: n.iteration=dim(as.matrix(p))[1] n.test= rep(NA, n.iteration ) for( i in 1:n.iteration ){ ## i=1 i_spl<-split(pc1.eigv, p[i,]) if( sum(p[i,])==15 | sum(p[i,])==0) { n.test[i]=NA } if( sum(p[i,])!=15 & sum(p[i,])!=0) { testout=wilcox.test(i_spl$'TRUE', i_spl$'FALSE') n.test[i]=testout$p.value } } some sample data p<-matrix(c(rep(c(F,T,F),3), rep(c(T,F,T),3), rep(c(T,T,F),3), rep(c(F,F,T),3))) pc1.eigv<-runif(4, 1.0, 2.0) After some searching I thought that perhaps the combn function would help me (i.e. combn(p)) for the same loop but I get an error. Can anyone help with this?
Ulrik Stervbo
2015-Dec-09 13:17 UTC
[R] applying wilcox.test to every combination of rows in a matrix (pairwise)
Could you use expand.grid and loop over each returned row? Best, Ulrik On Wed, 9 Dec 2015 at 13:55 debra ragland via R-help <r-help at r-project.org> wrote:> Hello All, > > I have written the following loop which will apply/split the same vector > of numbers (pc1.eigv) to each (logical) row of a matrix and run a > wilcox.test on those values that line up with TRUE and those that line up > with FALSE. It works fine. However, I am now interested in using the same > vector and (logical)matrix run the wilcox.test only this time I would like > information about pairs of rows (not just single rows as it already does). > > The loop: > n.iteration=dim(as.matrix(p))[1] > n.test= rep(NA, n.iteration ) > for( i in 1:n.iteration ){ ## i=1 > i_spl<-split(pc1.eigv, p[i,]) > if( sum(p[i,])==15 | sum(p[i,])==0) { n.test[i]=NA } > if( sum(p[i,])!=15 & sum(p[i,])!=0) { > testout=wilcox.test(i_spl$'TRUE', i_spl$'FALSE') > n.test[i]=testout$p.value } > } > > > some sample data > p<-matrix(c(rep(c(F,T,F),3), rep(c(T,F,T),3), rep(c(T,T,F),3), > rep(c(F,F,T),3))) > > pc1.eigv<-runif(4, 1.0, 2.0) > > After some searching I thought that perhaps the combn function would help > me (i.e. combn(p)) for the same loop but I get an error. > > Can anyone help with this? > > ______________________________________________ > R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see > 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. >[[alternative HTML version deleted]]
S Ellison
2015-Dec-09 13:45 UTC
[R] applying wilcox.test to every combination of rows in a matrix (pairwise)
> From: R-help [mailto:r-help-bounces at r-project.org] On Behalf Of debra ragland via R-help > some sample data > p<-matrix(c(rep(c(F,T,F),3), rep(c(T,F,T),3), rep(c(T,T,F),3), rep(c(F,F,T),3)))i) Something wrong with p, here; it's a single column matrix. did you mean p4<-matrix(c(rep(c(F,T,F),3), rep(c(T,F,T),3), rep(c(T,T,F),3), rep(c(F,F,T),3)), ncol=4) ? (I changed the name for later) ii) You don't need split(), just ordinary indexing. For example wilcox.test(pc1.eigv[ p[1,] ], pc1.eigv[ !p[1,] ] )> I am now interested in using the same vector and (logical)matrix run the wilcox.test > only this time I would like information about pairs of rowsii) 'fraid that's not specific enough. How will you select the pairs (what row indexes will you want) and do you intend to test one row in each pair against the other or concatenate the TRUE and FALSE sets from the rows and then test TRUE vs FALSE?> After some searching I thought that perhaps the combn function would help me > (i.e. combn(p)) for the same loop but I get an error.iv) Did you mean rowpairs <- combn(length(p), 2) #or combn(nrow(p), 2) if p is really a matrix ? If you did, that generates a 2 x p matrix so your row pairs would be accessed via rowpairs[, i] v) You don't need a loop either. Consider #Set up a function to do the donkey work on a particular #pair of row indices: rptest <- function(rows, p, pc1) { #Simplify later extraction by extending pc1.eigv: pc2 <- rep(pc1, 2) #extract and concatenates the two rows of the TRUE/PALSE matrix p select <- as.vector( p[rows,] ) #Combine the two in a wilcox test wilcox.test(pc2[ select ], pc2 [ !select ] ) } rowpairs <- combn(nrow(p4), 2) apply(rowpairs, 2, rptest, p=p4, pc1=pc1.eigv) #Returns a list of wilcoxon tests of TRUE vs FALSE on all rows taken ******************************************************************* This email and any attachments are confidential. Any use...{{dropped:8}}
debra ragland
2015-Dec-09 16:00 UTC
[R] applying wilcox.test to every combination of rows in a matrix (pairwise)
Sorry for the repost, but I want to clarify that I am trying to apply the wilcox.test to every pairwise combination of rows i.e. row 1 with row 2, row 1 with row 3, row 1 with row 4 and so on until all row combinations have been achieved. I've made some corrections. On Wednesday, December 9, 2015 7:49 AM, debra ragland <ragland.debra at yahoo.com> wrote: Hello All, I have written the following loop which will apply/split the same vector of numbers (pc1.eigv) to each (logical) row of a matrix and run a wilcox.test on those values that line up with TRUE and those that line up with FALSE. It works fine. However, I am now interested in using the same vector and (logical)matrix run the wilcox.test only this time I would like information about pairs of rows (not just single rows as it already does). The loop: n.iteration=dim(as.matrix(p))[1] n.test= rep(NA, n.iteration ) for( i in 1:n.iteration ){ ## i=1 i_spl<-split(pc1.eigv, p[i,]) if( sum(p[i,])==15 | sum(p[i,])==0) { n.test[i]=NA } if( sum(p[i,])!=15 & sum(p[i,])!=0) { testout=wilcox.test(i_spl$'TRUE', i_spl$'FALSE') n.test[i]=testout$p.value } } some sample data p<-matrix(c(rep(c(F,T,F),3), rep(c(T,F,T),3), rep(c(T,T,F),3), rep(c(F,F,T),3)), ncol=4) pc1.eigv<-runif(4, 1.0, 2.0) After some searching I thought that perhaps the combn function would help me (i.e. combn(nrow(p),2) for the same loop but I get an error. Can anyone help with this?