compute variance of every column in a matrix without a loop
Francisco J Molina <FJMolina at lbl.gov> wrote:
Is it possible to compute the variance of every column in a matrix without a loop?
1) apply(m, 2, var) (as several people said - simple, but not optimally fast) 2) colVars(m) from package "colSums", available at: <http://cran.r-project.org/src/contrib/Devel/colSums_1.1.tar.gz> 3) In 1.5.0, I believe colSums and colMeans will be available (as fast C routines). I don't know if Brian D. Ripley plans to include colVars too, but if not the definition is simple enough: ------------------------------------------------------------------------------- colVars <- function(x, na.rm=FALSE, dims=1, unbiased=TRUE, SumSquares=FALSE, twopass=FALSE) { if (SumSquares) return(colSums(x^2, na.rm, dims)) N <- colSums(!is.na(x), FALSE, dims) Nm1 <- if (unbiased) N-1 else N if (twopass) {x <- if (dims==length(dim(x))) x - mean(x, na.rm=na.rm) else sweep(x, (dims+1):length(dim(x)), colMeans(x,na.rm,dims))} (colSums(x^2, na.rm, dims) - colSums(x, na.rm, dims)^2/N) / Nm1 } ------------------------------------------------------------------------------- With twopass=TRUE, this should act very much like the S-Plus function by the same name. (twopass=TRUE is needed for numerical accuracy if mu >> sigma.) For a matrix (as opposed to a >2-dimensional array), with unbiased=FALSE, you'd get the same result as Thomas Lumley's suggestion: R> colMeans(m*m)-colMeans(m)^2 However, this is *not* the same as apply(m, 2, var) because (sample) variances are normally calculated with unbiased=TRUE (i.e. with N-1 in the denominator). IF you have no NA's, then I'd modify Thomas's suggestion slightly: R> N <- nrow(m) R> N/(N-1) * (colMeans(m*m)-colMeans(m)^2)
-- David Brahm (brahm at alum.mit.edu) -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.- r-help mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html Send "info", "help", or "[un]subscribe" (in the "body", not the subject !) To: r-help-request at stat.math.ethz.ch _._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._