Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Exploratory Data Analysis with Unsupervised Machine Learning

onouyek
October 23, 2020

Exploratory Data Analysis with Unsupervised Machine Learning

onouyek

October 23, 2020
Tweet

More Decks by onouyek

Other Decks in Technology

Transcript

  1. 距離概念 相関距離 1 − ピアソンの相関係数 発現が似ている場合は相関が高いので、相 関距離は小さくなる 発現パターンが異なる場合は相関距離は大 きくなる #

    相関距離 as.dist(1-cor(t(df))) ## patient1 patient2 patient3 ## patient2 0.004129405 ## patient3 1.988522468 1.970725343 ## patient4 1.988522468 1.970725343 0.000000000
  2. スケーリング ある遺伝子の発現量が他の遺伝子の発現量よ りもはるかに高い場合、スケーリング(正規化) をする必要がある。 ただし、スケーリングを適用するかどうかはデー タと何を目的とするかによる。 scale(df) ## IRX4 OCT4

    PAX6 ## patient1 0.6932522 0.5212860 -1.0733721 ## patient2 1.0194886 1.1468293 -0.6214260 ## patient3 -0.7748113 -0.7298004 0.9603856 ## patient4 -0.9379295 -0.9383149 0.7344125 ## attr(,"scaled:center") ## IRX4 OCT4 PAX6 ## 6.75 7.50 5.75 ## attr(,"scaled:scale") ## IRX4 OCT4 PAX6 ## 6.130525 4.795832 4.425306
  3. 階層的クラスタリング 白血病または非白血病の 60患者の 骨髄サンプルの遺伝子発現データ library(pheatmap) # 変動の大きいトップ 1000遺伝子のみを使用 expFile=system.file("extdata","leukemiaExpressionSu bset.rds",package="compGenomRData"

    ) mat=readRDS(expFile) # 白血病のタイプを指定 annotation_col = data.frame( LeukemiaType = substr(colnames(mat),1,3)) rownames(annotation_col)= colnames(mat) pheatmap(mat,show_rownames= FALSE, show_colnames= FALSE,annotation_col= annotation_col, scale = "none",clustering_method= "ward.D2", clustering_distance_cols= "euclidean")
  4. k-meansクラスタリング クラスタリングアルゴリズムの 1つ データを事前に決定された k個のクラスターに分割する方 法 「パーティション化」メソッドと呼ばれる。 1. 初期化段階では実際の患者の遺伝子発現分布の境 界内でランダムに選択される。

    2. 各患者は最も近い重心に割り当てられる。 3. 重心がクラスター内の遺伝子の値の平均に設定さ れる。 4. クラスターの重心までの距離の2乗の合計が最小 になるまで繰り返される。 set.seed(101) # kmeans()で患者間の距離を計算 kclu=kmeans(t(mat),centers=5) # 各クラスターのデータポイント数を確認 table(kclu$cluster) ## ## 1 2 3 4 5 ## 12 14 11 12 11
  5. クラスタリング結果の可視化 患者間の距離を多次元尺度構成法(MDS)で視覚化する # 患者間の距離を計算 dists=dist(t(mat)) # MDSを計算 mds=cmdscale(dists) # 2次元空間に患者をプロット

    plot(mds,pch=19,col=rainbow(5)[kclu$cluster]) # クラスターの色を示す凡例を設定 legend("bottomright" , legend=paste("clu",unique(kclu$cluster)), fill=rainbow(5)[unique(kclu$cluster)], border=NA,box.col=NA)
  6. kの選び方(ギャップ統計量) ギャップ統計量:サンプルサイズnの参照分布の変動性と観測されたク ラスター内変動を比較した値 最適なクラスターの場合にギャップ統計量が最大になる。 # cluster::clusGap()関数を使用してギャップ統計を計算 library(cluster) set.seed(101) # クラスタリング関数を定義

    pam1 <- function(x,k) list(cluster = pam(x,k, cluster.only= TRUE)) # ギャップ統計量を計算 pam.gap= clusGap(t(mat), FUN = pam1, K.max = 8,B=50) # 各Kにおけるギャップ統計量をプロット plot(pam.gap, main = "Gap statistic for the 'Leukemia' data" )
  7. 主成分分析(PCA) 高次元データを調べるための最も一般的な手法 新しい座標系の軸がデータの最大分散の方向 を指すように、元のデータ空間(座標)を回転さ せる。 最初のコンポーネントPC1 (Comp.1 ) は、デー タの分散が最も大きい方向を表す。

    2番目のコンポーネントPC2 (Comp.2 ) は、最 初のコンポーネントに直交する残りの分散の最 大値を表す。 # 2つの遺伝子の発現量にPCAを適用 sub.mat=t(mat[rownames(mat) %in% c("ENSG00000100504","ENSG00000105383"),]) pr=princomp(scale(sub.mat)) pr ## Call: ## princomp(x = scale(sub.mat)) ## Standard deviations: ## Comp.1 Comp.2 ## 1.3378898 0.4203778 ## 2 variables and 60 observations.
  8. 非負行列因子分解(NMF) 遺伝子間の関係をプロット library(NMF) # nmf()に3因子を指定 res=NMF::nmf(mat,rank=3,seed="nndsvd") w <- basis(res) #

    basis()でWを取得 h <- coef(res) # coef()でHを取得 # 第1因子に対する第 3因子のプロット plot(h[1,],h[3,],col=as.factor(annot ation_col$LeukemiaType), pch=19)
  9. 多次元尺度構成法(MDS) 古典的なMDSと非計量MDSを使って白血病患者の遺伝子 発現を縮小次元でプロットする。 mds=cmdscale(dist(t(mat))) isomds=MASS ::isoMDS(dist(t(mat))) ## initial value 15.907414

    ## final value 13.462986 ## converged par(mfrow=c(1,2)) plot(mds,pch=19,col=as.factor(annotation_col $LeukemiaType), main="classical MDS" ) plot(isomds$points,pch=19,col=as.factor(anno tation_col$LeukemiaType), main="isotonic MDS")
  10. t-SNE 高次元空間の距離データの情報を低次元空間に表示するデータ 分析手法 全体として距離を最適化しようとするMDSと異なり、ローカル構 造を保持しようとするのが特徴 library("Rtsne") set.seed(42) # perplexityオプションが小さいほどローカル構造がより考慮される tsne_out

    <- Rtsne(t(mat),perplexity=10) # 2次元空間にプロット plot(tsne_out$Y,col=as.factor(annotation_col $LeukemiaType) , pch=19) # 白血病タイプの凡例を追加 legend("bottomleft", legend=unique(annotation_col $LeukemiaType), fill =palette("default"), border=NA,box.col=NA)