Hi,

i'm looking for code or ideas to draw correlation heatmap (spearman) with pvalue significances (*, **, ***), such as the picture i send here.

thank you --

Hi,

i'm looking for code or ideas to draw correlation heatmap (spearman) with pvalue significances (*, **, ***), such as the picture i send here.

thank you --

There are 3 questions in here:

- how to get the Spearman correlation coefficients, you can use
`cor(x, y, method = "spearman")`

- how to compute the p-values, that will depend on your context, the most natural one is probably
`cor.test(x, y, method = "spearman")`

- how to how to draw a heatmap with the stars, here you can use
`pheatmap()`

in the eponymous package, and use`display_numbers = matrix`

where you precompute a matrix with the appropriate number of stars.

Of course since you have a lot of computations to make, you might need to use a `for`

loop or similar to do all these, the easiest approach depends on what your data looks like.

Here is an example code (generic code though, you may need to change the test etc to suit your situation):

```
library(pheatmap)
set.seed(123)
# create some fake data
nb_samples <- 50
metabolites <- data.frame(LysoPC = runif(nb_samples, 0, 100),
PE = runif(nb_samples, 0, 100))
echocardiographic_parameters <- data.frame(LVEDD = 5 * metabolites$LysoPC + rnorm(nb_samples,sd = .01),
LVEF = 2 * metabolites$PE - 3 * metabolites$LysoPC + rnorm(nb_samples, sd = .1))
# initialize empty matrices
mat_cor <- mat_pval <- mat_signif <- matrix(NA,
nrow = ncol(metabolites),
ncol = ncol(echocardiographic_parameters),
dimnames = list(colnames(metabolites),
colnames(echocardiographic_parameters)))
# for each pair, compute one cell of the matrice
for(metab in colnames(metabolites)){
for(param in colnames(echocardiographic_parameters)){
# correlation coefficient
mat_cor[metab, param] <- cor(metabolites[[metab]],
echocardiographic_parameters[[param]],
method = "spearman")
# pvalue
pval <- cor.test(metabolites[[metab]],
echocardiographic_parameters[[param]],
method = "spearman")[["p.value"]]
# decide nb of stars
if(pval >= 0.05){
stars <- ""
} else if(pval >= 0.01){
stars <- "*"
} else if(pval >= 1e-3){
stars <- "**"
} else{
stars <- "***"
}
# save pvalue and stars in the corresponding matrices
mat_pval[metab, param] <- pval
mat_signif[metab, param] <- stars
}
}
# check that we could have directly computed all the coefficients without a loop
all.equal(
mat_cor,
cor(metabolites,
echocardiographic_parameters,
method = "spearman")
)
#> [1] TRUE
pheatmap(mat_cor,
display_numbers = mat_signif,
fontsize_number = 20)
```

^{Created on 2023-11-06 with reprex v2.0.2}

Hi, sorry for the delay.

yes, congratulation,

this is what i want to obtain, I'll try to reproduce your method using matrices like you.

thank you so much.