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.
## 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.
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.
## corrplot 0.92 loaded
## 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:

## $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:

## $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).