MDS classique avec R

En Français : échelles multidimensionnelles, positionnement multidimensionnel

Source : Borg, I., Groenen, P., Modern Multidimensional Scaling : Theory and Applications, Second Edition, Springer, 2005.

Principe de la méthode :

On désigne sous le terme de MDS (multidimensional scaling), un ensemble de techniques permettant de représenter les données d'une matrice de proximités entre objets à l'aide de modèles de distances spatiales. Dans sa version la plus simple, la méthode MDS permet de retrouver une carte bi-dimensionnelle à partir d'un ensemble de distances mutuelles entre lieux.

Le MDS classique est une méthode est fondée sur les travaux de Torgerson (1952, 1958) et Gower. Elle est appelée Classical MDS, AFTD (analyse factorielle sur un tableau de distances), Principal Coordinates Analysis, ou encore Analyse du triple (Benzécri).

Principe mathématique : on calcule les valeurs propres et vecteurs propres d'une matrice calculée à partie de la matrice de proximités, afin de déterminer la "meilleure" projection de l'ensemble d'objets dans un sous-espace de dimension donnée.

Algorithme :

On dispose au départ de la matrice n x n des "distances" mutuelles entre n objets. On souhaite obtenir une représentation de ces n objets dans un espace de dimension m en respectant "au mieux" les distances entre les objets. La dimension m de l'espace n'est pas fixée a priori.

Remarque :

Si la matrice P de départ est une matrice de distances euclidiennes, le MDS classique fournit en résultat les coordonnées des n points, à une rotation près, dans un repère dont l'origine est le centre de gravité des points.

Propriété de minimalité de la solution :

On montre que la solution trouvée minimise la fonction de perte (appelée Strain, littéralement Contrainte, par Carrol et Chang) :

L(X) = || XX' - B ||

où X représente la matrice d'un système de n points (les variables) dans un espace de dimension n et ou la norme utilisée pour la matrice est la norme de Fröbenius, c'est-à-dire la racine carrée de la somme des carrés de tous les coefficients de la matrice. C'est en ce sens que la solution trouvée respecte "au mieux" les proximités entre objets. En particulier, si la matrice de départ est une matrice de distances euclidiennes, on obtient : Strain = 0.

Variante :

On fixe a priori le nombre m de valeurs propres à garder. On conserve alors les m plus grandes valeurs propres où les valeurs propres strictement positives, si ces dernières sont en nombre inférieur à m. Une propriété intéressante du MDS classique est que les dimensions sont emboîtées. Ainsi les deux premières dimensions d'une solution avec m=3 sont les mêmes que celles d'une solution avec m=2. Cette propriété ne se retrouve pas pour le MDS métrique (visant à minimiser le Stress).

La solution trouvée déforme alors "au minimum" les distances entre objets, tout en respectant la contrainte sur la dimension de l'espace des solutions.

Remarque.

Si P est une matrice de distances, le MDS métrique tel qu'il est décrit ici est équivalent à l'ACP avec une métrique M=I, comme on peut s'en rendre compte sur l'exemple "notes d'élèves" (cf exemple 2).

Exemple 1 :

Enoncé :

Source : Handbook of Statistics - Elsevier 2007

On se donne les distances à vol d'oiseau entre 10 villes américaines.
Les données se présentent sous la forme suivante :


Atl Chi Den Hou LA Mia NY SF Sea DC
Atl 0 587 1212 701 1936 604 748 2139 2182 543
Chi 587 0 920 940 1745 1188 713 1858 1737 597
Den 1212 920 0 879 831 1726 1631 949 1021 1494
Hou 701 940 879 0 1374 968 1420 1645 1891 1220
LA 1936 1745 831 1374 0 2339 2451 347 959 2300
Mia 604 1188 1726 968 2339 0 1092 2594 2734 923
NY 748 713 1631 1420 2451 1092 0 2571 2408 205
SF 2139 1858 949 1645 347 2594 2571 0 678 2442
Sea 2182 1737 1021 1891 959 2734 2408 678 0 2329
DC 543 597 1494 1220 2300 923 205 2442 2329 0

Ces données sont enregistrées au format .csv d'Excel dans le fichier : FlyingMileage.csv avec la structure indiquée ci-dessus.

On peut les charger dans R à l'aide de la commande :

> distances <- read.csv2("FlyingMileage.csv")

N.B. read.csv2 permet de lire des données au format "table", avec les spécifications par défaut suivantes : séparateur = ";", séparateur décimal = ",".

Calcul des coordonnées de la représentation

On utilise la commande cmdscale, qui se trouve dans le package MASS.

> library(MASS)

> cmdscale(distances[,2:11])
[,1] [,2]
Atl -718.7594 142.99427
Chi -382.0558 -340.83962
Den 481.6023 -25.28504
Hou -161.4663 572.76991
LA 1203.7380 390.10029
Mia -1133.5271 581.90731
NY -1072.2357 -519.02423
SF 1420.6033 112.58920
Sea 1341.7225 -579.73928
DC -979.6220 -335.47281

Représentation graphique

On voit que l'orientation des axes est à l'opposé des conventions utilisées pour les cartes de géographie.

On prend donc les opposés des coordonnées sur les deux axes :

> Y <- - cmdscale(distances[,2:11])[,2]
> X <- - cmdscale(distances[,2:11])[,1]

On trace ensuite le graphique et les étiquettes des points :

> plot(X,Y,type="p")
> text(X,Y,distances[,1],pos=1,cex=0.8)

Résultat obtenu :

Variantes et compléments :

On peut choisir la dimension de l'espace dans lequel le résultat est recherché.

Pour une solution en dimension 3 :

> cmdscale(distances[,2:11],k=3)

Exemple 2 :

On se donne les notes de 9 sujets dans 5 matières. Les données, après centrage et réduction, sont les suivantes (cf fichier Mini-ACP.csv):

Sujet
Math
Sciences
Francais
Latin
Musique
Jean
-1,0865
-1,2817
-1,5037
-1,6252
-1,019
Aline
-0,4939
-0,613
-0,6399
-0,7223
-0,6794
Annie
-1,0865
-0,9474
0,2239
-0,1806
0
Monique
1,4322
1,5604
1,5197
1,8058
-1,019
Didier
1,284
1,3932
0,5119
0,7223
-0,3397
André
0,3951
0,0557
-1,3597
-1,0835
0,6794
Pierre
-1,2347
-0,9474
1,0878
0,5417
-0,3397
Brigitte
0,9877
0,8916
-0,4959
-0,1806
0,3397
Evelyne
-0,1975
-0,1115
0,6559
0,7223
2,3778

On importe les données dans R :

> Mini <- read.csv2("Mini-ACP.csv")
> Mini
Sujet Math Sciences Francais Latin Musique
1 Jean -1.087 -1.2817 -1.504 -1.625 -1.02
2 Aline -0.494 -0.6130 -0.640 -0.722 -0.68
3 Annie -1.087 -0.9474 0.224 -0.181 0.00
4 Monique 1.432 1.5604 1.520 1.806 -1.02
5 Didier 1.284 1.3932 0.512 0.722 -0.34
6 Andr<8e> 0.395 0.0557 -1.360 -1.083 0.68
7 Pierre -1.235 -0.9474 1.088 0.542 -0.34
8 Brigitte 0.988 0.8916 -0.496 -0.181 0.34
9 Evelyne -0.198 -0.1115 0.656 0.722 2.38

On isole les données numériques dans une matrice :

> MXM <- MMM[,2:6]

On calcule la matrice des distances euclidiennes entre les sujets :

> dxd <- dist(MXM)
> dxd
1 2 3 4 5 6 7 8
2 1.57
3 2.49 1.40
4 5.94 4.43 4.39
5 4.78 3.27 3.48 1.64
6 2.68 1.93 2.64 4.78 3.22
7 3.47 2.31 1.19 3.96 3.49 3.65
8 3.74 2.41 2.88 3.24 1.62 1.65 3.44
9 4.89 3.67 2.85 4.35 3.44 3.25 3.06 2.95

On réalise le positionnement multidimensionnel :
> cmdscale(dxd,k=3)
[,1] [,2] [,3]
[1,] -2.786 0.676 -0.737
[2,] -1.263 0.330 -0.555
[3,] -1.017 -1.020 -0.288
[4,] 3.122 0.166 -1.144
[5,] 1.955 0.788 -0.189
[6,] -0.948 1.201 1.140
[7,] -0.325 -1.755 -0.909
[8,] 0.637 1.130 0.692
[9,] 0.623 -1.517 1.991

Ces résultats sont identiques à ceux obtenus pour l'ACP. Cf. les fichiers : PSY-M1-Ana-mult-1.doc ou PSY-M1-Ana-mult-1.pdf . Les coordonnées des individus sur les 3 premiers axes factoriels sont rappelées ci-dessous :

 

Fact. 1

Fact. 2

Fact. 3

Sujet

1

-2,7857

0,6765

0,7368

Jean

2

-1,2625

0,3303

0,5549

Aline

3

-1,0167

-1,0198

0,2881

Annie

4

3,1222

0,1659

1,1442

Monique

5

1,9551

0,7879

0,1892

Didier

6

-0,9477

1,2014

-1,1401

André

7

-0,3250

-1,7548

0,9095

Pierre

8

0,6374

1,1298

-0,6919

Brigitte

9

0,6231

-1,5173

-1,9909

Evelyne

Exemple 3 : MDS classique "à la main"

# Le MDS classique "à la main"
# Distances entre 4 villes du Danemark
P <- matrix(c(0,93,82,133,93,0,52,60,82,52,0,111,133,60,111,0),nrow=4)
# Matrice des distances au carré
P2 <- P*P
# Matrice J = I - 1/n 1
Un <- matrix(c(rep(1,16)),nrow=4)
I4 <- matrix(c(rep(c(1,0,0,0,0),3),1),nrow=4)
J <- I4 - .25 * Un
# Matrice B
B <- -0.5 * J %*% P2 %*% J
# Valeurs propres et vecteurs propres
DIAG <- eigen(B)
# Matrice Lambda^1/2 pour 2 dimensions
LPLUS <- matrix(c(sqrt(DIAG$values[1]),0,0,sqrt(DIAG$values[2])),nrow=2)
# Vecteurs propres correspondants
CPLUS <- DIAG$vectors[,1:2]

# Solution
X <- CPLUS %*% LPLUS
X
#
[,1] [,2]
#[1,] 62.83108 32.97448
#[2,] -18.40289 -12.02697
#[3,] 24.96018 -39.71091
#[4,] -69.38837 18.76340

# Vérification
cmdscale(P)