t_kahi’s blog

KNIMEやCellProfiler、創薬に関する記事と,日々のメモです

【KNIME】Kolmogorov–Smirnov検定(KS-test)をKNIME Workflowで行う

こんばんは,@PKです.

今日はKNIMEでKolmogorov–Smirnov検定(KS-test)を行うWorkflowを紹介したいと思います.

Kolmogorov–Smirnov検定(KS-test)とは

Kolmogorov–Smirnov検定とは,2つの標本の分布が一致しているかどうかを検出する検定手法です

2つの標本についてそれぞれの母集団の確率分布が一致しているかどうか、またはある標本の母集団の確率分布が帰無仮説で提示した確率分布と一致しているかどうかを検定すること コルモゴロフ=スミルノフ検定 | 統計用語集 | 統計WEB

あまり馴染みが無い方もいるかもしれませんが,実はKS-testはHigh Content Analysisの分野でも良く使用されています.
https://journals.sagepub.com/doi/full/10.1177/1087057114526432/
https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4103836/

KNIMEではこのKS-testを行うためのノードがあります.
nodepit.com

Workflowの概要ではこのノードの使い方や前処理のやり方等をご紹介します.

KNIMEworkflow概要

ご紹介するKNIME Workflowの概要です.
f:id:t_kahi:20190623192943p:plain

まず「Table Creator」でサンプルデータを読み込みます. その後,データの全体を把握するために,累積度数分布図を「R View」で表示します.

その後,データをループ処理を行いながら「Kolmogorov–Smirnov Test」を行います.

左下図がサンプルデータ,右下図が累積度数分布図を示しています.
f:id:t_kahi:20190623193104p:plain

サンプルデータは,コントロールと3つの被験物質(A~C)のそれぞれの測定値を示しています.
これら測定値を表で眺めるだけでは差がわかりずらいので,累積度数分布表示で表します.

#R View

library(ggplot2)
library(reshape2)
data <-data.frame(knime.in)
data.m <-melt(data) #カラムをまとめる
ggplot(data.m, aes(value, color = variable))+ 
  stat_ecdf(geom = "step") +
  labs(x="value",y="Cumulative Distribution")

累積度数分布表示のイメージがわかない方は以下を参考にしてください.
統計学入門−第2章

累積度数分布図の結果から,controlとA, Cは差がありそう.controlとBは同じような度数分布をしていることがわかります.
これをKS-testで実際に検定してみます.

f:id:t_kahi:20190623195155p:plain

今回は,controlとA,controlとB,controlとC,というようにそれぞれKS-testを行います.
そのため,まずは検定を行うカラムを抜き出すことを「Column List Loop Start」で行います.
f:id:t_kahi:20190623195603p:plain
ループしたいカラム(A,B,C)を選択し実行すると,上右図のように1回目のループ処理ではcontrolとA列が選択されます.

続いて,「Column Rename (Regex)」ノードでターゲットのカラムを”ANONYMOUS_COLUMN”に変更します.

f:id:t_kahi:20190623195946p:plain

「Column Rename (Regex)」はループ処理時に便利です.
以下記事も参考にして下さい.
【KNIME】Transpose rows to multiple columns by category - t_kahi’s blog

いよいよ,「Kolmogorov–Smirnov Test」ノードを使用します.
設定は非常に簡単で,優位水準を決め(default : 0.05),測定する値を含んだカラムを指定します(左下図).
ここで,カラム名を”ANONYMOUS_COLUMN”にすることで,ループ処理の際にエラーが出ることなく進めることができます. f:id:t_kahi:20190623201635p:plain
実行すると,右図のように,帰無仮説の棄却結果,統計検定量(累積確率の差の絶対値の最大値),p値が得られます. controlとAのKS-testの結果はp値が0.05以下ということで,帰無仮説が棄却され,2つの分布は異なるという結果になりました.

結果をこのまま出力するのが難しいので,少し加工します.
「Transpose」で行列を入れ替えて,「Column Rename (Regex)」で再びカラム名を”ANONYMOUS_COLUMN”→”A"に戻します.
f:id:t_kahi:20190623202429p:plain

「Loop End (Column Append)」で上記処理を繰り返した結果,左下図のようになりました.
累積度数分布の結果(右下図)とも一致していますね.
f:id:t_kahi:20190623203049p:plain

まとめ(とおまけ)

KNIMEでKolmogorov–Smirnov検定を行う Workflowを紹介しました.
非常にシンプルな統計手法なので,ノードを使って処理するのはやりやすいと感じました.

ちなみに,Kolmogorov–Smirnov検定はRにも用意されており,「R snippet」で非常に簡単に同じことを行うことができます.
https://stat.ethz.ch/R-manual/R-patched/library/stats/html/ks.test.html

#R snippet
data <- data.frame(knime.in)
ks_test <- ks.test(data$control,data$ANONYMOUS_COLUMN)
knime.out <- data.frame(ks_test["statistic"],ks_test["p.value"],ks_test["alternative"])