Skip to content

Latest commit

 

History

History
266 lines (185 loc) · 13.7 KB

ch06_similarity.asciidoc

File metadata and controls

266 lines (185 loc) · 13.7 KB

6章: 化合物の類似性を評価してみる

jupyter

化合物が似ているとはどういうことか?

2つの化合物が似ているとはどういうことでしょうか?なんとなく形が似ている?という表現は科学的ではありません。ケモインフォマティクスでは類似度(一般的に0-100%値を取ります)や非類似度(距離)といった定量的な尺度により似ているかどうかを評価します。

ここでは主に2つの代表的な尺度を紹介します。

記述子

分子の全体的な特徴を数値で表現するものを記述子と呼びます。分子量や極性表面性(PSA)、分配係数(logP)などがあり、現在までに多くの記述子が提案されています。これらの記述子の類似性を評価することで2つの分子がどのくらい似ているかを表現することが可能です。また分子全体の特徴を1つの数字で表現しており局所的な特徴ではないということに注意してください。

Note
いくつかの記述子に関しては市販ソフトでないと計算できない場合があります。

フィンガープリント

もう一つがフィンガープリントです。フィンガープリントとは分子の部分構造を0,1のバイナリーで表現したもので部分構造の有無とビットのon(1),off(0)を対応させたものになり、部分構造の集合を表現することで分子の特徴を表現しています。フィンガープリントには固定長FPと可変長FPの二種類が存在し、古くはMACCS keyという固定長FP(予め部分構造とインデックスが決められているFP)が使われていましたが、現在ではECFP4(Morgan2)という可変長FPが利用されるのが普通です。

RDKitのフィンガープリントに関しては開発者のGregさんのスライドが詳しいので熟読してください。

今回はこのECFP4(Morgan2)を利用した類似性評価をしてみましょう。

SMILESとフィンガープリントの違い

SMILESは構造をASCII文字列で表現したものでフィンガープリントは部分構造の有無をバイナリで表現したものです。違いは前者は構造表現の一つであるのに対し、後者は特徴表現の一つだということです。 部分構造の有無だけしか表現していないため、部分構造間の関係性(どう位置関係でつながっているのか)といった情報が失われ、もとの構造に戻ることはありません。

テキストマイニングでよく用いられるBag-of-Wordsに対応するのでBag-of-Fragmentsと呼ぶ人もいます。

類似度を計算する

簡単な分子としてトルエンとクロロベンゼンの類似性を評価してみましょう。

from rdkit import Chem, DataStructs
from rdkit.Chem import AllChem, Draw
from rdkit.Chem.Draw import IPythonConsole

SMILESで分子を読み込みます。

mol1 = Chem.MolFromSmiles("Cc1ccccc1")
mol2 = Chem.MolFromSmiles("Clc1ccccc1")

一応目視で確認しておきます。

Draw.MolsToGridImage([mol1, mol2])

ECFP4に相当する半径2のモルガンフィンガープリントを生成します。

fp1 = AllChem.GetMorganFingerprint(mol1, 2)
fp2 = AllChem.GetMorganFingerprint(mol2, 2)

類似度の評価にはタニモト係数を使います。

DataStructs.TanimotoSimilarity(fp1, fp2)
# 0.5384615384615384

類似度の補数(すなわち1 - 類似度)である距離を求めたい場合はreturnDistance=Trueとします。 後述のクラスタリングなどでは類似度よりも距離を用いることの方が多いです。

DataStructs.TanimotoSimilarity(fp1, fp2, returnDistance=True)
# 0.46153846153846156

バーチャルスクリーニング

ここまでで化合物の類似性の評価方法について説明しました。この類似性の指標を用い多くの化合物の中から特定の化合物群を選び出すことをバーチャルスクリーニングと呼びます。

例えば薬になりそうな化合物が特許や論文で発表されたり、自社のアッセイ系で有望そうな化合物が見つかった場合、自社の化合物ライブラリデータベースや市販化合物のデータベースの中に類似の化合物で、より有望そうなものがあるかどうかを探したいことがあります。ここではノイラミニダーゼ阻害薬として知られるインフルエンザ治療薬であるイナビルの類似体が購入可能であるかをZINCを利用して調べます。

イナビルの分子量が約350,ALogPが-2.92だったので、ZINCの分子量350-375,LogPが-1未満の340万化合物の区画を選択しました。この区画は16のファイルに分かれていますが、最初の1セットだけダウンロードして使ってみます。

Note
データのダウンロード方法は4章で説明しています。

jupyter notebookでは!で始めるとShellコマンドを実行できます。以下はjupyter notebook上でwgetコマンドでZINCのデータセットをダウンロードする例です。

!wget http://files.docking.org/2D/EA/EAED.smi
NOTE

もし、Windowsなどでwgetコマンドがない場合はブラウザにURLを直接入力するとファイルのダウンロードができるので、ダウンロードしたファイルをjupyterを起動しているディレクトリに移動してください。

SmilesMolSupplier関数を使い、ファイルからまとめてSMILESを読み込みmolオブジェクトにします。5章で紹介したSDMolSupplierのSMILESバージョンと考えてください。

spl = Chem.rdmolfiles.SmilesMolSupplier("EAED.smi")
len(spl)
# 195493

続いてイナビル(Laninamivir)との類似度を調べるための関数を用意します。

laninamivir = Chem.MolFromSmiles("CO[C@H]([C@H](O)CO)[C@@H]1OC(=C[C@H](NC(=N)N)[C@H]1NC(=O)C)C(=O)O")
laninamivir_fp = AllChem.GetMorganFingerprint(laninamivir, 2)

def calc_laninamivir_similarity(mol):
    fp = AllChem.GetMorganFingerprint(mol, 2)
    sim = DataStructs.TanimotoSimilarity(laninamivir_fp, fp)
    return sim

調べてみます。

similar_mols = []
for mol in spl:
    sim = calc_laninamivir_similarity(mol)
    if sim > 0.2:
        similar_mols.append((mol, sim))

結果を類似度の高い順に並べ替えて最初の10件だけ取り出します。

similar_mols.sort(key=lambda x: x[1], reverse=True)
mols = [l[0] for l in similar_mols[:10]]

描画してみます。

Draw.MolsToGridImage(mols, molsPerRow=5)
result

類似度を確認すればわかりますが、今回調べた約20万件の化合物は最高でも23%の類似度の化合物しか見いだせませんでした。しかしZINCは7億5000万件のデータを収録してあるのでその中にはもっと似ている化合物はたくさんあるはずです。

クラスタリング

例えば市販化合物を購入してライブラリを作る場合にはできるだけ多様性をもたせたいので、似ている化合物ばかりが偏らないように類似化合物同士をまとめ、その中の代表を選びます。このように化合物を構造の類似性でまとめたい場合、クラスタリングという手法を使います。

Novrtisの抗マラリアアッセイの5614件のヒット化合物をクラスタリングします。

クラスタリング用のライブラリをインポートし、データを読み込みます。

from rdkit.ML.Cluster import Butina
mols = Chem.SDMolSupplier("ch06_nov_hts.sdf")

何らかの理由でRDKitで分子の読み込みができない場合、molオブジェクトではなくNoneが生成されます。このNoneをGetMorganFingerprintAsBitVect関数にわたすとエラーになるので、Noneを除きながらフィンガープリントを生成します。

fps = []
valid_mols = []

for mol in mols:
    if mol is not None:
        fp = AllChem.GetMorganFingerprintAsBitVect(mol, 2)
        fps.append(fp)
        valid_mols.append(mol)

フィンガープリントから距離行列(下三角の距離行列)を生成します。ある化合物を参照化合物とし、複数の化合物の間の類似度や距離を計算する時はDataStructs.BulkTanimotoSimilarityを用いるとまとめて計算ができます。

distance_matrix = []
for i, fp in enumerate(fps):
    distance = DataStructs.BulkTanimotoSimilarity(fps[i], fps[:i+1],
                                                  returnDistance=True)
    distance_matrix.extend(distance)

距離行列を用いて化合物をクラスタリングします。3番目の引数は距離の閾値です。この例では距離0.2つまり80%以上の類似度の化合物でクラスタリングしています。

clusters = Butina.ClusterData(distance_matrix, len(fps), 0.2, isDistData=True)

クラスタ数を確認します。

len(clusters)
#2492

最初のクラスタの構造を表示してみます

mols_ = [valid_mols[i] for i in clusters[0]]
Draw.MolsToGridImage(mols_, molsPerRow=5)
clustering result

今回はRDKitに用意されているライブラリでクラスタリングを行いましたが、Scikit-learnでも幾つかの手法が利用できますし、実際にはこちらの方を使うことが多いです。

Structure Based Drug Design(SBDD)

ここでは抗凝固薬として上市されているapixaban, rivaroxabanの類似性を評価します。

apx = Chem.MolFromSmiles("COc1ccc(cc1)n2nc(C(=O)N)c3CCN(C(=O)c23)c4ccc(cc4)N5CCCCC5=O")
rvx = Chem.MolFromSmiles("Clc1ccc(s1)C(=O)NC[C@H]2CN(C(=O)O2)c3ccc(cc3)N4CCOCC4=O")
Draw.MolsToGridImage([apx, rvx], legends=["apixaban", "rivaroxaban"])
APX+RVX

構造を見るとわかる通りなんとなく似ていますが、この2つの化合物は両方共FXaというセリンプロテアーゼの同じポケットに同じように結合し、蛋白質の働きを阻害することが知られています。

apx_fp = AllChem.GetMorganFingerprint(apx, 2, useFeatures=True)
rvx_fp = AllChem.GetMorganFingerprint(rvx, 2, useFeatures=True)

DataStructs.TanimotoSimilarity(apx_fp, rvx_fp)
# 0.40625

40%くらいの類似度ということになりました。実はapixabanrivaroxabanも複合体結晶構造が解かれており、PyMOLを利用して重ねて描画しました。

NOTE

本書の内容を超えるので、PyMOLの使い方などについては説明しませんが、興味があればこの辺りを参考にしてください。

APX+RVX

図からわかるように、apixaban,rivaroxabanは立体的に綺麗に重なっています。特にメトキシフェニルとクロロチオールはS1ポケットと呼ばれる部位に位置しており何らかの強い相互作用をしていると言われています。蛋白質のリガンド結合部位(ポケット)が明確になれば、メディシナルケミストが次にどの辺りを修飾するかの戦略が立てやすくなり、プロジェクトの成功確率や進捗速度も上がります。

このように、X線やクライオ電験などにより決められた蛋白質の形状に基づいて構造最適化を行うアプローチをStructure Based Drug Design(SBDD)と呼びます。また、ポケットがわかれば、物理的にポケットに結合するような化合物をスクリーニングすることができ、これを構造ベースのバーチャルスクリーニング(SBVS)と呼び、前の章でやったようなリガンドベースのバーチャルスクリーニング(LBVS)と区別することもあります。

FXa阻害剤の歴史と量子化学計算の重要性

本書のケモインフォマティクスの内容とは大きくかけ離れるのですが、FXa阻害剤の歴史を辿り、世代を経てどのような改良がなされていったのかを理解するのは分子設計をする上でかなり役に立ちます。また、S1ポケットの相互作用の解釈は目視や古典力学では非常に難しく、Fragment Molecular Orbital Methodのような量子化学計算によってのみ解釈できるため、今後の分子設計において量子化学計算は必須になることは間違いないと思います。