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

【第5回】ゼロから始めるゲノム解析(R編)

nkimoto
December 06, 2020

 【第5回】ゼロから始めるゲノム解析(R編)

2020/11/13 (金) 【第5回】ゼロから始めるゲノム解析(R編) 資料
https://bioalgorithms.connpass.com/event/194202/

nkimoto

December 06, 2020
Tweet

More Decks by nkimoto

Other Decks in Science

Transcript

  1. • クロマチン構造と発現量との関係性を研究 するために、新規の定量的モデルを考案し た。 • 測定された遺伝子発現量は、開発したモデ ルによってPearsonの相関係数0.79~0.88 の精度で予測された。 • 遺伝子の90.44%を「オン/オフ」のカテゴリ

    に正しく分類した。このモデルの精度は、 AUC=0.95だった。 • H3K9acやH3K4me3などのヒストン修飾は、 遺伝子のオン/オフを特定するために重要 だが、H3K79me2およびH3K36me3などの ヒトン修飾は、遺伝子量の予測にとってより 重要。 応用例①エピジェネティックな修飾から遺伝子発現を予測 Dong, Greven, Kundaje, et al. 2012. “Modeling gene expression using chromatin features in various cellular contexts.” Genome Biol. 13 (9): R53.
  2. • 特定のDNA調節領域でのヒストン修飾は、 遺伝子の活性化、不活性化、およびポージ ングに関連している。 • ChromaGenSVMと呼ばれる遺伝的アルゴリ ズムの最適化と組み合わせたサポートベク ターマシンを使用したクロマチン状態検出 の手法を開発した。 •

    ChromaGenSVMは、ENCODE projectで 実験的に確認されたHeLa細胞のエンハン サーの88%を予測した。 • エンハンサーがヒストンのメチル化とアセチ ル化の特定の組み合わせによって最もよく 予測されることを示した。 応用例②エンハンサーまたは他の調節領域の予測 Fernandez, and Miranda-Saavedra. 2012. “Genome-wide enhancer prediction from epigenetic signatures using genetic algorithm-optimized support vector machines.” Nucleic Acids Res. 40 (10): e77.
  3. The Cancer Genome Atlasの神経膠芽腫腫瘍サンプルの遺伝子発現データを用いて、 CIMPサブタイプを持っているかを予測するモデルを構築 入力データ # 遺伝子発現量のファイルを読み込む fileLGGexp=system.file("extdata", "LGGrnaseq.rds"

    , package="compGenomRData" ) # 遺伝子発現量 gexp=readRDS(fileLGGexp) head(gexp[,1:5]) ## TCGA-CS-4941 TCGA-CS-4944 TCGA-CS-5393 TCGA-CS-5394 TCGA-CS-5395 ## A1BG 72.2326 24.7132 46.3789 37.9659 19.5162 ## A1CF 0.0000 0.0000 0.0000 0.0000 0.0000 ## A2BP1 524.4997 105.4092 323.5828 19.7390 299.5375 ## A2LD1 144.0856 18.0154 29.0942 7.5945 202.1231 ## A2ML1 521.3941 159.3746 164.6157 63.5664 953.4106 ## A2M 17944.7205 10894.9590 16480.1130 9217.7919 10801.8461 # 患者のアノテーション情報のファイルを読み込む fileLGGann=system.file("extdata", "patient2LGGsubtypes.rds" , package="compGenomRData" ) # 患者のアノテーション情報 patient=readRDS(fileLGGann) head(patient) ## subtype ## TCGA-FG-8185 CIMP ## TCGA-DB-5276 CIMP ## TCGA-P5-A77X CIMP ## TCGA-IK-8125 CIMP ## TCGA-DU-A5TR CIMP ## TCGA-E1-5311 CIMP
  4. 対数変換により扱いやすい分布に変換する。 データ前処理(変換) par(mfrow=c(1,2)) # 5番目の患者について、遺伝子発現量の分布を可視化する hist(gexp[,5],xlab="gene expression" ,main="", border="blue4", col="cornflowerblue"

    ) # 5番目の患者について、対数変換した遺伝子発現量の分布を可視化する hist(log10(gexp+1)[,5], xlab="gene expression log scale" , main="", border="blue4",col="cornflowerblue" ) 対数変換 gexp=log10(gexp+1) ※発現量が0の場合でも扱えるように 1を足す
  5. 変動の少ない説明変数は目的変数を予測する上で重要でないと考えられる。 計算速度を低下させる要因となるため、前処理で除去することを検討する。 データ前処理(外れ値の除去) # データセットを転置する tgexp <- t(gexp) library(caret) #

    85% の値が等しい分散がほぼゼロの列を削除する # この関数はフィルターを作成するのみで、適用はまだ nzv=preProcess(tgexp,method="nzv",uniqueCut = 15) # "predict" 関数を用いてフィルターを適用する # nzv_tgexp 変数にフィルタリング後のデータフレームを代入する nzv_tgexp=predict(nzv,tgexp)
  6. 変動の大きさについて、任意のカットオフ値を選択することもできる。 下記では、上位1000個の変数予測子を選択する。 データ前処理(外れ値の除去) par(mfrow=c(1,2)) # 5番目の患者について、フィルタリング前の遺伝子発現量の分布を可視化する hist(tgexp[,5],xlab="gene expression" ,main="", border="blue4",

    col="cornflowerblue" ) # 発現量上位1000個の遺伝子にフィルタリング SDs=apply(tgexp,2,sd ) topPreds=order(SDs,decreasing = TRUE)[1:1000] tgexp=tgexp[,topPreds] # 5番目の患者について、フィルタリング後の遺伝子発現量の分布を可視化する hist(tgexp[,5],xlab="gene expression" ,main="", border="blue4", col="cornflowerblue" ) 外れ値除去
  7. 変動の大きさについて、任意のカットオフ値を選択することもできる。 標準化により、全ての予測変数の平均は0、標準偏差は1になる。 この処理は通常、一部の計算の数値安定性を向上させるために使用される。 データ前処理(標準化) par(mfrow=c(1,2)) # 5番目の患者について、標準化前の遺伝子発現量の分布を可視化する hist(tgexp[,5],xlab="gene expression" ,main="",

    border="blue4", col="cornflowerblue" ) # 遺伝子発現量を標準化 library(caret) processCenter= preProcess(tgexp, method = c("center")) tgexp=predict(processCenter,tgexp) # 5番目の患者について、標準化後の遺伝子発現量の分布を可視化する hist(tgexp[,5],xlab="gene expression" ,main="", border="blue4", col="cornflowerblue" ) 標準化
  8. 実験中の技術的な問題により、特定の遺伝子やゲノム位置の値がない場合(欠落値) が起こり得る。中央値や平均値、最近傍で補完することが一般的。 データ前処理(欠損値除去) # 欠損値が存在するデータを生成 missing_tgexp=tgexp missing_tgexp[ 1,1]=NA anyNA(missing_tgexp) #

    欠損値が存在するか確認 ## [1] TRUE # 欠損値を抽出 gexpnoNA=missing_tgexp[ , colSums(is.na(missing_tgexp)) == 0] # 中央値で補完 library(caret) mImpute=preProcess(missing_tgexp, method="medianImpute" ) imputedGexp=predict(mImpute,missing_tgexp) # 最近傍で補完 library(RANN) knnImpute=preProcess(missing_tgexp, method="knnImpute") knnimputedGexp= predict(knnImpute,missing_tgexp)
  9. 一般的なデータ分割手法。 単純にデータセットを学習データとテストデータに分割する。 データの分割 - ホールドアウト法 tgexp=merge(patient,tgexp, by="row.names") # push sample

    ids back to the row names rownames(tgexp)=tgexp[, 1] tgexp=tgexp[,-1] set.seed(3031) # シード値の設定 # データの70%について、インデックスを取得 intrain <- createDataPartition(y = tgexp[,1], p= 0.7)[[1]] # 学習データとテストデータを分割 training <- tgexp[intrain,] testing <- tgexp[-intrain,] 他の手法 • 交差検証 (Cross Validation) • ブートストラップ法
  10. モデルを評価する際は、いくつかの指標を用いることができる。 二値分類で使用される指標は、以下の表の通り。 モデルの評価 True Positive (TP) False Positive (FP) False

    Negative (FN) True Negative (TN) Sensitivity Specificity Precision = Predicted as CIMP Predicted as noCIMP Actual CIMP Actual noCIMP ※正例、負例に偏りがある場合、これ らの指標はうまく機能しない。 例) 90個のCIMPのnoCIMPがある場合、すべて のサンプルをCIMPとして分類するとPrecisionは 0.9となる。
  11. 不均衡なデータではSpecificityやPrecisionの代わりに、 下記のような指標が用いられる。 モデルの評価 Balanced Accuracy カッパ係数 平均正解率。バランスの取れた精度の評価指標。 Brodersen, K.H.; Ong,

    C.S.; Stephan, K.E.; Buhmann, J.M. (2010). The balanced accuracy and its posterior distribution. Proceedings of the 20th International Conference on Pattern Recognition, 3121-24. 多クラス分類問題にも適用可能。ランダムな分類モデルと比較 した際にどれだけパフォーマンスが良いかを示す指標 Pr(a): 観察された一致率 Pr(e): 期待一致率 McHugh ML. Interrater reliability: the kappa statistic. Biochem Med (Zagreb). 2012;22(3):276-82. Landis, J.R.; Koch, G.G. (1977). “The measurement of observer agreement for categorical data”. Biometrics 33 (1): 159–174
  12. Rでモデルの各指標を確認するには、 caret :: confusionMatrix()関数を用いる モデルの評価 # 学習データに対して、 k=5のk-NN 実行結果を取得 knnFit=knn3(x=training[,-1],

    # training set y=training[,1], # training set class labels k=5) # 学習データに対して推測を実行 trainPred=predict(knnFit,training[, -1],type="class") # 実際の正解ラベルと推測されたラベルを比較して精度指標を取得 confusionMatrix(data=training[,1],reference=trainPred) ## Confusion Matrix and Statistics ## ## Reference ## Prediction CIMP noCIMP ## CIMP 65 0 ## noCIMP 2 63 ## ## Accuracy : 0.9846 ## 95% CI : (0.9455, 0.9981) ## No Information Rate : 0.5154 ## P-Value [Acc > NIR] : <2e-16 ## ## Kappa : 0.9692 ## ## Mcnemar's Test P-Value : 0.4795 ## ## Sensitivity : 0.9701 ## Specificity : 1.0000 ## Pos Pred Value : 1.0000 ## Neg Pred Value : 0.9692 ## Prevalence : 0.5154 ## Detection Rate : 0.5000 ## Detection Prevalence : 0.5000 ## Balanced Accuracy : 0.9851 ## ## 'Positive' Class : CIMP ##
  13. テストデータについても同様に 精度指標を取得する。 モデルの評価 # 学習データに対して推測を実行 testPred=predict(knnFit,testing[, -1],type="class") # 実際の正解ラベルと推測されたラベルを比較して精度指標を取得 confusionMatrix(data=testing[,1],reference=testPred)

    ## Confusion Matrix and Statistics ## ## Reference ## Prediction CIMP noCIMP ## CIMP 27 0 ## noCIMP 2 25 ## ## Accuracy : 0.963 ## 95% CI : (0.8725, 0.9955) ## No Information Rate : 0.537 ## P-Value [Acc > NIR] : 2.924e-12 ## ## Kappa : 0.9259 ## ## Mcnemar's Test P-Value : 0.4795 ## ## Sensitivity : 0.9310 ## Specificity : 1.0000 ## Pos Pred Value : 1.0000 ## Neg Pred Value : 0.9259 ## Prevalence : 0.5370 ## Detection Rate : 0.5000 ## Detection Prevalence : 0.5000 ## Balanced Accuracy : 0.9655 ## ## 'Positive' Class : CIMP
  14. kの値が異なるモデルを試すことで、最適なkの値を探索することができる。 学習データの予測誤差がどのように変化するか確認する。 モデルのチューニング set.seed(101) k=1:12 # k の値の範囲 trainErr=c() #

    学習データの予測誤差を格納するためのベクトルを定義 for( i in k){ knnFit=knn3(x=training[,-1], # 学習データ y=training[,1], # 学習データの正解ラベル k=i) # 学習データに対して予測を実行 class.res=predict(knnFit,training[, -1],type="class") # 学習データの予測誤差 trainErr[i]= 1-confusionMatrix(training[,1],class.res)$overall[1] } # k ごとの学習データの予測誤差をプロット plot(k,trainErr,type="p",col="#CC0000",pch=20) # 平滑線を描画 lines(loess.smooth(x=k, trainErr,degree=2),col="#CC0000") k の値が大きいほど予測誤差が大きく なっていることが分かる。
  15. テストデータについても、kの値で予測誤差がどのように変化するか確認する。 モデルのチューニング trainErr=c() # テストデータの予測誤差を格納するためのベクトルを定義 for( i in k){ knnFit=knn3(x=training[,-1],

    # 学習データ y=training[,1], # 学習データの正解ラベル k=i) # テストデータに対して予測を実行 class.res=predict(knnFit,testing[,-1],type="class") # 学習データの予測誤差 testErr[i]=1-confusionMatrix(testing[,1],class.res)$overall[1] } # k ごとの学習データの予測誤差をプロット plot(k,trainErr,type="p",col="#CC0000",pch=20) # 平滑線を描画 lines(loess.smooth(x=k, trainErr,degree=2),col="#CC0000") # k ごとの学習データの予測誤差をプロット points(k,testErr,col="#00CC66",pch=19) lines(loess.smooth(x=k,testErr,degree=2), col="#00CC66") # legendを追加 legend("bottomright",fill=c("#CC0000","#00CC66"), legend=c("training","test"),bty="n") k の値が小さい場合は過学習を起こしている ことが分かる。 ⇒ k = 6 程度が最適
  16. 交差検証を用いた学習にはcaret::train()関数を用いる 交差検証によるモデルのチューニング set.seed(17) # trainControl が学習を制御する。 # 10-fold の交差検証を行う。 trctrl

    <- trainControl(method = "cv",number=10) # k-NN モデルの学習を行う knn_fit <- train(subtype ~., data = training, method = "knn", trControl= trctrl, tuneGrid = data.frame(k=1:12)) # 交差検証精度において最良の k を出力 knn_fit$bestTune ## k ## 4 # k ごとの予測誤差をプロット plot(x=1:12,1-knn_fit$results[, 2],pch=19, ylab="prediction error" ,xlab="k") lines(loess.smooth(x=1:12,1-knn_fit$results[, 2],degree=2), col="#CC0000" ) k = 4 で予測誤差が最小となっているこ とが分かる。
  17. caret::train()関数を用いると、学習ロジックの変更が簡単に行える。 ブートストラップ法によるモデルのチューニング set.seed(17) # trainControl が学習を制御する。 # 20 回のブートストラップリサンプリングを行う。 trctrl

    <- trainControl(method = "boot",number=20,returnResamp= "all") # k-NN モデルの学習を行う knn_fit <- train(subtype ~., data = training, method = "knn", trControl= trctrl, tuneGrid = data.frame(k=1:12)) # 交差検証精度において最良の k を出力 knn_fit$bestTune ## k ## 4 # k ごとの予測誤差をプロット plot(x=1:12,1-knn_fit$results[, 2],pch=19, ylab="prediction error" ,xlab="k") lines(loess.smooth(x=1:12,1-knn_fit$results[, 2],degree=2), col="#CC0000" ) k = 4 で予測誤差が最小となっているこ とが分かる。 変更部分
  18. 不均衡データへの対処法 ゲノムデータに機械学習を応用する上で共通のハードルは、大規模な不均衡データ問題である。 これらの対処には下記のような手法が用いられる。 例)深刻なクラスの不均衡を伴う別の例は、エンハンサー予測が挙げられる。 ヒトゲノムは30億塩基対の長さであり、そのほとんどがエンハンサーアノテーションと重複しないため、 「エンハンサーではない」というネガティブセットがトレーニングを圧倒する。 クラスを均衡にする サンプリング 学習データを作成する際に、同じサイズのクラスを生成するようにサンプリングを行う。多 数クラスのサンプルからダウンサンプリング、若しくは少数クラスのサンプルからアップサ

    ンプリングすることで対処することが可能。 重みづけ いくつかの手法では、少数クラスに対して不均衡度による重みづけを行うことでこの問題 に対処することができる。ロジスティックベースの手法とブースティング手法は、重みづけ を行うことのできるアルゴリズムの一例。 異なる分類スコアカッ トオフの選択 過剰な真陽性または偽陽性を最小化するような予測スコアのカットオフ値を選択する。2ク ラス分類問題の古典的な予測カットオフは0.5だが、この値を調節することでSensitivity と Specificityを最適化することができる。ROC曲線が有用。