David L Carlson
2015-Dec-09 19:01 UTC
[R] applying wilcox.test to every combination of rows in a matrix (pairwise)
The error message suggests that you have more than TRUE and FALSE in your logical matrix. What does str(p) show you? Could you have missing values? David C -----Original Message----- From: debra ragland [mailto:ragland.debra at yahoo.com] Sent: Wednesday, December 9, 2015 11:47 AM To: David L Carlson Subject: Re: [R] applying wilcox.test to every combination of rows in a matrix (pairwise) Hi David, Thank you so much for your input. As with the other suggestions I've gotten, I keep getting errors. In reality, the logical matrix has 15 col and 99 rows. Using your suggestion I get the errors Error in wilcox.test.formula(pc1.eigv ~ p[i, ]) : grouping factor must have exactly 2 levels AND Error in wilcox.test.formula(vals ~ tf[i, ]) : grouping factor must have exactly 2 levels On Wednesday, December 9, 2015 12:28 PM, David L Carlson <dcarlson at tamu.edu> wrote: If I understand correctly, this should do what you want, but there will be warnings for each test about p-values not being exact because you reuse the pc1.eigv vector for each row so that each value occurs twice: First we can simplify the original comparisons by using the formula mode for wilcox.test:> 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)> set.seed(42) > pc1.eigv<-runif(4, 1.0, 2.0) > n.iteration=dim(as.matrix(p))[1] > n.test <- sapply(seq_len(n.iteration), function(i)+ wilcox.test(pc1.eigv~p[i,])$p.value)> n.test[1] 1.0000000 0.6666667 0.6666667 1.0000000 0.6666667 0.6666667 [7] 1.0000000 0.6666667 0.6666667 Then we generate the row combinations:> rows <- expand.grid(i=1:9, j=1:9) # All 81 row combinations > rows <- rows[rows$j < rows$i, ] # Just the 36 distinct combinations > vals <- rep(pc1.eigv, 2) # Double the pc1.eigv vector > tf <- cbind(p[rows[, 1] ,], p[rows[, 2], ]) # Create the combined row vector > vals # The same values for all comparisons[1] 1.914806 1.937075 1.286140 1.830448 1.914806 1.937075 1.286140 [8] 1.830448> tf[1:2, ] # First row combines rows 2 and 1, second 3 and 1, etc[1] TRUE FALSE TRUE FALSE FALSE TRUE TRUE FALSE [2,] FALSE TRUE FALSE TRUE FALSE TRUE TRUE FALSE> n.iteration <- dim(tf)[1] > n.test2 <- sapply(seq_len(n.iteration), function(i)+ wilcox.test(vals~tf[i,])$p.value) There were 36 warnings (use warnings() to see them)> n.test2[1] 0.6572552 0.6572552 1.0000000 0.6572552 0.6572552 1.0000000 [7] 0.6572552 0.6572552 1.0000000 0.6572552 0.3005223 1.0000000 [13] 0.6572552 0.3005223 1.0000000 0.6572552 1.0000000 0.3005223 [19] 0.6572552 1.0000000 0.3005223 0.6572552 0.6572552 1.0000000 [25] 0.6572552 0.6572552 1.0000000 0.6572552 0.3005223 1.0000000 [31] 0.6572552 1.0000000 0.3005223 0.6572552 0.6572552 1.0000000 ------------------------------------- David L Carlson Department of Anthropology Texas A&M University College Station, TX 77840-4352 -----Original Message----- From: R-help [mailto:r-help-bounces at r-project.org] On Behalf Of debra ragland via R-help Sent: Wednesday, December 9, 2015 10:00 AM To: R-help Subject: Re: [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? ______________________________________________ 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.