# Re: [R] Help with Mahalanobis

From: Christian Hennig <chrish_at_stats.ucl.ac.uk>
Date: Sat 09 Jul 2005 - 04:14:03 EST

Dear Jose,

normal mixture clustering (mclust) operates on points times variables data and not on a distance matrix. Therefore
it doesn't make sense to compute Mahalanobis distances before using mclust.
Furthermore, cluster analysis based on distance matrices (hclust or pam, say) operates on a point by point distance matrix (be it Mahalanobis or something else). You show a group by group matrix below, for which I don't see any purpose in cluster analysis.
Have you looked at function mahalanobis?

Christian

On Fri, 8 Jul 2005, Jose Claudio Faria wrote:

> Dear R list,
>
> I'm trying to calculate Mahalanobis distances for 'Species' of 'iris' data
> as obtained below:
>
> Squared Distance to Species From Species:
>
> Setosa Versicolor Virginica
> Setosa 0 89.86419 179.38471
> Versicolor 89.86419 0 17.20107
> Virginica 179.38471 17.20107 0
>
> These distances were obtained with proc 'CANDISC' of SAS, please,
> see Output 21.1.2: Iris Data: Squared Mahalanobis Distances from
> http://www.id.unizh.ch/software/unix/statmath/sas/sasdoc/stat/chap21/sect19.htm
>
> From these distances my intention is to make a cluster analysis as below, using
> the package 'mclust':
>
> In prior mail, my basic question was: how to obtain this matrix with R
> from 'iris' data?
>
> Well, I think that the basic soluction to calculate this distances is:
>
> #
> # --- Begin R script 1 ---
> #
> x = as.matrix(iris[,1:4])
> tra = iris[,5]
>
> man = manova(x ~ tra)
>
> # Mahalanobis
> E = summary(man)\$SS[2] #Matrix E
> S = as.matrix(E\$Residuals)/man\$df.residual
> InvS = solve(S)
> ms = matrix(unlist(by(x, tra, mean)), byrow=T, ncol=ncol(x))
> colnames(ms) = names(iris[1:4])
> rownames(ms) = c('Set', 'Ver', 'Vir')
> D2.12 = (ms[1,] - ms[2,])%*%InvS%*%(ms[1,] - ms[2,])
> print(D2.12)
> D2.13 = (ms[1,] - ms[3,])%*%InvS%*%(ms[1,] - ms[3,])
> print(D2.13)
> D2.23 = (ms[2,] - ms[3,])%*%InvS%*%(ms[2,] - ms[3,])
> print(D2.23)
> #
> # --- End R script 1 ---
> #
>
> Well, I would like to generalize a soluction to obtain
> the matrices like 'Mah' (below) or a complete matrix like in the
> Output 21.1.2. Somebody could help me?
>
> #
> # --- Begin R script 2 ---
> #
>
> Mah = c( 0,
> 89.86419, 0,
> 179.38471, 17.20107, 0)
>
> n = 3
> D = matrix(0, n, n)
>
> nam = c('Set', 'Ver', 'Vir')
> rownames(D) = nam
> colnames(D) = nam
>
> k = 0
> for (i in 1:n) {
> for (j in 1:i) {
> k = k+1
> D[i,j] = Mah[k]
> D[j,i] = Mah[k]
> }
> }
>
> D=sqrt(D) #D2 -> D
>
> library(mclust)
> dendroS = hclust(as.dist(D), method='single')
> dendroC = hclust(as.dist(D), method='complete')
>
> win.graph(w = 3.5, h = 6)
> split.screen(c(2, 1))
> screen(1)
> plot(dendroS, main='Single', sub='', xlab='', ylab='', col='blue')
>
> screen(2)
> plot(dendroC, main='Complete', sub='', xlab='', col='red')
> #
> # --- End R script 2 ---
> #
>
> I always need of this type of analysis and I'm not founding how to make it in
> the CRAN documentation (Archives, packages: mclust, cluster, fpc and mva).
>
> Regards,
> --
> Jose Claudio Faria
> Brasil/Bahia/UESC/DCET
> mails:
> joseclaudio.faria@terra.com.br
>
> ______________________________________________
> R-help@stat.math.ethz.ch mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help