Superposer des formes pour mieux les comparer.
Le nom Procrustes vient de la mythologie grecque : Procrustes était un brigand qui offrait l'hospitalité aux voyageurs… avant de les forcer à entrer exactement dans son lit : il étirait les trop petits et amputait les trop grands. Le nom est resté pour désigner une méthode statistique dont l'esprit est le même, en beaucoup moins violent, soyons rassurés : le but est d'ajuster une configuration de données à une autre pour pouvoir les comparer.
L'idée de fond est simple. Imaginez deux cartes représentant les mêmes villes, dessinées par deux personnes différentes. L'une a tourné sa feuille, l'autre a utilisé une échelle plus grande, une troisième a décalé tout le dessin vers la droite. Ces trois cartes peuvent décrire exactement la même réalité géographique mais elles diffèrent par leur orientation, leur taille et leur position. L'analyse de Procrustes consiste à faire pivoter, redimensionner et recentrer une carte sur l'autre pour révéler ce qu'elles ont en commun, et où elles divergent pour de bon.
Le problème qu'elle résout
Si l'analyse de Procrustes est particulièrement adaptée pour étudier des variations de formes, en pratique, on l'utilise souvent pour comparer deux ordinations. Il peut s'agir des résultats d'une ACP, d'une PCoA, ou de toute méthode qui projette des individus (ou des variables) dans un espace de quelques axes. Le souci, c'est que ces axes sont arbitraires : une ACP peut décrire la même structure qu'une autre tout en étant tournée, inversée ou à une autre échelle. Comparer les coordonnées telles quelles n'aurait aucun sens.
L'analyse de Procrustes retire donc tout ce qui relève de ces différences de configuration pour ne garder que la structure interne des données. Concrètement, elle élimine trois choses :
- La position (translation). On recentre chaque nuage de points sur son centre de gravité, à l'origine. Ce centrage n'est pas un détail : c'est lui qui isole proprement l'effet de position et garantit que la comparaison qui suit n'est pas faussée par un simple décalage. Une fois cette étape faite, il ne reste plus qu'à régler la taille et l'orientation.
- La taille (échelle). On normalise chaque configuration pour qu'elles aient la même « ampleur » globale, de façon à ne pas confondre une vraie différence de forme avec un simple effet d'agrandissement.
- L'orientation (rotation, et éventuellement réflexion). C'est l'étape clé : on cherche la rotation qui fait coïncider au mieux les deux nuages, en minimisant l'écart qui reste entre eux.
L'objectif tout au long de ce processus est de rendre les écarts entre les deux configurations aussi petits que possible, mesurés par la somme des carrés des distances (ce que les mathématiciens appellent la norme de Frobenius). Ce qui résiste à cet alignement — ce qu'on ne peut pas faire disparaître en tournant ou en redimensionnant — représente une vraie différence de forme.
Ce qui reste : les résidus, et à quel point ça « colle »
Une fois les deux configurations superposées au mieux, les écarts qui subsistent s'appellent les résidus. Ils sont précieux, car ils ne contiennent plus de « bruit » lié à la position, à la taille ou à l'orientation : ce sont des différences de forme à l'état pur.
On résume la qualité de l'alignement par une statistique notée m² : plus elle est petite, plus les deux configurations se ressemblent une fois superposées. On en dérive souvent une corrélation de Procrustes, R = √(1 − m²), qui se lit comme un coefficient classique : proche de 1, les deux structures sont presque identiques ; proche de 0, elles n'ont pas grand-chose à voir.
Un détail : m² n'est pas symétrique. Aligner A sur B ne donne pas tout à fait le même résultat qu'aligner B sur A. Selon l'usage, on choisit donc une version symétrique ou on précise dans quel sens on compare.
Est-ce que la ressemblance est réelle, ou due au hasard ?
Obtenir une bonne corrélation ne suffit pas : encore faut-il savoir si elle est significative. Comme on n'a pas de formule simple pour cela, on procède par permutation, ou via modèle nul. On mélange au hasard les lignes d'une des configurations, on recalcule m², et on répète l'opération des centaines ou milliers de fois. On obtient ainsi une distribution de ce que donnerait le hasard pur. Si notre m² réel est nettement meilleur que cette distribution, on peut conclure que la concordance observée n'est pas un accident.
C'est exactement ce que teste l'hypothèse nulle de la méthode : le degré de concordance entre deux configurations n'est pas plus grand que ce qu'on attendrait d'associations purement aléatoires. Rejeter cette hypothèse, c'est affirmer que les deux jeux de données décrivent bien une structure commune.
Quand on a plus de deux configurations : la GPA
Tout ce qui précède compare deux configurations. Mais que faire quand on en a trois, quatre, dix ? On utilise alors l'analyse généralisée de Procrustes (GPA), introduite par John Gower en 1975.
L'idée est élégante : plutôt que de prendre une configuration comme référence (ce qui serait arbitraire), on les aligne toutes sur une forme consensus, une sorte de moyenne de toutes les configurations. Le calcul est itératif et se fait en boucle :
- on part d'une référence provisoire (souvent la moyenne des configurations) ;
- on aligne chaque configuration sur cette référence par une analyse de Procrustes ordinaire ;
- on recalcule le consensus à partir de ces configurations réalignées ;
- on recommence, le nouveau consensus servant de référence ;
- on s'arrête quand le consensus ne bouge presque plus d'une étape à l'autre.
En pratique, l'algorithme converge vite et de façon stable. L'avantage, c'est qu'aucune configuration n'est privilégiée : le consensus émerge de l'ensemble, sans biais. On enchaîne d'ailleurs souvent la GPA avec une ACP sur les configurations alignées, pour explorer comment elles se répartissent autour du consensus. Cette analyse permet de définir quelle configuration est la plus éloignée du consensus mais également de comparer la proximité entre configurations deux à deux, de la même façon qu'une ACP classique sur les individus.
La partie historique
Pour les curieux, l'analyse de Procrustes a une belle assise théorique, formalisée dans les années 1980 par David Kendall. Son intuition : si l'on décide qu'une forme est ce qui reste une fois qu'on a retiré la position, la taille et l'orientation, alors chaque forme possible devient un point dans un espace abstrait — l'espace des formes de Kendall.
Cet espace a une dimension précise. Pour k points en deux dimensions, on part de 2k coordonnées, dont on retire 2 paramètres de translation, 1 d'échelle et 1 de rotation, ce qui laisse 2k − 4 dimensions de « forme pure ». La distance entre deux points de cet espace mesure alors directement leur différence de forme.
On en distingue plusieurs variantes, qui ont toutes l'avantage d'être bornées, ce qui les rend faciles à interpréter, un peu comme un pourcentage. Toutes valent 0 pour deux formes identiques et augmentent à mesure que les formes s'éloignent :
- La distance partielle de Procrustes fixe la taille (les formes sont déjà normalisées) et ne joue que sur la rotation. Elle varie de 0 à √2 (≈ 1,41).
- La distance complète de Procrustes optimise aussi l'échelle, et capture donc des différences de forme totalement indépendantes de la taille. Elle varie de 0 à 1.
- La distance géodésique (ou riemannienne), qui mesure la « vraie » longueur du chemin le plus court sur la sphère des formes de Kendall, s'exprime en angle et varie de 0 à π/2. Pour de petites différences, les trois mesures coïncident pratiquement ; elles ne se distinguent que pour des formes très éloignées.
Ce cadre géométrique n'est pas qu'une élégance théorique : c'est lui qui permet de bâtir de véritables tests statistiques sur les formes, comme la Procrustes ANOVA, qui décompose la variabilité totale en parts attribuables aux groupes, aux individus ou à l'erreur de mesure, ou encore le test F de Goodall qui compare la variation entre groupes à celle au sein des groupes.
Le code R
Pour réaliser l'analyse de GPA il est nécessaire d'installer les packages shapes et geomorph. On utilise la fonction :
procGPA(arr, reflect = TRUE, scale = TRUE, distances = TRUE, pcaoutput = TRUE)
Les arguments sont les suivants :
arr— le tableau (array) contenant les configurations à aligner.reflect— autoriser la réflexion en plus de la rotation.scale— normaliser la taille de chaque configuration.distances— calculer les distances de forme.pcaoutput— réaliser l'ACP sur les configurations alignées.
En sortie on récupère :
k— nombre de variables.m— nombre de dimensions de l'ACP.n— nombre de configurations.rotated— les n configurations après alignement.mshape— la forme consensus.tan— les coordonnées tangentes, c'est-à-dire les résidus de forme de chaque configuration par rapport au consensus projeté dans l'espace linéarisé ; ce sont les coordonnées utilisées par l'ACP de la GPA.pcar— vecteurs propres, les principales variations de forme de la covariance des coordonnées tangentes.pcasd— écart-type de chaque composante.percent— pourcentage de variabilité expliqué par chaque composante.scores,rawscores,stdscores— coordonnées des configurations dans les composantes de l'ACP de forme GPA.size— taille du centroïde de chaque configuration après normalisation.rho— distance de forme de Kendall : indicateur d'écart au consensus.rmsrho— moyenne quadratique des rho, mesure l'écart au consensus.rmsd1— distance complète de Procrustes, moyenne de la distance de Procrustes.GSS— somme des carrés de Procrustes minimisée : valeur résiduelle finale, variation totale de forme.
La fonction procD.lm, associée à anova(), permet d'effectuer une ANOVA afin de déterminer les facteurs qui influencent significativement les différences de forme :
fit <- procD.lm(coords ~ niveau + transfo, data = gdf, iter = 9999)
anova(fit)
On peut tester l'effet d'un facteur avec deux modèles de régression de Procrustes afin de déterminer si un facteur a un effet significatif, deux à deux. Il s'agit d'une certaine façon d'un test post-hoc après l'ANOVA :
fit_full <- procD.lm(coords ~ niveau + transfo, data = gdf, iter = 9999)
fit_null <- procD.lm(coords ~ niveau, data = gdf, iter = 9999)
# Comparaison deux à deux (post-hoc)
pw <- pairwise(fit_full, fit.null = fit_null, groups = gdf$transfo)
— Jean-Yves Dias