TMS - 6 months ago 49

R Question

I like to use correlation plot using

`corrplot`

`addCoef.col`

`addCoefasPercent = TRUE`

`insig = "blank"`

`set.seed(123)`

par(cex=0.8) # trick for cor. coef font size, see http://stackoverflow.com/q/26574054/684229

col1 <-rainbow(100, s = 1, v = 1, start = 0, end = 0.9, alpha = 1)

test <- matrix(data=rnorm(400),nrow=20,ncol=20)

cor.mtest <- function(mat, conf.level = 0.95){

mat <- as.matrix(mat)

n <- ncol(mat)

p.mat <- lowCI.mat <- uppCI.mat <- matrix(NA, n, n)

diag(p.mat) <- 0

diag(lowCI.mat) <- diag(uppCI.mat) <- 1

for(i in 1:(n-1)){

for(j in (i+1):n){

tmp <- cor.test(mat[,i], mat[,j], conf.level = conf.level)

p.mat[i,j] <- p.mat[j,i] <- tmp$p.value

lowCI.mat[i,j] <- lowCI.mat[j,i] <- tmp$conf.int[1]

uppCI.mat[i,j] <- uppCI.mat[j,i] <- tmp$conf.int[2]

}

}

return(list(p.mat, lowCI.mat, uppCI.mat))

}

cor1 <- cor.mtest(test, 0.95)

corrplot(cor(test), p.mat = cor1[[1]], insig = "blank", method = "color", addCoef.col="grey",

order = "AOE", tl.cex = 1/par("cex"),

cl.cex = 1/par("cex"), addCoefasPercent = TRUE)

Now you can see that the coefficients are printed also for the insignificant cells:

Just to see which cells are insignificant, you can use this command:

`corrplot(cor(test), p.mat = cor1[[1]], insig = "pch", method = "color", addCoef.col="grey",`

order = "AOE", tl.cex = 1/par("cex"),

cl.cex = 1/par("cex"), addCoefasPercent = TRUE)

Perhaps this is a bug of corrplot package?

Answer

You have to do a little work for this. You need to define a vector of colours manually for the p-values, that is passed to `addCoef.col`

If you were ordering alphabetically, it is straight forward

```
mycol <- ifelse(c(cor1[[1]] < 0.05), "black", "white")
corrplot(cor(test), p.mat = cor1[[1]] , insig = "blank", method = "color",
addCoef.col=mycol ,
order = "original", tl.cex = 1/par("cex"),
cl.cex = 1/par("cex"), addCoefasPercent = TRUE)
```

But as you want to order by the eigenvalues you need to calculate the ordering outside of the `corrplot`

function

```
ord <- corrMatOrder(cor(test), order="AOE")
M <- cor(test)[ord, ord]
pval <- psych::corr.test(data.frame(test), adjust="none")$p[ord, ord]
mycol <- ifelse(c(pval < 0.05), "black", "white")
corrplot(M, p.mat = pval , insig = "blank", method = "color", addCoef.col=mycol ,
order = "original", tl.cex = 1/par("cex"),
cl.cex = 1/par("cex"), addCoefasPercent = TRUE)
```

**EDIT** re @Masi's comments

There doesn't seem to be an easy way to pass new labels to the colourbar, so that they are in range when coefficients have been added as percent. However, this option just multiplies the coefficients by 100, so we can use this quick approach.

Using the first example above

```
# First plot we multiply the correlation matrix by 100
# set arguments is.corr, and cl.lim, and suppress coefficients
# don't really need the round if setting the range [-100, 100] but perhaps useful for other ranges
corrplot(round(100* cor(test), 1), p.mat = cor1[[1]] , insig = "blank", method = "color",
addCoef.col=NULL ,order = "original", is.corr=FALSE, cl.lim=c(-100, 100))
# Add second plot suppressing the colourbar
corrplot(cor(test), p.mat = cor1[[1]] , insig = "blank", method = "color",
addCoef.col=mycol , addCoefasPercent=TRUE, order = "original", cl.pos="n", add=TRUE)
```