💬

【Plot】[pheatmap] 有意差アスタリスクをヒートマップ内に表示

2023/03/10に公開

ライブラリ

library(pheatmap)
library(psych)

各変数間の相関係数をヒートマップで表す

相関係数を算出するcor()関数をdata.frameに対して行うと、各列間の相関係数が算出できます。
mtcarsデータを使って実行してみます。

cor(mtcars)

この相関係数matrixをpheatmap()で図示すると相関関係をわかりやすく表現できます。

pheatmap(cor(mtcars))

相関検定

相関検定を行うcor.test()関数は2つのベクトルにしか対応していません。

data.frameの各列間の相関検定を行うにはpsychパッケージのcorr.test()関数が使用できます。
もしくはppcorパッケージのpcor()関数で偏相関係数の検定をしても良いでしょう。(ここでは解説しません。)

corr.testの引数確認
args(corr.test)

デフォルトではpearson相関検定をpairwiseに行い、多重検定補正はholm法で行います。

corr.testの実行
hoge <- corr.test(mtcars)

corr.test()の返り値はリストです。
rに相関係数、p.adjに調整済みp値が保存されています。

corr.test出力の中身

pheatmap用にp値のmatrixを成型

この調整済みp値を使ってヒートマップ上に有意水準の*を入れていきたいのですが、上三角行列の値のベクトルになっており、調整済みp値は (行数 * 列数 - 対角成分数)/2 の数しかありません。

まずは調整済みp値を本来の行列サイズにしていきます。

調整済みp値のmatrix作成
# 同じサイズのNAのmatrixを用意
tmp <- matrix(data = NA, nrow = nrow(hoge$p), ncol = ncol(hoge$p))
# 上三角行列に調整済みp値を代入
tmp[upper.tri(tmp)] <- hoge$p.adj

# 上三角行列を転置して、下三角行列に変換 (上三角行列の箇所はNA)
p <- t(tmp)
# 上三角行列のNAの箇所に調整済みp値を代入
p[upper.tri(p)] <- hoge$p.adj


完成した調整済みp値のmatrix
ちなみに、corr.test()の返り値pの行列は上三角が調整済みp値で下三角が調整前のp値なので、以下のようにしても同様の結果になります。

p値matrixの下三角に上三角の値を入れる
p <- t(hoge$p)
p[upper.tri(p)] <- hoge$p[upper.tri(hoge$p)]
# 対角成分の値が0になっているのでNAにしておく
diag(p) <- NA

次にp値の値に応じて*や空白セルに変換していきます。

値を記号に変換
for(i in 1:nrow(p)){
    for(j in 1:ncol(p)){
        tmp <- as.numeric(p[i,j])
        if(is.na(tmp)){
            symbol <- ""
        } else if(tmp < 0.001){
            symbol <- "***"
        } else if(tmp < 0.01){
            symbol <- "**"
        } else if(tmp < 0.05){
            symbol <- "*"
        } else{
            symbol <- ""
        }
        p[i,j] <- symbol
    }
}

最後にpheatmap()display_numbers=引数に上記で作成したmatrixを指定して完成です。

display_numbers引数
pheatmap(hoge$r, display_numbers = p)

Discussion