9.2 Presentación de resultados

9.2.1 Tablas y matrices de corrrelaciones

La manera más básica que en R tenemos para obtener una correlación es una tabla. La misma, puede ser obtenida del cáculo de la correlación misma.

mcor<-round(cor(mtcars),2)
mcor
##        mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
## mpg   1.00 -0.85 -0.85 -0.78  0.68 -0.87  0.42  0.66  0.60  0.48 -0.55
## cyl  -0.85  1.00  0.90  0.83 -0.70  0.78 -0.59 -0.81 -0.52 -0.49  0.53
## disp -0.85  0.90  1.00  0.79 -0.71  0.89 -0.43 -0.71 -0.59 -0.56  0.39
## hp   -0.78  0.83  0.79  1.00 -0.45  0.66 -0.71 -0.72 -0.24 -0.13  0.75
## drat  0.68 -0.70 -0.71 -0.45  1.00 -0.71  0.09  0.44  0.71  0.70 -0.09
## wt   -0.87  0.78  0.89  0.66 -0.71  1.00 -0.17 -0.55 -0.69 -0.58  0.43
## qsec  0.42 -0.59 -0.43 -0.71  0.09 -0.17  1.00  0.74 -0.23 -0.21 -0.66
## vs    0.66 -0.81 -0.71 -0.72  0.44 -0.55  0.74  1.00  0.17  0.21 -0.57
## am    0.60 -0.52 -0.59 -0.24  0.71 -0.69 -0.23  0.17  1.00  0.79  0.06
## gear  0.48 -0.49 -0.56 -0.13  0.70 -0.58 -0.21  0.21  0.79  1.00  0.27
## carb -0.55  0.53  0.39  0.75 -0.09  0.43 -0.66 -0.57  0.06  0.27  1.00

Muy bien, pero ¿cómo hacemos para que nuestra tabla esté formateada a nuestro gusto? Con un paquete de R, claro.

library(xtable)

9.2.1.1 Matrices de correlaciones

Recuerda, la función de R que implementamos para producir una matriz de correlaciones, que nos indique la posible relación entre variables que incluyen nuestros modelos estadísticos es “cor”:

cor(x, method = c("pearson", "kendall", "spearman"))

9.2.2 Gráficos de correlaciones

Esta es una manera mucho más sencilla, atractiva y novedosa que las típicas tablas de múltiples filas y columnas que suelen presentarse en algunos trabajos. Las tablas, son la manera más “directa” en la que los programas de análisis estadístico como Stata y SPSS muestran los resultados obtenidos en las correlaciones y análisis univariados/bivariados/multivariados. Sin embargo, veremos un ejemplo más visual para acercarnos al “output” que obtenemos en el programa.

install.packages("corrplot")

source("http://www.sthda.com/upload/rquery_cormat.r")
library(corrplot)
## corrplot 0.92 loaded
data <- mtcars[, c(1,3,4,5,6,7)]

head(data)
##                    mpg disp  hp drat    wt  qsec
## Mazda RX4         21.0  160 110 3.90 2.620 16.46
## Mazda RX4 Wag     21.0  160 110 3.90 2.875 17.02
## Datsun 710        22.8  108  93 3.85 2.320 18.61
## Hornet 4 Drive    21.4  258 110 3.08 3.215 19.44
## Hornet Sportabout 18.7  360 175 3.15 3.440 17.02
## Valiant           18.1  225 105 2.76 3.460 20.22

La función que utilizaremos para obtener un gráfico que represente nuestra matriz (puede ser un correlograma o un “mapa de temperatura o de calor”): rquery.cormat. Pero primero hay que definir la función de la siguiente manera:

rquery.cormat<-function(x,
                        type=c('lower', 'upper', 'full', 'flatten'),
                        graph=TRUE,
                        graphType=c("correlogram", "heatmap"),
                        col=NULL, ...)
{
  library(corrplot)
  # Helper functions
  #+++++++++++++++++
  # Compute the matrix of correlation p-values
  cor.pmat <- function(x, ...) {
    mat <- as.matrix(x)
    n <- ncol(mat)
    p.mat<- matrix(NA, n, n)
    diag(p.mat) <- 0
    for (i in 1:(n - 1)) {
      for (j in (i + 1):n) {
        tmp <- cor.test(mat[, i], mat[, j], ...)
        p.mat[i, j] <- p.mat[j, i] <- tmp$p.value
      }
    }
    colnames(p.mat) <- rownames(p.mat) <- colnames(mat)
    p.mat
  }
  # Get lower triangle of the matrix
  getLower.tri<-function(mat){
    upper<-mat
    upper[upper.tri(mat)]<-""
    mat<-as.data.frame(upper)
    mat
  }
  # Get upper triangle of the matrix
  getUpper.tri<-function(mat){
    lt<-mat
    lt[lower.tri(mat)]<-""
    mat<-as.data.frame(lt)
    mat
  }
  # Get flatten matrix
  flattenCorrMatrix <- function(cormat, pmat) {
    ut <- upper.tri(cormat)
    data.frame(
      row = rownames(cormat)[row(cormat)[ut]],
      column = rownames(cormat)[col(cormat)[ut]],
      cor  =(cormat)[ut],
      p = pmat[ut]
    )
  }
  # Define color
  if (is.null(col)) {
    col <- colorRampPalette(
            c("#67001F", "#B2182B", "#D6604D", "#F4A582",
              "#FDDBC7", "#FFFFFF", "#D1E5F0", "#92C5DE", 
             "#4393C3", "#2166AC", "#053061"))(200)
    col<-rev(col)
  }
  
  # Correlation matrix
  cormat<-signif(cor(x, use = "complete.obs", ...),2)
  pmat<-signif(cor.pmat(x, ...),2)
  # Reorder correlation matrix
  ord<-corrMatOrder(cormat, order="hclust")
  cormat<-cormat[ord, ord]
  pmat<-pmat[ord, ord]
  # Replace correlation coeff by symbols
  sym<-symnum(cormat, abbr.colnames=FALSE)
  # Correlogram
  if(graph & graphType[1]=="correlogram"){
    corrplot(cormat, type=ifelse(type[1]=="flatten", "lower", type[1]),
             tl.col="black", tl.srt=45,col=col,...)
  }
  else if(graphType[1]=="heatmap")
    heatmap(cormat, col=col, symm=TRUE)
  # Get lower/upper triangle
  if(type[1]=="lower"){
    cormat<-getLower.tri(cormat)
    pmat<-getLower.tri(pmat)
  }
  else if(type[1]=="upper"){
    cormat<-getUpper.tri(cormat)
    pmat<-getUpper.tri(pmat)
    sym=t(sym)
  }
  else if(type[1]=="flatten"){
    cormat<-flattenCorrMatrix(cormat, pmat)
    pmat=NULL
    sym=NULL
  }
  list(r=cormat, p=pmat, sym=sym)
}

Una vez que hemos definido esta función, podremos comenzar a utilizarla:

rquery.cormat(data)

## $r
##         hp  disp    wt  qsec  mpg drat
## hp       1                            
## disp  0.79     1                      
## wt    0.66  0.89     1                
## qsec -0.71 -0.43 -0.17     1          
## mpg  -0.78 -0.85 -0.87  0.42    1     
## drat -0.45 -0.71 -0.71 0.091 0.68    1
## 
## $p
##           hp    disp      wt  qsec     mpg drat
## hp         0                                   
## disp 7.1e-08       0                           
## wt   4.1e-05 1.2e-11       0                   
## qsec 5.8e-06   0.013    0.34     0             
## mpg  1.8e-07 9.4e-10 1.3e-10 0.017       0     
## drat    0.01 5.3e-06 4.8e-06  0.62 1.8e-05    0
## 
## $sym
##      hp disp wt qsec mpg drat
## hp   1                       
## disp ,  1                    
## wt   ,  +    1               
## qsec ,  .       1            
## mpg  ,  +    +  .    1       
## drat .  ,    ,       ,   1   
## attr(,"legend")
## [1] 0 ' ' 0.3 '.' 0.6 ',' 0.8 '+' 0.9 '*' 0.95 'B' 1

Análisis de esta matriz de correlaciones:

Componentes:

r: The table of correlation coefficients

p: Table of p-values corresponding to the significance levels of the correlations sym: A representation of the correlation matrix in which coefficients are replaced by symbols according to the strength of the dependence. For more description, see this article: Visualize correlation matrix using symnum function

In the generated graph, negative correlations are in blue and positive ones in red color.

rquery.cormat(data, type="upper") #si sólo queremos el triángulo superior de la matriz de correlaciones

## $r
##      hp disp   wt  qsec   mpg  drat
## hp    1 0.79 0.66 -0.71 -0.78 -0.45
## disp       1 0.89 -0.43 -0.85 -0.71
## wt              1 -0.17 -0.87 -0.71
## qsec                  1  0.42 0.091
## mpg                         1  0.68
## drat                              1
## 
## $p
##      hp    disp      wt    qsec     mpg    drat
## hp    0 7.1e-08 4.1e-05 5.8e-06 1.8e-07    0.01
## disp          0 1.2e-11   0.013 9.4e-10 5.3e-06
## wt                    0    0.34 1.3e-10 4.8e-06
## qsec                          0   0.017    0.62
## mpg                                   0 1.8e-05
## drat                                          0
## 
## $sym
##      hp disp wt qsec mpg drat
## hp   1  ,    ,  ,    ,   .   
## disp    1    +  .    +   ,   
## wt           1       +   ,   
## qsec            1    .       
## mpg                  1   ,   
## drat                     1   
## attr(,"legend")
## [1] 0 ' ' 0.3 '.' 0.6 ',' 0.8 '+' 0.9 '*' 0.95 'B' 1

En cambio, si deseamos obtener la matriz de correlaciones completa, podemos especificarlo:

rquery.cormat(data, type="full")

## $r
##         hp  disp    wt   qsec   mpg   drat
## hp    1.00  0.79  0.66 -0.710 -0.78 -0.450
## disp  0.79  1.00  0.89 -0.430 -0.85 -0.710
## wt    0.66  0.89  1.00 -0.170 -0.87 -0.710
## qsec -0.71 -0.43 -0.17  1.000  0.42  0.091
## mpg  -0.78 -0.85 -0.87  0.420  1.00  0.680
## drat -0.45 -0.71 -0.71  0.091  0.68  1.000
## 
## $p
##           hp    disp      wt    qsec     mpg    drat
## hp   0.0e+00 7.1e-08 4.1e-05 5.8e-06 1.8e-07 1.0e-02
## disp 7.1e-08 0.0e+00 1.2e-11 1.3e-02 9.4e-10 5.3e-06
## wt   4.1e-05 1.2e-11 0.0e+00 3.4e-01 1.3e-10 4.8e-06
## qsec 5.8e-06 1.3e-02 3.4e-01 0.0e+00 1.7e-02 6.2e-01
## mpg  1.8e-07 9.4e-10 1.3e-10 1.7e-02 0.0e+00 1.8e-05
## drat 1.0e-02 5.3e-06 4.8e-06 6.2e-01 1.8e-05 0.0e+00
## 
## $sym
##      hp disp wt qsec mpg drat
## hp   1                       
## disp ,  1                    
## wt   ,  +    1               
## qsec ,  .       1            
## mpg  ,  +    +  .    1       
## drat .  ,    ,       ,   1   
## attr(,"legend")
## [1] 0 ' ' 0.3 '.' 0.6 ',' 0.8 '+' 0.9 '*' 0.95 'B' 1

Para que nuestro gráfico quede más bonito:

col<- colorRampPalette(c("blue", "white", "red"))(20)
cormat <- rquery.cormat(data, type="full", col=col)

Entonces, básicamente, describamos la matriz de correlaciones y su formato:

rquery.cormat(data, type=c('lower', 'upper', 'full', 'flatten'), graph=TRUE, graphType=c("correlogram", "heatmap"), col=NULL, ...)

x: matriz

type: possible values are “lower” (default), “upper”, “full” or “flatten”; display lower or upper triangular of the matrix, full or flatten matrix.

graph: si elegimos TRUE, el correlograma o “mapa de calor” (heatmap) el gráfico será presentado en una u otra manera (graphType)

col: colores para usar el correlograma

: otros argumentos pueden ser utilizados de las funciones cor o cor.test

En cuanto a los resultados, incluyen los componentes que antes señalamos: r, sym (el último es el número simbólico que codifica de la matriz de correlaciones).