バーチャルスクリーニング (1)

くすりとなりうる化合物を発見するために、コンピュータの力が利用されています。
「バーチャルスクリーニング(VS)」は、生物活性の期待できる化合物を情報技術で絞り込む方法です。


最新の機械学習アルゴリズムを使って、VSの手順を追ってみましょう。
S1P1というリン脂質受容体の活性化合物(リガンド)を探索してみます。


まず、活性化合物の化学構造

CCCCCCCCC=CCCCCCCCC(=O)OCC(O)COP(=O)(O) OLPA_p
OCC(N)(CCc1ccc(Sc2cccc(Oc3ccccc3)c2)cc1Cl)COP(=O)(O)O KRP203p_p
OC(=O)CCNCc1ccc2sc(cc2c1)c1ccc(c2ccccc2)c(c1)C(F)(F)F AUY954_p
OCCNC1CCc2c(cccc12)c1noc(n1)c1ccc(OCC)c(OCC)c1 CYM5442_p
CCCCCCCCc1ccc(cc1)CCC(N)(CO)COP(=O)(O)O FTY720p_p
CCCCCCCOc1ccc(cc1)CCC(C)(N)COP(=O)(O)O AFD_p
CCOc1ccc(cc1OCC)c1onc(n1)c1ccncc1 CYM5181_p
CCCCCCCCCCCCCC=CC(O)C(N)COP(=O)(O)O S1P_p
FC(F)(F)c1cccc(c1)c1noc(n1)c1cc(c2ccccc2)c(s1)C(F)(F)F SEW2871_p
CC(C)Cc1ccc(cc1)c1onc(n1)c1ccc(cc1)CN1CC(C1)C(=O)O a26_p
CCCCCCc1cccc(c1)NC(=O)C(N)CCP(=O)(O)O W146_p
CCCCCCCCc1cccc(c1)NC(=O)C(N)CCP(=O)(O)O VPC44116_p

と非活性化合物の化学構造(今回は別受容体のリガンド構造で代用)

CCCCCC(/C=C/C1C(O)CC2C1C/C(=C/CCCC(=O)O)/O2)O 159
CCCCCC(/C=C/C1C(O)CC(=O)C1CCCCCCC(=O)O)O 214
OC1CCC2(C(C1)CC(C1C2CC(O)C2(C1CCC2C(CCC(=O)O)C)C)O)C 303
COc1ccc2c(c1)c(CCNC(=O)C)c[nH]2 896
CCCn1c2nc([nH]c2c(=O)n(c1=O)CCC)C1CCCC1 1329
CSc1nc(N)c2c(n1)n(cn2)C1OC(C(C1O)O)COP(=O)(OP(=O)(OP(=O)(O)O)O)O 1582
O=C(C(c1ccccc1)c1ccccc1)OC1CC[N+](CC1)(C)C 1734
CCN1CCCC1CNC(=O)c1cc(c(cc1OC)N)S(=O)(=O)CC 2159
CC(Cc1ccc(cc1)OCC(=O)O)NCC(c1cccc(c1)Cl)O 2437
CCCCCc1cc(O)c2c(c1)OC(c1c2cc(C)cc1)(C)C 2543
OCCN1CCN(CC1)CCCN1c2ccccc2Sc2c1cc(cc2)C(F)(F)F 3372
Fc1ccc(cc1)C(=O)CCCN1CCC(CC1)(O)c1ccc(cc1)Cl 3559

を準備します。


機械学習アルゴリズムとして、サポートベクターマシン(SVM)を使ってみます。SVMは、2値判別問題を解くアルゴリズムで、汎用性が高いため様々な分野で活躍しています。学習用の入力データには、クラスラベル"1"もしくは"-1"をつける決まりがあります。今回は、活性化合物に"1"、非活性化合物に"-1"をつけます。また、多くのSVM実装ソフトウェアでは、スパース形式(sparse format)という独特のファイル形式でデータを受けつけます。値が0になっている項目を省略できるのが特徴です。

<ラベル> <列番号1>:<列番号1の値> <列番号2>:<列番号2の値> <列番号3>:<列番号3の値> ...

前回のMACCSキー計算プログラムをスパース形式で書き出すには、try文(29行目)からprintf文までを以下のように書き換えることになります。


try{
BitSet fing = ma.getFingerprint(imol);
for(int i=0; i<ma.getSize(); i++){
if( fing.get(i) ){
fp = fp + " " + (i+1) + ":1";
}
}
} catch (Exception e1) {
e1.printStackTrace();
}
System.out.printf("1%s\n", fp); // "-1" for inactive ones

つづく。