Introducción

corrplot

El paquete R corrplot proporciona una herramienta de exploración visual en la matriz de correlación que admite el reordenamiento automático de variables para ayudar a detectar patrones ocultos entre las variables.

corrplot es muy fácil de usar y proporciona una amplia gama de opciones de trazado en método de visualización, diseño gráfico, color, leyenda, etiquetas de texto, etc. También proporciona valores p e intervalos de confianza para ayudar a los usuarios a determinar la importancia estadística de las correlaciones.

corrplot()Tiene alrededor de 50 parámetros, sin embargo, los más comunes son sólo unos pocos. Podemos obtener un gráfico de matriz de correlación con solo una línea de código en la mayoría de las escenas.

Los parámetros que más se utilizan incluyen method,,,,, etc.typeorderdiag

Hay siete métodos de visualización (parámetro ) en el methodpaquete corrplot , ‘circle’denominados ,,,,,,,, . La intensidad del color del glifo es proporcional a los coeficientes de correlación según la configuración de color predeterminada.’square’‘ellipse’‘number’‘shade’‘color’‘pie’

‘circle’y ’square’, las áreas de círculos o cuadrados muestran el valor absoluto de los coeficientes de correlación correspondientes.

‘ellipse’, las elipses tienen su excentricidad escalada paramétricamente al valor de correlación. Proviene del trabajo de DJ Murdoch y ED Chow, ver en la sección Referencias.

‘number’, números de coeficientes con diferente color.

‘color’, cuadrado de igual tamaño con diferente color.

‘shade’, similar a ‘color’, pero los glifos de coeficientes negativos están sombreados. Método ’pie’y ’shade’proviene del trabajo de Michael Friendly.

‘pie’, los círculos se rellenan en el sentido de las agujas del reloj para los valores positivos y en el sentido contrario a las agujas del reloj para los valores negativos.

corrplot.mixed()es una función ajustada para estilos de visualización mixtos, que puede configurar los métodos visuales del triangular inferior y superior por separado.

Hay tres tipos de diseño (parámetro type) ‘full’: ‘upper’y ’lower’.

La matriz de correlación se puede reordenar según los coeficientes de la matriz de correlación. Esto es importante para identificar la estructura y el patrón ocultos en la matriz.

library(corrplot)
## Warning: package 'corrplot' was built under R version 4.2.3
## corrplot 0.92 loaded
M = cor(mtcars)
corrplot(M, method = 'number') # numero colorido

corrplot(M, method = 'color', order = 'alphabet')

  corrplot(M) # por defecto, método = 'círculo'

corrplot(M, order = 'AOE') # después del reorden 'AOE'

corrplot(M, method = 'shade', order = 'AOE', diag = FALSE)

corrplot(M, method = 'square', order = 'FPC', type = 'lower', diag = FALSE)

corrplot(M, method = 'ellipse', order = 'AOE', type = 'upper')

corrplot.mixed(M, order = 'AOE')

corrplot.mixed(M, lower = 'shade', upper = 'pie', order = 'hclust')

Reordenar una matriz de correlación

Los detalles de cuatro ordera los goritmos, denominados ‘AOE’, ‘FPC’, ‘hclust’, ‘alphabet’ son los siguientes.

‘AOE’ es para el orden angular de los vectores propios. Se calcula a partir del orden de los ángulos. \(a_i\),

$\[ ai = \begin{cases} \arctan\left(\frac{e^{i2}}{e^{i1}}\right) & \text{si } e^{i1} > 0, \\ \arctan\left(\frac{e^{i2}}{e^{i1}}\right) + \pi & \text{en otro caso}. \end{cases} \] $

dónde \(e_1\) y \(e_2\) son los dos valores propios más grandes de la matriz de correlación.

‘FPC’ para el primer pedido de componente principal.

‘hclust’ para el orden de agrupación jerárquico y ‘hclust.method’ para el método de aglomeración que se utilizará. ‘hclust.method’ debe ser uno de ‘ward’, ‘ward.D’, ‘ward.D2’, ‘single’, ‘complete’, ‘average’, o .’mcquitty’‘median’‘centroid’

‘alphabet’ por orden alfabético.

También puede reordenar la matriz ‘manualmente’ mediante la función corrMatOrder().

Si usa ‘hclust’, corrplot() puede dibujar rectángulos alrededor del gráfico de la matriz de correlación según los resultados de la agrupación jerárquica.

corrplot(M, order = 'hclust', addrect = 2)

corrplot(M, method = 'square', diag = FALSE, order = 'hclust',
         addrect = 3, rect.col = 'blue', rect.lwd = 3, tl.pos = 'd')

La seriación del paquete R proporciona la infraestructura para ordenar objetos con una implementación de varias técnicas de seriación/secuenciación/ordenación para reordenar matrices, matrices de disimilitud y dendrogramas. Para más información, ver en el apartado Referencias.

Podemos reordenar la matriz mediante el paquete de seriación y luego corregirla. Aquí hay unos ejemplos.

library(seriation)
## Warning: package 'seriation' was built under R version 4.2.3
list_seriation_methods('matrix')
##  [1] "BEA"       "BEA_TSP"   "CA"        "Heatmap"   "Identity"  "LLE"      
##  [7] "Mean"      "PCA"       "PCA_angle" "Random"    "Reverse"
list_seriation_methods('dist')
##  [1] "ARSA"           "BBURCG"         "BBWRCG"         "Enumerate"     
##  [5] "GSA"            "GW"             "GW_average"     "GW_complete"   
##  [9] "GW_single"      "GW_ward"        "HC"             "HC_average"    
## [13] "HC_complete"    "HC_single"      "HC_ward"        "Identity"      
## [17] "isomap"         "isoMDS"         "MDS"            "MDS_angle"     
## [21] "metaMDS"        "monoMDS"        "OLO"            "OLO_average"   
## [25] "OLO_complete"   "OLO_single"     "OLO_ward"       "QAP_2SUM"      
## [29] "QAP_BAR"        "QAP_Inertia"    "QAP_LS"         "R2E"           
## [33] "Random"         "Reverse"        "Sammon_mapping" "SGD"           
## [37] "Spectral"       "Spectral_norm"  "SPIN_NH"        "SPIN_STS"      
## [41] "TSP"            "VAT"
data(Zoo)
Z = cor(Zoo[, -c(15, 17)])

dist2order = function(corr, method, ...) {
  d_corr = as.dist(1 - corr)
  s = seriate(d_corr, method = method, ...)
  i = get_order(s)
  return(i)
}

Los métodos ‘PCA_angle’ y ‘HC’ en seriación son los mismos que ‘AOE’ y ‘hclust’ por separado en corrplot() y corrMatOrder().

Aquí hay algunas tramas después de la seriación.

# Ordenamiento rápido y óptimo de las hojas para agrupaciones jerárquicas
i = dist2order(Z, 'OLO')
corrplot(Z[i, i], cl.pos = 'n')

# Problema de asignación cuadrática
i = dist2order(Z, 'QAP_2SUM')
corrplot(Z[i, i], cl.pos = 'n')

# Escalamiento multidimensional
i = dist2order(Z, 'MDS_nonmetric')
## Warning in get_seriation_method("dist", method): seriation method
## 'MDS_nonmetric' is now deprecated and will be removed in future releases. Using
## `isoMDS`
corrplot(Z[i, i], cl.pos = 'n')

# Recocido simulado
i = dist2order(Z, 'ARSA')
corrplot(Z[i, i], cl.pos = 'n')

# solucionador de TSP
i = dist2order(Z, 'TSP')
corrplot(Z[i, i], cl.pos = 'n')

# seriación espectral
i = dist2order(Z, 'Spectral')
corrplot(Z[i, i], cl.pos = 'n')

## Cambiar espectros de color, leyenda de color y leyenda de texto

Podemos obtener colores secuenciales y divergentes de COL1()y COL2(). Las paletas de colores se toman prestadas del RColorBrewerpaquete.

Aviso : el color medio que sale COL2()se fija en ‘#FFFFFF’(blanco), por lo que podemos visualizar el elemento 0 con color blanco.

COL1(): Obtenga colores secuenciales, adecuados para visualizar una matriz no negativa o no positiva (por ejemplo, matriz en [0, 20], o [-100, -10], o [100, 500]). COL2(): Obtenga colores divergentes, adecuados para visualizar una matriz cuyos elementos son en parte positivos y en parte negativos (por ejemplo, matriz de correlación en [-1, 1] o [-20, 100]). Los colores de los gráficos de correlación se pueden personalizar colen corrplot(). Están distribuidos uniformemente en col.limel intervalo.

col: vector, los colores de los glifos. Están distribuidos uniformemente en col.limel intervalo. Por defecto, Si is.corres TRUE, colserá COL2(‘RdBu’, 200). Si is.corres así FALSE, y corres una matriz no negativa ni positiva, colserá COL1(‘YlOrBr’, 200); de lo contrario (los elementos son en parte positivos y en parte negativos), colserá COL2(‘RdBu’, 200). col.lim: el intervalo de límites (x1, x2) para asignar color por col. Por defecto, col.limserá c(-1, 1)cuando is.corrsea TRUE, col.limserá c(min(corr), max(corr))cuando is.corrsea FALSE. AVISO : si establece col.limcuándo is.corres TRUE, la asignación de colores aún se distribuye uniformemente en [-1, 1], solo afecta la visualización en la leyenda de color. is.corr: lógico, ya sea que la matriz de entrada sea una matriz de correlación o no. El valor predeterminado es TRUE. Podemos visualizar una matriz de no correlación configurando is.corr = FALSE. Aquí se muestran a continuación todos los colores divergentes COL2()y secuenciales .COL1()

Colores divergentes :


Colores secuenciales :

Uso de COL1()y COL2():

COL1(sequential = c("Oranges", "Purples", "Reds", "Blues", "Greens", 
                    "Greys", "OrRd", "YlOrRd", "YlOrBr", "YlGn"), n = 200)
##   [1] "#FFF5EB" "#FEF4E9" "#FEF3E8" "#FEF3E7" "#FEF2E6" "#FEF1E5" "#FEF1E4"
##   [8] "#FEF0E2" "#FEF0E1" "#FEEFE0" "#FEEEDF" "#FEEEDE" "#FEEDDD" "#FEEDDB"
##  [15] "#FEECDA" "#FEEBD9" "#FEEBD8" "#FEEAD7" "#FEEAD6" "#FEE9D4" "#FEE8D3"
##  [22] "#FEE8D2" "#FEE7D1" "#FEE7D0" "#FEE6CF" "#FDE5CD" "#FDE5CC" "#FDE4CA"
##  [29] "#FDE3C8" "#FDE2C6" "#FDE1C4" "#FDE0C3" "#FDDFC1" "#FDDEBF" "#FDDDBD"
##  [36] "#FDDDBC" "#FDDCBA" "#FDDBB8" "#FDDAB6" "#FDD9B5" "#FDD8B3" "#FDD7B1"
##  [43] "#FDD6AF" "#FDD5AD" "#FDD5AC" "#FDD4AA" "#FDD3A8" "#FDD2A6" "#FDD1A5"
##  [50] "#FDD0A3" "#FDCFA1" "#FDCE9F" "#FDCC9D" "#FDCB9A" "#FDCA98" "#FDC896"
##  [57] "#FDC794" "#FDC691" "#FDC48F" "#FDC38D" "#FDC18B" "#FDC089" "#FDBF86"
##  [64] "#FDBD84" "#FDBC82" "#FDBB80" "#FDB97E" "#FDB87B" "#FDB779" "#FDB577"
##  [71] "#FDB475" "#FDB273" "#FDB170" "#FDB06E" "#FDAE6C" "#FDAD6A" "#FDAC68"
##  [78] "#FDAA66" "#FDA964" "#FDA862" "#FDA660" "#FDA55E" "#FDA45D" "#FDA25B"
##  [85] "#FDA159" "#FDA057" "#FD9E55" "#FD9D53" "#FD9C51" "#FD9A4F" "#FD994D"
##  [92] "#FD984C" "#FD964A" "#FD9548" "#FD9446" "#FD9244" "#FD9142" "#FD9040"
##  [99] "#FD8E3E" "#FD8D3C" "#FC8C3B" "#FC8A39" "#FB8937" "#FB8736" "#FA8634"
## [106] "#FA8532" "#F98331" "#F9822F" "#F8802D" "#F87F2C" "#F77D2A" "#F77C29"
## [113] "#F67A27" "#F67925" "#F67824" "#F57622" "#F57520" "#F4731F" "#F4721D"
## [120] "#F3701B" "#F36F1A" "#F26D18" "#F26C16" "#F16A15" "#F16913" "#F06812"
## [127] "#EF6611" "#EE6511" "#ED6410" "#EC620F" "#EB610E" "#EA600E" "#E95E0D"
## [134] "#E85D0C" "#E75C0C" "#E65A0B" "#E5590A" "#E45809" "#E35609" "#E25508"
## [141] "#E15407" "#E05206" "#DF5106" "#DF5005" "#DE4E04" "#DD4D04" "#DC4C03"
## [148] "#DB4A02" "#DA4901" "#D94801" "#D74701" "#D54601" "#D34601" "#D14501"
## [155] "#CF4401" "#CD4301" "#CB4301" "#C94201" "#C74101" "#C54001" "#C24001"
## [162] "#C03F01" "#BE3E02" "#BC3E02" "#BA3D02" "#B83C02" "#B63B02" "#B43B02"
## [169] "#B23A02" "#B03902" "#AE3802" "#AC3802" "#AA3702" "#A83602" "#A63602"
## [176] "#A43503" "#A33403" "#A13403" "#9F3303" "#9E3303" "#9C3203" "#9B3103"
## [183] "#993103" "#983003" "#963003" "#942F03" "#932E03" "#912E03" "#902D03"
## [190] "#8E2D03" "#8D2C03" "#8B2B03" "#892B03" "#882A03" "#862A03" "#852903"
## [197] "#832803" "#822803" "#802703" "#7F2704"
COL2(diverging = c("RdBu", "BrBG", "PiYG", "PRGn", "PuOr", "RdYlBu"), n = 200)
##   [1] "#67001F" "#6A011F" "#6E0220" "#720320" "#760421" "#790622" "#7D0722"
##   [8] "#810823" "#850923" "#880A24" "#8C0C25" "#900D25" "#940E26" "#970F26"
##  [15] "#9B1027" "#9F1228" "#A31328" "#A71429" "#AA1529" "#AE162A" "#B2182B"
##  [22] "#B31B2C" "#B51F2E" "#B72330" "#B92632" "#BB2A33" "#BD2E35" "#BE3137"
##  [29] "#C03538" "#C2383A" "#C43C3C" "#C6403D" "#C7433F" "#C94741" "#CB4B43"
##  [36] "#CD4E44" "#CF5246" "#D05548" "#D25949" "#D45D4B" "#D6604D" "#D76450"
##  [43] "#D96752" "#DA6B55" "#DC6E58" "#DD725A" "#DF755D" "#E07860" "#E27C62"
##  [50] "#E37F65" "#E58368" "#E6866A" "#E88A6D" "#E98D70" "#EB9172" "#EC9475"
##  [57] "#EE9878" "#EF9B7A" "#F19F7D" "#F2A280" "#F4A583" "#F4A886" "#F5AB89"
##  [64] "#F5AD8D" "#F5B090" "#F6B394" "#F6B697" "#F7B89B" "#F7BB9E" "#F8BEA2"
##  [71] "#F8C0A5" "#F9C3A9" "#F9C6AC" "#FAC9B0" "#FACBB3" "#FACEB7" "#FBD1BA"
##  [78] "#FBD3BD" "#FCD6C1" "#FCD9C4" "#FDDBC8" "#FDDDCA" "#FDDFCD" "#FDE1D0"
##  [85] "#FDE2D3" "#FDE4D6" "#FDE6D9" "#FDE8DB" "#FDEADE" "#FDECE1" "#FEEDE4"
##  [92] "#FEEFE7" "#FEF1E9" "#FEF3EC" "#FEF5EF" "#FEF6F2" "#FEF8F5" "#FEFAF7"
##  [99] "#FEFCFA" "#FEFEFD" "#FDFEFE" "#FBFDFD" "#F9FBFD" "#F6FAFC" "#F4F9FB"
## [106] "#F2F7FA" "#EFF6FA" "#EDF5F9" "#EBF3F8" "#E9F2F7" "#E6F1F7" "#E4EFF6"
## [113] "#E2EEF5" "#DFEDF4" "#DDECF4" "#DBEAF3" "#D8E9F2" "#D6E8F1" "#D4E6F1"
## [120] "#D1E5F0" "#CFE4EF" "#CBE2EE" "#C8E0ED" "#C5DFEC" "#C2DDEB" "#BFDBEA"
## [127] "#BCDAEA" "#B8D8E9" "#B5D7E8" "#B2D5E7" "#AFD3E6" "#ACD2E5" "#A9D0E4"
## [134] "#A5CFE3" "#A2CDE2" "#9FCBE1" "#9CCAE0" "#99C8E0" "#96C7DF" "#92C5DE"
## [141] "#8FC3DD" "#8BC0DB" "#87BEDA" "#83BBD8" "#7FB9D7" "#7BB6D6" "#77B4D4"
## [148] "#73B1D3" "#6FAFD2" "#6BACD0" "#67AACF" "#63A7CE" "#5FA5CC" "#5BA2CB"
## [155] "#57A0CA" "#539DC8" "#4F9BC7" "#4B98C5" "#4796C4" "#4393C3" "#4191C2"
## [162] "#3F8EC0" "#3E8CBF" "#3C8ABE" "#3A88BD" "#3985BC" "#3783BB" "#3581B9"
## [169] "#337FB8" "#327CB7" "#307AB6" "#2E78B5" "#2D76B4" "#2B73B3" "#2971B1"
## [176] "#286FB0" "#266DAF" "#246AAE" "#2268AD" "#2166AC" "#1F63A8" "#1E60A4"
## [183] "#1C5EA1" "#1B5B9D" "#1A5899" "#185595" "#175391" "#15508E" "#144D8A"
## [190] "#134B86" "#114882" "#10457F" "#0E427B" "#0D4077" "#0C3D73" "#0A3A70"
## [197] "#09386C" "#073568" "#063264" "#053061"

Además, la función colorRampPalette()es muy conveniente para generar espectro de colores.

El grupo de parámetros cl.*es para leyenda de color. Los de uso común son:

cl.poses para la posición de las etiquetas de color. Es de carácter o lógico. Si es carácter, debe ser uno de ‘r’(significa derecho, predeterminado si type=‘upper’o ’full’), ‘b’(significa abajo, predeterminado si type=‘lower’) o ‘n’(significa no dibujar etiqueta de color). cl.ratioes para justificar el ancho de la leyenda del color, se sugiere 0,1~0,2. El grupo de parámetros cl.* es para leyenda de texto. Los de uso común son:

tl.poses para la posición de las etiquetas de texto. Es de carácter o lógico. Si es carácter, debe ser uno de ‘lt’, ‘ld’, ‘td’, o . (predeterminado si ) significa izquierda y arriba, (predeterminado si ) significa izquierda y diagonal, (predeterminado si ) significa arriba y diagonal (cerca), significa diagonal, significa izquierda, significa no agregar etiqueta de texto.’d’‘l’‘n’‘lt’type=’full’‘ld’type=’lower’‘td’type=’upper’‘d’‘l’‘n’ tl.cexes para el tamaño de la etiqueta de texto (nombres de variables). tl.srtes para la rotación de la cadena de etiquetas de texto en grados.

corrplot(M, order = 'AOE', col = COL2('RdBu', 10))

corrplot(M, order = 'AOE', addCoef.col = 'black', tl.pos = 'd',
         cl.pos = 'n', col = COL2('PiYG'))

corrplot(M, method = 'square', order = 'AOE', addCoef.col = 'black', tl.pos = 'd',
         cl.pos = 'n', col = COL2('BrBG'))

## leyenda de color inferior, leyenda de texto diagonal, rotar etiqueta de texto
corrplot(M, order = 'AOE', cl.pos = 'b', tl.pos = 'd',
         col = COL2('PRGn'), diag = FALSE)

## etiquetas de texto giradas 45 grados y leyenda de color más amplia con números ## alineados a la derecha
corrplot(M, type = 'lower', order = 'hclust', tl.col = 'black',
         cl.ratio = 0.2, tl.srt = 45, col = COL2('PuOr', 10))

## eliminar leyenda de color, leyenda de texto y glifo diagonal principal
corrplot(M, order = 'AOE', cl.pos = 'n', tl.pos = 'n',
         col = c('white', 'black'), bg = 'gold2')