web-dev-qa-db-fra.com

Quelles techniques existent dans R pour visualiser une "matrice de distance"?

Je souhaite présenter une matrice de distance dans un article que j'écris, et je recherche une bonne visualisation pour cela.

Jusqu'à présent, je suis tombé sur des parcelles de ballon (je l'ai utilisé ici , mais je ne pense pas que cela fonctionnera dans ce cas), des cartes thermiques (voici n bel exemple , mais ils ne permettent pas de présenter les nombres dans le tableau, corrigez-moi si je me trompe. Peut-être que la moitié du tableau en couleurs et la moitié avec des chiffres serait cool) et enfin des graphiques d'ellipse de corrélation (voici n code et un exemple) - ce qui est cool d'utiliser une forme, mais je ne sais pas comment l'utiliser ici).

Il existe également différentes méthodes de regroupement, mais elles agrégeront les données (ce qui est pas ce que je veux) tandis que ce que je veux est de présenter toutes les données.

Exemples de données:

nba <- read.csv("http://datasets.flowingdata.com/ppg2008.csv")
dist(nba[1:20, -1], )

Je suis ouvert aux idées.

52
Tal Galili

Tal, c'est un moyen rapide de superposer du texte sur une carte thermique. Notez que cela repose sur image plutôt que sur heatmap car ce dernier compense le tracé, ce qui rend plus difficile la mise du texte à la bonne position.

Pour être honnête, je pense que ce graphique montre trop d'informations, ce qui le rend un peu difficile à lire ... vous voudrez peut-être écrire uniquement des valeurs spécifiques.

de plus, l'autre option plus rapide consiste à enregistrer votre graphique au format PDF, à l'importer dans Inkscape (ou un logiciel similaire) et à ajouter manuellement le texte si nécessaire.

J'espère que cela t'aides

nba <- read.csv("http://datasets.flowingdata.com/ppg2008.csv")

dst <- dist(nba[1:20, -1],)
dst <- data.matrix(dst)

dim <- ncol(dst)

image(1:dim, 1:dim, dst, axes = FALSE, xlab="", ylab="")

axis(1, 1:dim, nba[1:20,1], cex.axis = 0.5, las=3)
axis(2, 1:dim, nba[1:20,1], cex.axis = 0.5, las=1)

text(expand.grid(1:dim, 1:dim), sprintf("%0.1f", dst), cex=0.6)

enter image description here

20
nico

Un diagramme de Voronoi (un tracé d'une décomposition de Voronoï) est une façon de représenter visuellement une matrice de distance (DM).

Ils sont également simples à créer et à tracer à l'aide de R - vous pouvez faire les deux en une seule ligne de code R.

Si vous n'êtes pas familier avec cet aspect de la géométrie informatique, la relation entre les deux (VD et DM) est simple, bien qu'un bref résumé puisse être utile.

Les matrices de distance - c'est-à-dire une matrice 2D montrant la distance entre un point et tous les autres points, sont une sortie intermédiaire pendant le calcul de kNN (c'est-à-dire k-le plus proche voisin, un algorithme d'apprentissage automatique qui prédit la valeur d'un point de données donné en fonction de la valeur moyenne pondérée de ses `` k '' voisins les plus proches, par distance, où `` k '' est un entier, généralement compris entre 3 et 5.)

kNN est conceptuellement très simple - chaque point de données de votre ensemble d'entraînement est essentiellement une `` position '' dans un espace à n dimensions, donc la prochaine étape consiste à calculer la distance entre chaque point et chaque autre point en utilisant une métrique de distance (par exemple , Euclidienne, Manhattan, etc.). Bien que l'étape d'apprentissage - c'est-à-dire la construction de la matrice de distance - soit simple, son utilisation pour prédire la valeur de nouveaux points de données est pratiquement gênée par la récupération des données - trouver les 3 ou 4 points les plus proches parmi plusieurs milliers ou plusieurs millions. dispersés dans l'espace à n dimensions.

Deux structures de données sont couramment utilisées pour résoudre ce problème: les kd-arbres et les décompositions de Voroni (alias "Dirichlet tesselation").

Une décomposition de Voronoï (VD) est uniquement déterminée par une matrice de distance - c'est-à-dire qu'il y a une carte 1: 1; il s'agit donc bien d'une représentation visuelle de la matrice de distance, bien que là encore, ce ne soit pas leur objectif - leur objectif principal est le stockage efficace des données utilisées pour la prédiction basée sur kNN.

Au-delà de cela, que ce soit une bonne idée de représenter une matrice de distance de cette façon dépend probablement avant tout de votre public. Pour la plupart, la relation entre un VD et la matrice de distance antérieure ne sera pas intuitive. Mais cela ne le rend pas incorrect - si quelqu'un sans formation en statistique voulait savoir si deux populations avaient des distributions de probabilités similaires et que vous leur montriez un graphique Q-Q, il penserait probablement que vous n'avez pas engagé sa question. Ainsi, pour ceux qui savent ce qu'ils regardent, un VD est une représentation compacte, complète et précise d'un DM.

Alors, comment faites-vous un?

Une décompression de Voronoi est construite en sélectionnant (généralement au hasard) un sous-ensemble de points dans l'ensemble d'entraînement (ce nombre varie selon les circonstances, mais si nous avions 1 000 000 de points, alors 100 est un nombre raisonnable pour ce sous-ensemble). Ces 100 points de données sont les centres Voronoi ("VC").

L'idée de base derrière une décompression Voronoi est que plutôt que d'avoir à parcourir les 1 000 000 points de données pour trouver les voisins les plus proches, vous n'avez qu'à regarder ces 100, puis une fois que vous avez trouvé le VC le plus proche, votre recherche des voisins les plus proches réels est limité aux seuls points de cette cellule de Voronoi. Ensuite, pour chaque point de données de l'ensemble d'apprentissage, calculez le VC dont il est le plus proche. Enfin, pour chaque VC et ses points associés, calculez le convexe coque - conceptuellement, juste la limite extérieure formée par les points assignés à ce VC qui sont les plus éloignés du VC. Cette coque convexe autour du centre de Voronoi forme une "cellule Voronoi." Un VD complet est le résultat de l'application de ces trois étapes à chacun = VC dans votre ensemble d'entraînement. Cela vous donnera une tesselation parfaite de la surface (voir le diagramme ci-dessous).

Pour calculer un VD dans R, utilisez le package tripack. La fonction clé est 'voronoi.mosaic' à laquelle vous passez simplement les coordonnées x et y séparément - les données brutes, pas le DM-- alors vous pouvez simplement passer voronoi.mosaic à 'plot'.

library(tripack)
plot(voronoi.mosaic(runif(100), runif(100), duplicate="remove"))

enter image description here

20
doug

Vous pouvez également utiliser des algorithmes de dessin de graphiques à force dirigée pour visualiser une matrice de distance, par exemple.

nba <- read.csv("http://datasets.flowingdata.com/ppg2008.csv")
dist_m <- as.matrix(dist(nba[1:20, -1]))
dist_mi <- 1/dist_m # one over, as qgraph takes similarity matrices as input
library(qgraph)
jpeg('example_forcedraw.jpg', width=1000, height=1000, unit='px')
qgraph(dist_mi, layout='spring', vsize=3)
dev.off()

19
jmb

Vous pouvez envisager de regarder une projection 2D de votre matrice (mise à l'échelle multidimensionnelle). Voici un lien pour savoir comment le faire dans R .

Sinon, je pense que vous êtes sur la bonne voie avec les heatmaps. Vous pouvez ajouter vos chiffres sans trop de difficulté. Par exemple, construire off Learn R :

library(ggplot2)
library(plyr)
library(arm)
library(reshape2)
nba <- read.csv("http://datasets.flowingdata.com/ppg2008.csv")
nba$Name <- with(nba, reorder(Name, PTS))
nba.m <- melt(nba)
nba.m <- ddply(nba.m, .(variable), transform,
rescale = rescale(value))
(p <- ggplot(nba.m, aes(variable, Name)) + geom_tile(aes(fill = rescale),
colour = "white") + scale_fill_gradient(low = "white",
high = "steelblue")+geom_text(aes(label=round(rescale,1))))

enter image description here

16
Ian Fellows
  1. Un dendrogramme basé sur une analyse de cluster hiérarchique peut être utile: http://www.statmethods.net/advstats/cluster.html

  2. Une analyse de mise à l'échelle multidimensionnelle 2D ou 3D dans R: http://www.statmethods.net/advstats/mds.html

  3. Si vous voulez entrer dans 3+ dimensions, vous voudrez peut-être explorer ggobi/rggobi: http://www.ggobi.org/rggobi/

9
Jeromy Anglim

Dans le livre "Numerical Ecology" de Borcard et al. 2011, ils ont utilisé une fonction appelée * coldiss.r * que vous pouvez trouver ici: http://ichthyology.usm.edu/courses/multivariate/coldiss.R

il code la couleur des distances et ordonne même les enregistrements par dissimilarité.

un autre bon paquet serait le paquet de sériation .

Référence: Borcard, D., Gillet, F. & Legendre, P. (2011) Ecologie numérique avec R. Springer.

enter image description here

7
Jens

Une solution utilisant la mise à l'échelle multidimensionnelle

data = read.csv("http://datasets.flowingdata.com/ppg2008.csv", sep = ",")
dst = tcrossprod(as.matrix(data[,-1]))
dst = matrix(rep(diag(dst), 50L), ncol = 50L, byrow = TRUE) + 
  matrix(rep(diag(dst), 50L), ncol = 50L, byrow = FALSE) - 2*dst

library(MASS)
mds = isoMDS(dst)
#remove {type = "n"} to see dots
plot(mds$points, type = "n", pch = 20, cex = 3, col = adjustcolor("black", alpha = 0.3), xlab = "X", ylab = "Y") 
text(mds$points, labels = rownames(data), cex = 0.75)

enter image description here

3