[R] Simper analysis with Morisita-Horn

VG vgagic at gwdg.de
Thu Nov 29 14:38:08 CET 2012


Dear ecology fellows,

I tried to implement Morisita-Horn distance (instead of Bray that is in the
current version)  in the code for the Simper analysis in vegan. I would be
very grateful if someone can check if the code  is right.

function (comm, group, ...) 
{
    if (any(rowSums(comm, na.rm = TRUE) == 0)) 
        warning("you have empty rows: results may be meaningless")
    permutations <- 0
    trace <- FALSE
    comm <- as.matrix(comm)
    comp <- t(combn(unique(as.character(group)), 2))
    outlist <- NULL
    P <- ncol(comm)
    nobs <- nrow(comm)
    if (length(permutations) == 1) {
        perm <- shuffleSet(nobs, permutations, ...)
    }
    else {
        perm <- permutations
    }
    if (ncol(perm) != nobs) 
        stop(gettextf("'permutations' have %d columns, but data have %d
rows", 
            ncol(perm), nobs))
    nperm <- nrow(perm)
    if (nperm > 0) 
        perm.contr <- matrix(nrow = P, ncol = nperm)
    for (i in 1:nrow(comp)) {
        group.a <- comm[group == comp[i, 1], ]
        group.b <- comm[group == comp[i, 2], ]
        n.a <- nrow(group.a)
        n.b <- nrow(group.b)
        contr <- matrix(ncol = P, nrow = n.a * n.b)
        for (j in 1:n.b) {
            for (k in 1:n.a) {

 ########### Morisita-Horn 
               
    aN <- sum(group.a[k, ])
    bN <- sum(group.b[j, ])
    da <- sum(group.a[k, ]^2)/aN^2
    db <- sum(group.b[j, ]^2)/bN^2
    top <- (group.a[k, ] * group.b[j, ])
    contr[(j - 1) * n.a + k, ] <- 2 * top/((da + db) * aN * bN)
#############
            }
        }
        average <- colMeans(contr)
        if (nperm > 0) {
            if (trace) 
                cat("Permuting", paste(comp[i, 1], comp[i, 2], 
                  sep = "_"), "\n")
            contrp <- matrix(ncol = P, nrow = n.a * n.b)
            for (p in 1:nperm) {
                groupp <- group[perm[p, ]]
                ga <- comm[groupp == comp[i, 1], ]
                gb <- comm[groupp == comp[i, 2], ]
                for (j in 1:n.b) {
                  for (k in 1:n.a) {
 
 ########### Morisita-Horn 

    aNp <- sum(gpa[k, ])
    bNp <- sum(gpb[j, ])
    dap <- sum(gpa[k, ]^2)/aNp^2
    dbp <- sum(gpb[j, ]^2)/bNp^2
    topp <- (gpa[k, ] * gpb[j, ])
    contrp[(j - 1) * n.a + k, ] <- 2 * topp/((dap + dbp) * aNp * bNp)
#############
                  }
                }
                perm.contr[, p] <- colMeans(contrp)
            }
            p <- (apply(apply(perm.contr, 2, function(x) x >= 
                average), 1, sum) + 1)/(nperm + 1)
        }
        else {
            p <- NULL
        }
        overall <- sum(average)
        sdi <- apply(contr, 2, sd)
        ratio <- average/sdi
        ava <- colMeans(group.a)
        avb <- colMeans(group.b)
        ord <- order(average, decreasing = TRUE)
        cusum <- cumsum(average[ord]/overall)
        out <- list(species = colnames(comm), average = average, 
            overall = overall, sd = sdi, ratio = ratio, ava = ava, 
            avb = avb, ord = ord, cusum = cusum, p = p)
        outlist[[paste(comp[i, 1], "_", comp[i, 2], sep = "")]] <- out
    }
    attr(outlist, "permutations") <- nperm
    class(outlist) <- "simper"
    outlist
}




--
View this message in context: http://r.789695.n4.nabble.com/Simper-analysis-with-Morisita-Horn-tp4651283.html
Sent from the R help mailing list archive at Nabble.com.



More information about the R-help mailing list