25
5 Analyses sur matrices de distances Ecole Doctorale MNHN Module Analyse des Données avec R Michel Baylac, UMR 7205, UMS 2700 plate-forme Morphométrie [email protected]

5 Analyses sur matrices de distances - edu.mnhn.fredu.mnhn.fr/pluginfile.php/7248/mod_resource/content/0/ED_MNHN... · ... (implique que 1 corresponde à la différence max entre

  • Upload
    lykiet

  • View
    212

  • Download
    0

Embed Size (px)

Citation preview

5Analyses sur matrices 

de distances

Ecole Doctorale MNHN Module Analyse des Données avec RMichel Baylac, UMR 7205, UMS 2700 plate­forme Morphométrie

[email protected]

R : Matrices de distances,Distances, similarités et dissimilarités

Similarité Sgénéralement 0 =< S <= 1d(i,i) > 0Exemple : matrices des corrélations mais cas particulier lié à l'intervalle [­1, +1]

Dissimilarité, distances Ddistances euclidiennes :

dii =  0

dij <= d

ik + d

kj , le 

 fameux principe de l'inégalité triangulaire

transformations D ­ SD = 1 – S (implique que ­1 corresponde à la différence max entre 2 objets)D = 1 – S2 (implique que +1 ou ­1 indiquent une similarité équivalente)

Ecole Doctorale MNHN Module Analyse des Données avec R

i

j

k

R : Distances et distances euclidiennes

Matrices de distances et de similarité

Ce sont des matrices carrées symétriques (par rapport à la diagonale principale) dont les termes diagonaux sont nuls (distances) ou > 0 (similarités)

Ecole Doctorale MNHN Module Analyse des Données avec R

0 1.5 2.31.5 0 3.62.3 3.6 0

R : Analyses sur tableaux de distancesIntroduction

On passe facilement d'une matrice de coordonnées à une matrice de distances euclidiennes

Comment ?

Pour mémoire sur un exemple simple avec 3 variables x, y, z, la distance entre 2 objets i et j est :

d2ij = ∑((x

i – x

j)2 + (y

i – y

j)2 + (z

i ­ z

j)2)

Ecole Doctorale MNHN Module Analyse des Données avec R

R : Analyses sur tableaux de distancesIntroduction

Ecole Doctorale MNHN Module Analyse des Données avec R

L'opération inverse :

résumer et visualiser les relations entre objetsà partir de la matrice de leurs distances deux­à­deux ?

n'est pas aussi simple ! 

?

R : Analyses sur tableaux de distancesIntroduction

Plusieurs méthodes permettent de le réaliser :

­ l'analyse en coordonnées principales (principal coordinate analysis ou classical multidimensional scaling) de Gower qui s'applique à des matrices de distances euclidiennes. 

­ d'autres méthodes, moins restrictives quant aux conditions d'application, comme lepositionnement multidimensionnel (non­metric multidimensional scaling) recherchent un sous­espace de dimension spécifiée minimisant la somme des différences entre distances originelles et distances de représentation, quantité appelée stress. 

On verra enfin comment aborder la question de la comparaison de deux ou plusieurs matrices de distances et comment notamment tester si elles sont significativement liées.

Ecole Doctorale MNHN Module Analyse des Données avec R

Calcul et représentation des tableaux de distances sous R

Calculs des matrices de distances et pré­traitements

les fonctions dist() et as.dist() (bibliothèque stats de base) sont les points d'entrée qui permettent de manipuler des matrices de distances dans R :

­ dist() permet de calculer une matrice de distances à partir d'un data.frame ou une matrice (matrix) de variables quantitatives, qualitatives ou logiques. Plusieurs mesures de distance sont disponibles : 'euclidean', 'maximum', 'manhattan', 'canberra' et 'binary'. La matrice de distances est un objet R de classe « dist ».    

­ as.dist() transforme une matrice de distance (donc calculée en dehors de R par exemple), carrée et symétrique, en un objet R de classe « dist » qui permet de    l'utiliser avec les fonctions traitant de matrices de distances.

Les paramètres upper et diag contrôlent le mode d'affichage de la matrice affichée par une instruction  print(). R stocke uniquement la matrice triangulaire inférieure. 

Ecole Doctorale MNHN Module Analyse des Données avec R

Calcul et représentation des tableaux de distances sous R

Calculs des matrices de distances et pré­traitements

ATTENTION à ne pas intervertir les commandes : 

dist() avec une matrice de distances calculera une « distance » en considérant    les colonnes de la matrice initiale comme autant de variables. 

 as.dist() avec une matrice de descripteurs construira une matrice de « distances » en copiant ou en recyclant simplement au besoin tout ou partie    des colonnes de la matrice initiale.

Dans les deux cas, le résultat n'a aucun sens ! C'est donc à vous de vérifier la cohérence de vos actions. R ne peut pas le faire à votre place

Quelles sont les bonnes instructions dans les deux cas précedents ?

Ecole Doctorale MNHN Module Analyse des Données avec R

R : Analyse en Coordonnées principales principe

Principe de l'analyse en coordonnées principales : 

soit D une matrice de distances euclidiennes entre objets, on réalise les opérations suivantes :

­ double centrage lignes et colonnes de ­D2/2.

­ extraction des valeurs et vecteurs propres à partir de la matrice obtenue

­ projection de tout ou partie des vecteurs propres qui décrivent un sous­espace de dimension ad hoc. 

Ecole Doctorale MNHN Module Analyse des Données avec R

R : Analyse en Coordonnées principales principe

Sous R (détail des étapes) : 

> library(ade4)  Cette bibliothèque contient le fichier des données et les fonctions utilisées

> data(capitales) Examiner le contenu de capitales et accéder aux deux fichiers de la liste

> d <­ dist(capitales$xy) distances à partir des coordonnées cartographiques

> is.euclid(d)[1] TRUE

> dd <­ ­0.5 * bicenter.wt(d * d) # double centrage de ­dist2/2 (fonction ADE4)

> dde <­ eigen(dd)

Ecole Doctorale MNHN Module Analyse des Données avec R

R : Analyse en Coordonnées principales principe et exemples

La fonction pcoscaled() de la bibliothèque ADE4 réalise automatiquement ces opérations :

> ds <­ pcoscaled(d)

> ds # dimension ?

> plot(ds, asp=1) 

> text(ds[,1],ds[,2],labels=names(capitales$df)) # Résultat ?

Ecole Doctorale MNHN Module Analyse des Données avec R

R : Analyse en Coordonnées principales distances euclidiennes ?

Il est indispensable de regarder les valeurs propres : la présence de valeurs propres négatives doit inciter à la prudence, indiquant que la métrique utilisée ne respecte pas la conditions de base de l'inégalité triangulaire 

Dij <= D

ik + D

kj

Il s'agit d'une caractéristique importante des matrices de distances euclidiennes. L'absence de valeurs propres négatives sert de test pour vérifier que les distances sont bien euclidiennes

Ecole Doctorale MNHN Module Analyse des Données avec R

i

j

k

R : Analyse en Coordonnées principales distances euclidiennes ?

Ecole Doctorale MNHN Module Analyse des Données avec R

Remarques

On n'est pas obligé d'effectuer explicitement la diagonalisation pour examiner les valeurs propres. 

La fonction is.euclid() les retourne si on ajoute le paramètre print=TRUE :

> is.euclid(d, print=TRUE) 

# dans le cas de capitales$xy, les distances calculées sont euclidiennes. Noter que plusieurs 

valeurs propres sont négatives, mais elles sont inférieures à 10­12 et résultent des imprécisions dans

l'estimation des coordonnées. 

On peut aller plus loin : a priori, combien de valeurs propres non­nulles doit­on avoir ? Est­ce vérifié ? Affichez les deux premiers axes  avec :

> plot(dde$vectors, asp=1)

> text(dde$vectors[,1],dde$vectors[,2],labels=names(capitales$df))

Que faire lorsque les distances utilisées ne sont pas euclidiennes ? 

On a plusieurs possibilités : 

1. utiliser les seules composantes positives fournies par eigen() après double­centrage. C'est ce que réalise la fonction quasieuclid() qui conserve le sous­espace « euclidien »    associé aux valeurs propres > 0 :

> distance <­ quasieuclid(distance)

2. transformer (par addition de constantes) la matrice en matrice euclidienne selon 2 procédures implémentées dans ADE4 : cailliez() ou lingoes()  (voir les aides avec ?)

> distance <­ cailliez(distance) # addition d'une constante, méthode de Cailliez

> distance <­ lingoes(distance) # addition d'une constante, méthode de Lingoes

3. utiliser les fonctions de positionnement multidimensionnel non métrique IsoMDS() ou sammon() de la bibliothèque MASS.

Ecole Doctorale MNHN Module Analyse des Données avec R

R : Analyses sur tableaux de distancescas des distances non­euclidiennes

R : Analyses sur tableaux de distancescas des distances non euclidiennes

Si on part de capitales$df (distances routières kilométriques), on a

> d1 <­ as.dist(capitales$df)

vérifier si d1 est une matrice de distances euclidiennes

Résultat ?

Comment expliquez­vous ce résultat : en quoi une matrice de distances kilométriques diffère­t'elle d'une matrice de distances “à vol d'oiseau” ?

Utilisez les différentes options fournies par ade4 pour rendre euclidiennes les distances et pour analyser ce tableau de distances à l'aide des coordonnées principales

Ecole Doctorale MNHN Module Analyse des Données avec R

R : Analyse en Coordonnées principalesexemple 1

Application à l'exemple des crabes. Ici, il faut d'abord calculer la matrice des distances euclidiennes avec la fonction dist().

On calcule ensuite les coordonnées principales avec la fonction pcoscaled().

> dcrab <­ dist(crab)> pcrab <­ pcoscaled(dcrab)

Puis on affiche les groupes dans le plan 2:3 de pcrab qui devrait être proche du plan intéressant de l'ACP correspondante:

> plot(pcrab[,2], pcrab[,3], col = as.numeric(groupe), asp = 1) # ou, avec plotg> plotg(pcrab, cols=c(2,3), groupe)

Conclusions ?

Ecole Doctorale MNHN Module Analyse des Données avec R

R : Analyse en Coordonnées principalesexemple 2

Etudier l'exemple de ADE4 sur le fichier Yanomama:

> library(ade4)> data(yanomama) ; ?yanomamaOn a 3 matrices de distances

$geo = géographique$ant = morphométrique$gen = génétiques, entre 19 populations

> geo1 <­ as.dist(yanomama$geo)> is.euclid(geo1) [1] FALSE

...# en fait les 3 matrices ne sont pas euclidiennes. On les rend euclidiennes via quasi.euclid()

> geo <­ quasieuclid(geo1)> gen <­ quasieuclid(as.dist(yanomama$gen))> ant <­ quasieuclid(as.dist(yanomama$ant))Vérifiez que les matrices ainsi constituées sont euclidiennes.  Analysez­les via pcoscaled()+ plot()

Ecole Doctorale MNHN Module Analyse des Données avec R

R : Analyse en Coordonnées principalesexemple 2

> dgeo <­ pcoscaled(geo)> dgen <­ pcoscaled(gen)> dant <­ pcoscaled(ant)

> par(mfrow= c(3,1))  # on crée un tableau de 3 graphes superposés (3 lignes et 1 colonne)

> plot(dgeo[,1:2], pch = 20, asp =1) ; text(dgeo[,1],dgeo[,2],labels=as.character(1:19), pos=2, offset=1)

> plot(dgen[,1:2], pch = 20, asp =1) ; text(dgen[,1],dgen[,2],labels=as.character(1:19), pos=2, offset=1)

> plot(dant[,1:2], pch = 20, asp =1) ; text(dant[,1],dant[,2],labels=as.character(1:19), pos=2, offset=1)

> par(mfrow= c(1,1))    # on revient à l'affichage usuel d'un seul graphe pour prévenir les surprises avec les graphes ultérieurs

Ecole Doctorale MNHN Module Analyse des Données avec R

R : Analyse en coordonnées principalesRemarques importantes

Interprétations

­ axes : il est important de comprendre que le système d'axes généré par l'analyse en co­ordonnées principales n'est pas nécessairement interprétable. Pour s'en convaincre, comparer les cartes obtenues avec une carte de l'Europe !

­ Pertinence du sous­espace conservé. Lorsqu'on projette les objets dans un sous­es­pace euclidien qui prend en compte une partie seulement axes, il s'en suit une distortion des distances originales. Il en va de meme lorsqu'en nmds on obtient une mesure de stress non­nulle. Comme avec les graphes associés au test de Mantel (cf. ci­après), on projette les objets dans le plan croisant les distances initiales aux distances calculées dans le sous­espace final (diagramme de Sheppard). Il est également possible de su­perposer sur le plan examiné un arbre de longueur minimale (minimum spanning tree, voir chapitre classification : voir dernière séance).  

Ecole Doctorale MNHN Module Analyse des Données avec R

R : Positionnement multidimensionnel non­métrique(non­metric multidimensional scaling)

# IsoMDS() 

> iso <­ isoMDS(as.dist(capitales$df))> iso> plot(iso$points[,1],iso$points[,2],asp=1)> text(iso$points[,1],iso$points[,2],labels=names(capitales$df))

également à voir : Sammon() (aide de MASS : « One form of non­metric multidimensional scaling »)    

A titre d'exercice, réaliser une figure avec 3 graphes comparant les solutions (2D) obtenues parIsoMDS, Sammon + la solution obtenue par une analyse en coordonnées principales.

N'oubliez pas de déclarer le format (3 lignes ou 3 colonnes) de la figure puis après réalisation derevenir à une figure unique 

Ecole Doctorale MNHN Module Analyse des Données avec R

R : fonctions pour l'analyse des tableaux de distances synthèse

Vecteurs propres

Valeurs propres

Dimension ket

caractéristiquede

l'espace ?

Matricede

distances

Pcoscaled()

Bicenter.wt()+ Eigen()

Distancesnon­euclidiennes

 Cmdscale()

MASS :IsoMDS()

Distanceseuclidiennes

Principales méthodesimplémentées

dans R

Ecole Doctorale MNHN Module Analyse des Données avec R

transformations

MASS :sammon()

stress

Dimensions k spécifiée

Calcul et représentation des tableaux de distances sous R

Calculs d'une matrice de distances particulière

calculer les distances de Mahalanobis pour les crabes :

­ reprenez la définition des D2

­ comment calculer les D2 : de quoi a­t'on besoin ?

­ calculez l'objet lda correspondant

­ écrivez les instructions permettant d'obtenir les D2

Ecole Doctorale MNHN Module Analyse des Données avec R

Tests sur matrices de distances

test de Mantelalternatives

Ecole Doctorale MNHN Module Analyse des Données avec R

R : Associations entre tableaux de distances :test de Mantel et analogues

Généralités sur le test de Mantel

Il sert à comparer deux matrices de distances : classiquement, on réalise un graphique en points croisant toutes les distances des matrices prises 2 à 2. 

On réalise également un test avec Ho = absence de lien entre couples de matrices : on estime le degré d'association entre les deux matrices de distances en calculant le coefficient de corrélation entre termes similaires, diagonale exclue. Le degré de signification du test est estimé par un test de permutation :

une des matrices est conservée intacte, l'ordre des lignes et de colonnes étant permuté dansl'autre matrice. On répète l'opération un grand nombre de fois et on stocke les valeurs des coefficientsde corrélation ainsi obtenus. On trie ce vecteur et on détermine le nombre de fois où un coefficient supérieur au coefficient observé est obtenu. La fréquence absolue correspondante, divisée par le nombre de répétitions, fournit l'estimation de la probabilité du test.

Ecole Doctorale MNHN Module Analyse des Données avec R

R : Comparaison de matrices de distancesTest de Mantel et tests similaires (bibliothèque ade4)

On va étudier l'exemple de ADE4 sur le fichier Yanomama: On utilisera uniquement $ant et $gen

> data(yanomama)> gen <­ quasieuclid(as.dist(yanomama$gen)) > ant <­ quasieuclid(as.dist(yanomama$ant)) 

> par(mfrow = c(2,2))# comparaison graphique des 2 matrices de distances> plot(gen, ant) # (figure 1 haut gauche)# test de Mantel (figure 2 haut droite)> t1 <­ mantel.randtest(gen, ant, 999);> plot(t1, main = "gen­ant­mantel") ; print(t1)# test de Mantel (figure 3 bas gauche)> t1 <­ procuste.rtest(pcoscaled(gen), pcoscaled(ant), 999)> plot(t1, main = "gen­ant­procuste") ; print(t1)# test de Mantel (figure 4 bas droite)> t1 <­ RV.rtest(pcoscaled(gen), pcoscaled(ant), 999)> plot(t1, main = "gen­ant­RV") ; print(t1)> par(mfrow = c(1,1))

Conclusions ?

2 0 3 0 40 50 6 0 7 0 80 90

10

02

00

30

04

00

50

06

00

g e n

an

t

g e n ­a n t­m a n te l

s im

Fre

qu

en

cy

­0 .2 0 .0 0 .2 0 .4 0 .6

05

10

15

20

g e n ­a n t­p ro c u s te

s im

Fre

qu

en

cy

0 .45 0 .50 0 .55 0 .60 0 .6 5 0 .70

05

10

15

20

g e n ­a n t­R V

s im

Fre

qu

en

cy

0 .1 0 .2 0 .3 0 .4 0 .5

05

10

15

20

25

30

Ecole Doctorale MNHN Module Analyse des Données avec R