高次元データを次元削減したうえでクラスターを真面目に検出する

MikuHatsune2017-10-06

読んだ。
ClusterSignificance: a bioconductor package facilitating statistical analysis of class cluster separations in dimensionality reduced data
Bioinformatics. 2017 Oct 1;33(19):3126-3128.
 
オミックス解析などをすると複数パラメータの高次元データが得られるが、これをPCAやtSNE をして適当に次元削減して3次元プロットはよくする。
このとき、既にラベルが与えられている(病気の症例など)のを、3次元空間になったから目で見てそれっぽいクラスターになっているよね、と判断するのではなく、ノンパラメトリックに解析してクラスターが分かれていることを示すパッケージがClusterSignificance である。
 
いま、適当に次元削減されて3次元のデータセットに、各点に対してclass のラベル付けがある。
はじめに、principal curve progection (Pcp) という、各点をいい感じに射影する曲線を推定する。これはp (次元削減空間の)次元のarc length を最適化して得られる。そのprincipal curve に直交するように射影すると、結局1次元に次元が落ちる。

 
1次元に値が落ちたので、各ラベルがついていることを利用してROC をする。
定量値として
\textrm{score}=\sqrt{(1-S_n)^2+(1-S_p)^2}
ただしS_n は感度、S_p は特異度である。このスコアが最大になればいい感じにクラスラベルが分かれる感じ。

 
その後、クラスラベルを入れ替えまくってpermutation テストをする。いい感じに分かれるなら次元削減空間でもクラス分けができるし、このpermutation の結果をp値としても扱える。

 
全体的にはこんな感じ。論文中では血液腫瘍の分類をしていて、MDS とnormal の比較だけが有意なp値にならないっぽいのがそれっぽいと思った。ただし、ペアワイズのpermutation を繰り返しているので、多重検定をいい感じに補正できないのかな、と思った。

 
論文のclass 1-3 とデータセットの1-3 はずれていたっぽい。色がずれている。

library(rgl)
library(ggplot2)
library(ClusterSignificance)
data(pcpMatrix)
##Pcp
printMat <- pcpMatrix
classes <- rownames(pcpMatrix)
dimnames(printMat) <- list(classes, paste("dim", 1:3, sep=""))
classes <- rownames(pcpMatrix)

## Run Pcp and plot.
prj <- pcp(pcpMatrix, classes)
plot(prj)

cols <- c("yellow3", "green2", "red2")
plot3d(pcpMatrix, type="s", col=cols[c(factor(classes))])
lines3d(prj@line, col="blue", lwd=3)

## 
cl <- classify(prj)
plot(cl)

iterations <- 100 ## Set the number of iterations.

## Permute and plot.
pe <- permute(
    mat = pcpMatrix, 
    iter = iterations, 
    classes = classes, 
    projmethod = "pcp"
)

plot(pe)