Skip to content
Back to formatted view

Raw Message

Message-ID: <50E34E82.2000505@stats.ox.ac.uk>
Date: 2013-01-01T21:00:50Z
From: Brian Ripley
Subject: translate grouped data to their centroid
In-Reply-To: <50E34A64.8030501@stats.ox.ac.uk>

On 01/01/2013 20:43, 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).
>>
>> The following gives what I want, but there must be an easier way using
>> sweep or
>> apply or some such.
>
> 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.

There is also rowsum() (but that postdates that code).
>
>>
>> iris2 <- iris[,c(1,2,5)]
>> means <- colMeans(iris2[,1:2])
>>
>> pooled <- lm(cbind(Sepal.Length, Sepal.Width) ~ Species,
>> data=iris2)$residuals
>> pooled[,1] <- pooled[,1] + means[1]
>> pooled[,2] <- pooled[,2] + means[2]
>> pooled <- as.data.frame(pooled)
>> pooled$Species <- iris2$Species
>>
>
>


-- 
Brian D. Ripley,                  ripley at stats.ox.ac.uk
Professor of Applied Statistics,  http://www.stats.ox.ac.uk/~ripley/
University of Oxford,             Tel:  +44 1865 272861 (self)
1 South Parks Road,                     +44 1865 272866 (PA)
Oxford OX1 3TG, UK                Fax:  +44 1865 272595