本記事では、医薬品と同様の効果を発揮する低分子化合物を探す方法について説明します。
具体的には、こちらの論文で報告されているiPS細胞を誘導する化合物を代替する低分子化合物の組み合わせを探索します。
ChEMBLに登録されている化合物を対象とし、まずは化合物の標的タンパクから標的Pathwayを同定します。続いて、標的Pathwayに基づいて化合物をクラスタリングし、iPS誘導化合物と同じクラスターに属する化合物で置換の候補を検討します。
0. はじめに
本記事は、以下の記事の続きになります。
1. 化合物の標的タンパクを取得
以下の記事に従い、化合物のInChIKeyから標的タンパクのリスト(シンボル表記)を得る辞書(ink_syms
)を作成します。
2. Pathwayを構成するタンパクを取得
以下の記事に従い、PathwayのIDからPathwayに含まれるのタンパクのリスト(シンボル表記)を得る辞書(ptm_syms
)を作成します。
3. 標的Pathwayの算出
以下の記事に従い、冒頭の行列に相当するdf_score
を用意します。
4. クラスタリングを実施
以下の記事に従い、df_score
に基づいた化合物のクラスタリングの結果(best_gmm
およびbic_results_umap
)を作成します。
5. iPS誘導化合物について
以下の図は、こちらの論文から引用しました。

上記の論文によれば、マウスではVC6TF、ヒトではC6NYSAという化合物の組合せで若返りが認められたそうです(※)。
ただし、これらの化合物は医薬品に分類されるものも含まれているため、実応用はかなり先になりそうです。
そこで本記事では、他の化合物(以後、代替化合物と呼ぶ)でVC6TFとC6NYSAを置換可能か検討してみます。
なお、以降はVC6TFとC6NYSAを合わせてVC6TFNYSAと呼ぶことにします。
※ 若返りの定義や検証方法などの詳細は論文を参照してください。
6. VC6TFNYSAのInChIKey
pubchemなどでVC6TFNYSAのInChIKeyを調べると以下のようになりました(詳しくはこちらの記事)。
va6tfnysa_inc = {
'ValproicAcid': 'NIJJYAXOARWZEE-UHFFFAOYSA-N',
'CHIR99021': 'AQGNHMOJWBZFQQ-UHFFFAOYSA-N',
'E616452RepSox': 'LBPKYPYHDKKRFS-UHFFFAOYSA-N',
'Tranylcypromine': 'AELCINSCMGFISI-BDAKNGLRSA-N',
'ForskolinFSK': 'OHCQJHSOBUTRHG-KGGHGJDLSA-N',
'TTNPB': 'FOIVPCKZDPCJJY-JQIJEIRASA-N',
'Y27632': 'IYOZTVGMEWJPKR-UHFFFAOYSA-N',
'SmoothenedAgonist': 'FYBHCRQFSFYWPY-UHFFFAOYSA-N',
'ABT869Linfatinib': 'MPVGZUGXCQEXTM-UHFFFAOYSA-N',
}
7. VC6TFNYSAが属するクラスター
以下の関数を用いて、VC6TFNYSAの場所をUMAPの図に描画します。
# libraries
import os
import datetime
import pandas as pd
import numpy as np
import pickle
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
from sklearn import mixture
from sklearn.mixture import GaussianMixture
from umap.umap_ import UMAP
# 乱数の固定
import random
import numpy as np
# import torch
def fix_seeds(seed=0):
random.seed(seed)
np.random.seed(seed)
# torch.manual_seed(seed)
# torch.backends.cudnn.benchmark = False
# torch.backends.cudnn.deterministic = True
fix_seeds(42)
# VC6TFNYSA on UMAP
def plot_gmm_clustering_vc6tfnysa(res_decomposition, bic_results, method, no, output='html'):
# unpacking etc.
xy = np.array(res_decomposition.iloc[:, :2])
best_gmm = bic_results['best_gmm']
clusters = [i + 1 for i in best_gmm.predict(xy)]
# bokeh libraries
from bokeh.plotting import output_notebook, figure, show
from bokeh.io import save
from bokeh.models import LinearColorMapper
from bokeh.palettes import Spectral10, Category10
# dataset
df = pd.DataFrame(np.hstack([xy, np.array(clusters).reshape(len(xy), 1)]))
df.index = res_decomposition.index
df.columns = ['col_0', 'col_1', 'cluster']
df['InChIKey'] = df.index
for ctrl in va6tfnysa_inc.keys():
for idx in range(len(df)):
if df.iloc[idx, 3] == va6tfnysa_inc[ctrl]:
df.iloc[idx, 3] = ctrl
break
# hover
tooltips=[
('InChIKey', '@InChIKey'),
('Cluster No.', '@cluster')
]
# figure
p = figure(
width = 750, height = 600, title=f'{method}',
x_axis_label = 'Axis 1', y_axis_label = 'Axis 2', tooltips=tooltips
)
# plot decompositions
color_mapper = LinearColorMapper(palette='Viridis256', low=min(clusters), high=max(clusters))
p.scatter(
x = 'col_0', y = 'col_1',
source = df,
color = {'field': 'cluster', 'transform': color_mapper},
size = 4, alpha = 0.2
)
# plot cluster centers
p.scatter(
x = best_gmm.means_[:, 0],
y = best_gmm.means_[:, 1],
legend_label='Means',
color = 'red',
marker="star",
size = 15, alpha = 0.9
)
# plot vc6tfnysa
color = Category10[10]
for idx, ctrl in enumerate(va6tfnysa_inc.keys()):
df_ctrl = df[df['InChIKey'] == ctrl]
p.scatter(
x = 'col_0', y = 'col_1',
source = df_ctrl,
legend_label = ctrl,
color = color[idx],
size = 15, alpha = 0.9
)
# legend
p.legend.location = "top_left"
p.legend.title = "Description."
p.add_layout(p.legend[0], "left")
# output
if output == 'html':
os.makedirs(f'{RES_DIR}/bokeh/clustering/{no}', exist_ok=True)
save(p, filename=f'{RES_DIR}/bokeh/clustering/{no}/decompsition_{method}_vc6tfnysa.html')
elif output == 'notebook':
show(p)
# 描画
plot_gmm_clustering_vc6tfnysa(res_umap, bic_results_umap, 'UMAP', no, output='notebook')

VC6TFNYSAは大きめの丸い色付きのマーカーでプロットしてあります。
上図を見ると、VC6TFNYSAという9個の化合物のうちいくつかが極めて近い座標に存在して重なっているように見えます。
ズームをして調べてみると、以下のようになっていました。

C6YAはPathwayの観点からみると、殆ど同じ作用を示すと考えられます。
そこで、これらの化合物については代表となる1つのみ加えるだけで良いかもしれません。
具体的には、マウスのVC6TFはVCTFに、ヒトのC6NYSAはCNSのみで効果がありそうです。
8. 代替化合物による置換
VC6TFNYSAの9種類の化合物を、VとFとC6NYとNとTとSの5つにグループ分けし、これらについてUMAP平面上で距離が近い別の化合物Top 50を調べてみます。
まずはTop Nを取得する以下の関数を定義します。
def get_candidates(
res_decomposition,
bic_results,
ctrl_cluster_no, # [11]
ctrl_incs, # ['NIJJYAXOARWZEE-UHFFFAOYSA-N']
n_top = 50
):
# クラスターの中心座標(iPS誘導化合物の座標の重心)
idxes = [i for i in range(len(res_decomposition)) if res_decomposition.index.tolist()[i] in ctrl_incs]
xy = list(np.mean(res_decomposition.iloc[idxes, :], axis=0))
# iPS誘導化合物を除いたres_decomposition
_res_decomposition = res_decomposition.copy()
_res_decomposition['InChIKey'] = _res_decomposition.index.tolist()
_res_decomposition = _res_decomposition[~_res_decomposition['InChIKey'].isin(ctrl_incs)]
# ctrl_cluster_no内の化合物リスト
best_gmm = bic_results['best_gmm']
data = np.array(_res_decomposition)[:, :2]
_clusters = best_gmm.predict(data)
clusters = [i + 1 for i in _clusters]
cno_idxes = [i for i in range(len(_res_decomposition)) if clusters[i] in ctrl_cluster_no]
df_cn = _res_decomposition.iloc[cno_idxes, :]
# n_top
df_cn['dist'] = df_cn.apply(lambda x: np.sqrt((x.iloc[0] - xy[j][0])**2 + (x.iloc[1] - xy[j][1])**2), axis=1)
df_cn = df_cn.sort_values('dist')
candidates = df_cn.index.tolist()[:n_top]
dists = df_cn['dist'].tolist()[:n_top]
df_results = df_candidates = pd.DataFrame([candidates, dists]).T
df_results.columns = ['candidate', 'distance']
return df_results
次に、以下のようにしてTop 50をExcelのファイルに出力してみます。
# VC6TFNYSAのクラスター情報
vc6tfnysa_names = ['V', 'F', 'C6YA', 'N', 'T', 'S']
vc6tfnysa_cnos = [[11], [35], [31], [18], [24], [21]]
vc6tfnysa_incs = [
['NIJJYAXOARWZEE-UHFFFAOYSA-N'],
['OHCQJHSOBUTRHG-KGGHGJDLSA-N'],
[
'AQGNHMOJWBZFQQ-UHFFFAOYSA-N',
'LBPKYPYHDKKRFS-UHFFFAOYSA-N',
'IYOZTVGMEWJPKR-UHFFFAOYSA-N',
'MPVGZUGXCQEXTM-UHFFFAOYSA-N'
],
['FOIVPCKZDPCJJY-JQIJEIRASA-N'],
['AELCINSCMGFISI-BDAKNGLRSA-N'],
['FYBHCRQFSFYWPY-UHFFFAOYSA-N']
]
# iPS誘導化合物に距離が近いTop 50の化合物リストを出力
for idx, (name, cno, inc) in enumerate(zip(vc6tfnysa_names, vc6tfnysa_cnos, vc6tfnysa_incs)):
# Top 50を取得
df_results = get_candidates(
res_umap,
bic_results_umap,
cno,
inc
)
# excelファイルに出力
no = now()
os.makedirs(f'{RES_DIR}/xlsx/{no}', exist_ok=True)
if idx == 0:
df_results.to_excel(f"{RES_DIR}/xlsx/{no}/clustered_data.xlsx", sheet_name=name, index=False)
else:
with pd.ExcelWriter(f"{RES_DIR}/xlsx/{no}/clustered_data.xlsx", engine='openpyxl', mode='a') as writer:
df_results.to_excel(writer, sheet_name=name, index=False)
結果については、各自で実行してみて確認してみて下さい。
本記事で具体的にどのような化合物が得られたかについては割愛します。
9. まとめ
本記事では、論文で報告されていたiPS誘導化合物を標的Pathwayの観点から冗長性を排除して5グループを定義し、各グループについて代替化合物を50個リストアップしました。
コメント