studio - r find correlations
¿Qué técnicas existen en R para visualizar una "matriz de distancia"? (7)
Deseo presentar una matriz de distancia en un artículo que estoy escribiendo, y estoy buscando una buena visualización para ello.
Hasta ahora me encontré con diagramas de globo (lo usé here , pero no creo que funcione en este caso), mapas de calor (aquí hay un buen ejemplo , pero no permiten presentar los números en la tabla, corregir si estoy equivocado. Tal vez la mitad de la tabla en colores y la mitad con números sería genial) y por último diagramas de elipse de correlación (aquí hay un código y un ejemplo , lo cual es genial usar una forma, pero no estoy seguro de cómo usarlo aquí).
También hay varios métodos de agrupamiento, pero agregarán los datos (que no es lo que yo quiero) mientras que lo que quiero es presentar todos los datos.
Ejemplo de datos:
nba <- read.csv("http://datasets.flowingdata.com/ppg2008.csv")
dist(nba[1:20, -1], )
Estoy abierto a las ideas.
Un dendrograma basado en un análisis jerárquico de conglomerados puede ser útil: http://www.statmethods.net/advstats/cluster.html
Un análisis de escalamiento multidimensional 2-D o 3-D en R: http://www.statmethods.net/advstats/mds.html
Si desea entrar en más de 3 dimensiones, es posible que desee explorar ggobi / rggobi: http://www.ggobi.org/rggobi/
En el libro "Ecología Numérica" de Borcard et al. 2011 usaron una función llamada * coldiss.r * la pueden encontrar aquí: http://ichthyology.usm.edu/courses/multivariate/coldiss.R
el color codifica las distancias e incluso ordena los registros por desemejanza.
otro buen paquete sería el paquete de seriation .
Referencia: Borcard, D., Gillet, F. y Legendre, P. (2011) Ecología numérica con R. Springer.
Es posible que desee considerar mirar una proyección bidimensional de su matriz (escalamiento multidimensional). Aquí hay un enlace a cómo hacerlo en R.
De lo contrario, creo que estás en el camino correcto con heatmaps. Puedes agregar tus números sin demasiada dificultad. Por ejemplo, construcción de 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))))
Tal, esta es una forma rápida de superponer texto sobre un mapa de calor. Tenga en cuenta que esto depende de la image
lugar del heatmap
de heatmap
ya que este último compensa la trama, por lo que es más difícil colocar el texto en la posición correcta.
Para ser sincero, creo que este gráfico muestra demasiada información, por lo que es un poco difícil de leer ... es posible que desee escribir solo valores específicos.
Además, la otra opción más rápida es guardar su gráfico como PDF, importarlo en Inkscape (o software similar) y agregar manualmente el texto donde sea necesario.
Espero que esto ayude
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)
También puede usar algoritmos de dibujo de gráficos dirigidos por fuerza para visualizar una matriz de distancia, por ejemplo
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()
Un diagrama de Voronoi (un diagrama de una descomposición de Voronoi) es una forma de representar visualmente una matriz de distancia (DM).
También son simples de crear y trazar usando R: puede hacer ambas cosas en una sola línea de código R.
Si no está familiarizado con este aspecto de la geometría computacional, la relación entre los dos (DV y DM) es directa, aunque un breve resumen podría ser útil.
Las matrices de distancia, es decir, una matriz 2D que muestra la distancia entre un punto y cada otro punto, son una salida intermedia durante el cálculo de kNN (es decir, el vecino más cercano k, un algoritmo de aprendizaje automático que predice el valor de un punto de datos dado el valor promedio ponderado de sus vecinos ''k'' más cercanos, a distancia, donde ''k'' es un número entero, generalmente entre 3 y 5)
kNN es conceptualmente muy simple: cada punto de datos en su conjunto de entrenamiento es en esencia una ''posición'' en algún espacio de dimensión n, por lo que el siguiente paso es calcular la distancia entre cada punto y cada otro utilizando una métrica de distancia (p. ej. , Euclidiana, Manhattan, etc.). Si bien el paso de capacitación, es decir, la construcción de la matriz de distancia, es sencillo, usarlo para predecir el valor de los nuevos puntos de datos está prácticamente obstaculizado por la recuperación de datos, encontrando los 3 o 4 puntos más cercanos entre varios miles o varios millones dispersos en el espacio n-dimensional.
Dos estructuras de datos se usan comúnmente para abordar ese problema: kd-trees y descomposiciones de Voroni (también conocidas como "teselación de Dirichlet").
Una descomposición de Voronoi (VD) está determinada de forma única por una matriz de distancia, es decir, hay un mapa 1: 1; de hecho, es una representación visual de la matriz de distancia, aunque, de nuevo, ese no es su objetivo: su objetivo principal es el almacenamiento eficiente de los datos utilizados para la predicción basada en kNN.
Más allá de eso, si es una buena idea representar una matriz de distancia de esta manera probablemente dependa sobre todo de la audiencia. Para la mayoría, la relación entre un VD y la matriz de distancia antecedente no será intuitiva. Pero eso no lo hace incorrecto: si alguien sin capacitación en estadística quisiera saber si dos poblaciones tienen distribuciones de probabilidad similares y usted les mostró una trama de QQ, probablemente pensarían que no se ha ocupado de su pregunta. Entonces, para aquellos que saben lo que están viendo, un VD es una representación compacta, completa y precisa de un DM.
Entonces, ¿cómo se hace uno?
Una descomposición de Voronoi se construye seleccionando (generalmente al azar) un subconjunto de puntos dentro del conjunto de entrenamiento (este número varía según las circunstancias, pero si tuviéramos 1,000,000 puntos, entonces 100 es un número razonable para este subconjunto). Estos 100 puntos de datos son los centros de Voronoi ("VC").
La idea básica detrás de una descomposición de Voronoi es que en lugar de tener que examinar los 1,000,000 de puntos de datos para encontrar los vecinos más cercanos, solo tiene que mirar estos 100, luego, una vez que encuentre el VC más cercano, su búsqueda de los vecinos más cercanos es restringido solo a los puntos dentro de esa celda de Voronoi. Luego, para cada punto de datos en el conjunto de entrenamiento, calcule el VC más cercano. Finalmente, para cada VC y sus puntos asociados, calcule el casco convexo, conceptualmente, solo el límite externo formado por los puntos asignados de ese VC que están más alejados del VC. Este casco convexo alrededor del centro de Voronoi forma una "celda de Voronoi". Un VD completo es el resultado de aplicar esos tres pasos a cada VC en su conjunto de entrenamiento. Esto le dará una teselación perfecta de la superficie (consulte el diagrama a continuación).
Para calcular un VD en R, use el paquete tripack . La función clave es ''voronoi.mosaic'', a la que simplemente se les transfieren las coordenadas xey por separado, los datos en bruto, no el DM, luego se puede pasar voronoi.mosaic a ''plot''.
library(tripack)
plot(voronoi.mosaic(runif(100), runif(100), duplicate="remove"))
Una solución que usa escalamiento multidimensional
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)