[R] Randomising matrices
Stéphane Dray
dray at biomserv.univ-lyon1.fr
Fri Apr 27 14:14:53 CEST 2007
Your solution is not suitable for quite large matrices.
There are several papers on the subject :
e.g. :
@ARTICLE{SD751,
author = {Gotelli, N.J. and Entsminger, G.L.},
title = {Swap and fill algorithms in null model analysis:rethinking
the knight's
tour},
journal = {Oecologia},
year = {2001},
volume = {129},
pages = {281-291},
endnotereftype = {Journal Article},
keywords = {null model},
pdf = {/home/stephane/Biblio/Articles/SD751.pdf},
shorttitle = {Swap and fill algorithms in null model
analysis:rethinking the knight's
tour}
}
There are different algorithms to solve the question but I am really not
sure that they are implemented in R.
Sincerely,
Finny Kuruvilla wrote:
> Hi Nick,
>
> This way isn't the most elegant but works well, especially if the
> matrices aren't too large:
>
> # This function works on 2x2 arrays, randomizing them, but
> # preserving row and column totals
> shuffle_matrix <- function(x) {
> nrow = dim(x)[1]
> ncol = dim(x)[2]
> rmargins <- apply(x,1,sum)
> cmargins <- apply(x,2,sum)
>
> while(1) {
> shuffled <- array(sample(x,length(x),replace=TRUE),dim=c(nrow,ncol))
> if(all(apply(shuffled,1,sum) == rmargins)) {
> if(all(apply(shuffled,2,sum) == cmargins)) {
> break
> }
> }
> }
> shuffled
> }
>
> Example:
>
>
>> a=array(sample(c(0,1),10,replace=TRUE),dim=c(5,2))
>> a
>>
> [,1] [,2]
> [1,] 0 1
> [2,] 1 1
> [3,] 0 1
> [4,] 0 1
> [5,] 1 0
>
>> shuffle_matrix(a)
>>
> [,1] [,2]
> [1,] 0 1
> [2,] 1 1
> [3,] 1 0
> [4,] 0 1
> [5,] 0 1
>
> Best,
> Finny Kuruvilla
>
> *****************************************************************
> Finny Kuruvilla, MD, PhD
> Harvard Medical School Fellowship Program in Transfusion Medicine
> Broad Institute of MIT and Harvard
> Homepage: http://www.people.fas.harvard.edu/~kuruvill/home/
>
>
> On Fri, 27 Apr 2007, Nick Cutler wrote:
>
>
>> I would like to be able to randomise presence-absence (i.e. binary)
>> matrices whilst keeping both the row and column totals constant. Is
>> there a function in R that would allow me to do this?
>>
>> I'm working with vegetation presence-absence matrices based on field
>> observations. The matrices are formatted to have sites as rows and
>> species as columns. The presence of a species on a site is indicated
>> with a 1 (absence is obviously indicated with a 0).
>>
>> I would like to randomise the matrices many times in order to construct
>> null models. However, I cannot identify a function in R to do this, and
>> the programming looks tricky for someone of my limited skills.
>>
>> Can anybody help me out?
>>
>> Many thanks,
>>
>> Nick Cutler
>>
>> Institute of Geography
>> School of Geosciences
>> University of Edinburgh
>> Drummond Street
>> Edinburgh EH8 9XP
>> United Kingdom
>>
>> Tel: 0131 650 2532
>> Web: http://www.geos.ed.ac.uk/homes/s0455078
>>
>> ______________________________________________
>> R-help at stat.math.ethz.ch 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.
>>
>>
>
> ______________________________________________
> R-help at stat.math.ethz.ch 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.
>
>
>
--
Stéphane DRAY (dray at biomserv.univ-lyon1.fr )
Laboratoire BBE-CNRS-UMR-5558, Univ. C. Bernard - Lyon I
43, Bd du 11 Novembre 1918, 69622 Villeurbanne Cedex, France
Tel: 33 4 72 43 27 57 Fax: 33 4 72 43 13 88
http://biomserv.univ-lyon1.fr/~dray/
More information about the R-help
mailing list