[R] help for a loop procedure

Petr Savicky savicky at praha1.ff.cuni.cz
Fri Jan 28 11:19:09 CET 2011


On Thu, Jan 27, 2011 at 05:30:15PM +0100, Petr Savicky wrote:
> On Thu, Jan 27, 2011 at 11:30:37AM +0100, Serena Corezzola wrote:
> > Hello everybody!
> > 
> > 
> > 
> > I?m trying to define the optimal number of surveys to detect the highest
> > number of species within a monitoring season/session.
> > 

[...]

> This can be partially automatized as follows
> 
>   UM <- as.matrix(U)
>   A <- rbind(
>   c(1, 0, 0),
>   c(0, 1, 0),
>   c(0, 0, 1),
>   c(1, 1, 0),
>   c(1, 0, 1),
>   c(0, 1, 1),
>   c(1, 1, 1))
>   rownam <- rep("U", times=nrow(A))
>   for (i in 1:3) {
>   	rownam[A[, i] == 1] <- paste(rownam[A[, i] == 1], i, sep="")
>   }
>   dimnames(A) <- list(rownam, NULL)
>   C <- A %*% UM
>   C
> 
>        Aadi Aagl Apap Aage Bdia Beup Crub Carc Cpam
>   U1      0    0    0    0    7    0    5    0    1
>   U2      0    0    0    0    4    2    1    0    0
>   U3      0    0    0    0    0    0    0    0   14
>   U12     0    0    0    0   11    2    6    0    1
>   U13     0    0    0    0    7    0    5    0   15
>   U23     0    0    0    0    4    2    1    0   14
>   U123    0    0    0    0   11    2    6    0   15
> 
>   rowSums(C != 0)
> 
>     U1   U2   U3  U12  U13  U23 U123 
>      3    3    1    4    3    4    4 
> 
> Now I need to do this with 10 and 32 sample events??.: (

Hello.

In a previous email, i suggested the code above. However, it may 
be used only for a fixed matrix U. For testing the procedure for
a larger matrix U, matrix A should be generated differently. For a
fixed k, A should have choose(nrow(U), k) rows, nrow(U) columns and
its rows should be all 0,1-vectors with k ones. The following code
may be used, although better ways of computing A probably exist.

  n <- nrow(U)
  k <- 2
  cmb <- combn(n, k)
  A <- matrix(0, nrow=ncol(cmb), ncol=n)
  ind <- cbind(1:nrow(A), 0L)
  for (i in seq.int(length=k)) {
      ind[, 2] <- cmb[i, ]
      A[ind] <- 1
  }
  A

       [,1] [,2] [,3]
  [1,]    1    1    0
  [2,]    1    0    1
  [3,]    0    1    1

  C <- A %*% as.matrix(U)
  rowSums(C != 0)

  [1] 4 3 4

This output corresponds to U12, U13, U23.

If n = 32, then the above may be used for computing the required
counts exactly for a few small values of k. For k up to 10, an
approximation may be more suitable. For example, simulation may
be used, where random subsets are generated using sample(n, k).

Petr Savicky.



More information about the R-help mailing list