[R] translate grouped data to their centroid

Michael Friendly friendly at yorku.ca
Wed Jan 2 15:37:49 CET 2013


On 1/1/2013 3:43 PM, Prof Brian Ripley wrote:
> On 01/01/2013 19:50, Michael Friendly wrote:
>> Given a data set with a group factor, I want to translate the numeric
>> variables to their
>> centroid, by subtracting out the group means (adding back the grand
>> means).
>>
...
>
> Yes.  It is part of the calculation of within-group covariances in LDA,
> so (from MASS:::lda.default)
>
>      group.means <- tapply(x, list(rep(g, p), col(x)), mean)
>      x - group.means[g, ]
>
> shows the idiom.

thanks for this, Brian-- just the idiom I was looking for.  However, I
want the result to be centered at the grand means, so:

pool <- function(x, groups){
   x <- as.matrix(x)
   p <- ncol(x)
   n <- nrow(x)
   g <- as.factor(groups)
   group.means <- tapply(x, list(rep(g, p), col(x)), mean)
   grand.mean <- colMeans(x)
   x - group.means[g, ] + outer(rep(1,n), grand.mean)
}

pooled <- data.frame(pool(iris[,1:4], iris[,5]))
pooled$Species <- iris$Species



-- 
Michael Friendly     Email: friendly AT yorku DOT ca
Professor, Psychology Dept. & Chair, Quantitative Methods
York University      Voice: 416 736-2100 x66249 Fax: 416 736-5814
4700 Keele Street    Web:   http://www.datavis.ca
Toronto, ONT  M3J 1P3 CANADA




More information about the R-help mailing list