[R] Pairwise comparison matrix elements

David Winsemius dwinsemius at comcast.net
Mon Apr 9 23:55:53 CEST 2012


On Apr 9, 2012, at 3:17 PM, Kerapi wrote:

> Hi!,
> I'm really hoping someone out there will be able to help me.
>
> I recently started my MSc dissertation on Population Projection  
> Matrices, which has been going well until now. I am trying to set-up  
> a general script that does a pairwise comparison of all elements in  
> my matrices.
>
> So for example, given that I have the following matrix S:
>
>> S
>
>        [,1]     [,2]         [,3]
>
> [1,] 0.00000 0.007361183 0.0001634936
>
> [2,] 13.88458 0.353988378 0.0000000000
>
> [3,] 0.00000 16.086367098 0.3572819557
>
> I'd like to create a matrix SA for each element in my matrix  
> compared to another element like so:
>
>> SA
>
> S-[1,1]
>
>         [,1]        [,2]        [,3]
>
> [1,] [1,1]-[1,1] [1,2]-[1,1] [1,3]-[1,1]
>
> [2,] [2,1]-[1,1] [2,2]-[1,1] [2,3]-[1,1]
>
> [3,] [3,1]-[1,1] [3,2]-[1,1] [3,3]-[1,1]
>

Try this:

kS <- -1*kronecker(c(S),S, "-")
dim(kS) <- c(3, 3, 3, 3)

The row number is the thrid dimension and the col nimber is the second  
dimension. If you want them to be rearrange to be in the ( r,c) order  
you can use aperm.

 > kSr <- aperm(kS, c(1, 4, 2, 3))

#The zero entires were used because I could easily tell what a correct  
answer should be.
 > kSr[,,3,1]
          [,1]         [,2]         [,3]
[1,]  0.00000  0.007361183 0.0001634936
[2,] 13.88458  0.353988378 0.0000000000
[3,]  0.00000 16.086367098 0.3572819557
 > kSr[,,1,1]
          [,1]         [,2]         [,3]
[1,]  0.00000  0.007361183 0.0001634936
[2,] 13.88458  0.353988378 0.0000000000
[3,]  0.00000 16.086367098 0.3572819557
 > kSr[,,2,3]
          [,1]         [,2]         [,3]
[1,]  0.00000  0.007361183 0.0001634936
[2,] 13.88458  0.353988378 0.0000000000
[3,]  0.00000 16.086367098 0.3572819557

Test a non-zero entry
 > kSr[,,2,2]
            [,1]       [,2]         [,3]
[1,] -0.3539884 -0.3466272 -0.353824884
[2,] 13.5305916  0.0000000 -0.353988378
[3,] -0.3539884 15.7323787  0.003293578
 > S - S[2,2]
            [,1]       [,2]         [,3]
[1,] -0.3539884 -0.3466272 -0.353824884
[2,] 13.5305916  0.0000000 -0.353988378
[3,] -0.3539884 15.7323787  0.003293578

 > sapply(1:3, function(rw) sapply(1:3,
                   function(cl) identical(S-S[rw,cl],  kSr[,,rw,cl] )) )
      [,1] [,2] [,3]
[1,] TRUE TRUE TRUE
[2,] TRUE TRUE TRUE
[3,] TRUE TRUE TRUE

-- 
David.
>
>
> S-[1,2]
>
> [...]
>
>
>
> S-[1,3]
>
> [...]
>
> ... and so on
>
> The aim is to be able to prove existing rules and trends across  
> matrix dimensions.
>
> For example, I've been trying to test whether the first line of  
> values decreases or remains the same from column 1 to the  
> penultimate column: S[1,j] >= S[1,l>j]
>
> The last thing I tried was:
>
> M<-Matlab2R("[0 24.724 1377.48;0.029328 0.26 0;0 0.014 0.78]")
>
> w <- abs(Re(eigen(M)$vectors[,1]))
>
> v <- abs(Re(eigen(t(M))$vectors[,1]))
>
> w <- w/sum(w)
>
> v <- v/(t(v)%*%w)
>
> S <- (v%*%t(w))/as.vector(t(v)%*%w)
>
> S
>
>
>
> n<- length(S)
>
> M.comp <- array(S,dim=c(n,n,n,n))
>
> for (i in 1:n) {
>
> for (j in 1:n) {
>
> for (k in 1:n) {
>
> for (l in 1:n) {
>
> poscompa[1,3,1,j-1] <- S[i,j]<=S[k,l] # if=1, then TRUE and if=0,  
> then FALSE
>
> }}}}
>
> M.comp
>
> sum(poscompa[1,3,1,1:n]) # should give me the value for n. I know  
> this doesn't test it accurately, but first I need to get the loops  
> to work right.
>
> I'm getting an array of errors such as "can't find function poscompa  
> (or compa)", "subscripts out of range" or "type of closure not  
> valid" regardless of what I try. Using COMPAR (poscompa and compa)  
> was the last recommendation I got, but I'm starting to wonder if  
> there might be other ways to go about this. All out-of-the-box ideas  
> I've come up with and tried haven't gotten me much farther. I've now  
> practically exhausted my creative thinking, and I'm becoming very  
> frustrated. I'd really like to get this script going since my  
> current one would make my life hell for large populations (60x60  
> population matrices).
>
> Any ideas on how I could move forward?
>
>
>
> Many, many thanks!
>
> Marta
>
> 	[[alternative HTML version deleted]]
>
> ______________________________________________
> R-help at r-project.org 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.

David Winsemius, MD
West Hartford, CT



More information about the R-help mailing list