[R] applying wilcox.test to every combination of rows in a matrix (pairwise)
David L Carlson
dcarlson at tamu.edu
Wed Dec 9 20:01:05 CET 2015
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.
More information about the R-help
mailing list