【Network pharmacology】Interveneを用いた漢方成分と疾患の共通標的の発見【in silico創薬】

Intervenne

本記事はNetwork pharmacologyに関する記事で、漢方成分から予測した標的疾患から予測した標的の共通部分を見つけ出します。いよいよ具体的な標的タンパク質が発見できますので、是非トライしてみてください!

動作検証済み環境

Mac M1, Sequoia 15.3

Network pharmacologyとは?


Network pharmacology(ネットワーク薬理学)は、漢方薬や機能性食品に含まれる複数の成分が、体内のさまざまな標的(タンパク質、遺伝子など)に同時に作用し、複雑な生理的効果をもたらす仕組みを「ネットワーク」として解析する手法です。

従来の薬理学が「1成分=1標的」の考え方に基づいていたのに対し、ネットワーク薬理学は「多成分=多標的=多経路」の全体像をとらえます。たとえば、漢方薬「黄芩」に含まれるバイカリンなどの成分が、乳がんに関与する複数の遺伝子やシグナル経路に作用している可能性を、各種データベースを用いて可視化できます。

これにより、伝統的処方の有効性を科学的に裏付けたり、新たな疾病への応用可能性を探索したりすることができます。

Network pharmacologyの流れ


  1. 成分取得:PubChemなど各種データベースを使って、漢方や食品中の有効成分を調査する。
  2. 標的予測:SwissTargetPrediction、ChEMBL Multitask Neural Network modelなどを用いて、成分が結合する可能性のある標的タンパク質を予測する。
  3. 疾患関連遺伝子の収集:Open Targetsを使って、対象とする疾患に関係する遺伝子やタンパク質の情報を収集する。
  4. 共通ターゲットの抽出 (本記事):成分の標的と疾患関連遺伝子を照合し、共通の遺伝子(ターゲット)を見つける。
  5. ネットワーク構築・可視化:成分、標的、疾患の関係性をCytoscapeなどでネットワーク図として可視化する。

以下の論文を参考にし、漢方のScutellaria baicalensis(オウゴン (黄芩))の成分と乳がんの標的タンパク質を明らかにし、黄芩のどの成分が、乳がんの標的に結合するか明らかにしていきます。

Unraveling the Role of Scutellaria baicalensis for the Treatment of Breast Cancer Using Network Pharmacology, Molecular Docking, and Molecular Dynamics Simulation

今回は4の共通ターゲットの抽出の収集を行います。

ベン図を使って、共通部分を見つけていきます。

論文ではVennyを使用していますが、ライセンスが不明瞭なので、今回は紹介までに留めておきます。アカデミアの方はこちらの方が使いやすくていいと思います。

Venny 2.1.0 software (https://bioinfogp.cnb. csic.es/tools/venny/index.html),

Interveneとは


Interveneは、複数の遺伝子セットや要素集合のオーバーラップを視覚的に解析するツールです。最大6セットまでのベン図(Venn diagram)、より多くのセットに対応するUpSetプロット、さらにペアワイズの類似度ヒートマップ(Jaccard indexなど)も作成できます。遺伝子名のリストだけでなく、ChIP-seqやATAC-seqの結果として得られるBEDファイルの比較にも対応しています。

コマンドラインツールとしても使えますが、ShinyベースのWebインターフェースでも簡単に可視化が可能です。視覚的に重なりを解析したいときに便利なツールです。

Interveneを使った漢方成分と疾患の共通標的の発見


まずすでに作成した二つのファイル

  • filtered_targets_globalScore_0.5.tsv
  • unique_gene_names.csv

作成したファイルの遺伝子部分をマージして、新しいcsvファイルを作ります。

import pandas as pd
# ファイルパスの設定
tsv_path = "filtered_targets_globalScore_0.5.tsv"
csv_path = "unique_gene_names.csv"
# ファイルの読み込み
tsv_df = pd.read_csv(tsv_path, sep="\t")
csv_df = pd.read_csv(csv_path)
# 遺伝子名の抽出(重複・欠損除去)
compound_genes = csv_df[["Gene_Name"]].dropna().drop_duplicates().reset_index(drop=True)
disease_genes = tsv_df[["symbol"]].dropna().drop_duplicates().reset_index(drop=True)
# 列名の統一
compound_genes.columns = ["Compound_to_Target"]
disease_genes.columns = ["Disease_to_Target"]
# 行数を揃えて再インデックス
max_len = max(len(compound_genes), len(disease_genes))
compound_genes = compound_genes.reindex(range(max_len))
disease_genes = disease_genes.reindex(range(max_len))
# 横方向に結合
merged_df = pd.concat([compound_genes, disease_genes], axis=1)
# CSV出力
output_path = "gene_lists_Compound_Disease.csv"
merged_df.to_csv(output_path, index=False)
print(f"✅ Gene lists saved to: {output_path}")

コード詳細説明

必要なモジュールのインポート

import pandas as pd
  • pandas:データ操作と分析を効率的に行うためのPythonライブラリです。主にデータフレーム(表形式のデータ構造)を扱う際に使用します。

ファイルパスの設定と読み込み

tsv_path = "filtered_targets_globalScore_0.5.tsv"
csv_path = "unique_gene_names.csv"
tsv_df = pd.read_csv(tsv_path, sep="\t")
csv_df = pd.read_csv(csv_path)
  • tsv_pathcsv_path: それぞれ入力となるTSVファイルとCSVファイルのファイルパスを文字列で定義しています。
  • pd.read_csv(): 定義したパスからファイルを読み込み、Pandasのデータフレームとして tsv_dfcsv_df に格納します。
    • tsv_path のファイルはタブ区切り (sep="\t") で読み込まれます。

遺伝子名の抽出と整形

compound_genes = csv_df[["Gene_Name"]].dropna().drop_duplicates().reset_index(drop=True)
disease_genes = tsv_df[["symbol"]].dropna().drop_duplicates().reset_index(drop=True)
  • csv_df[["Gene_Name"]]: csv_df データフレームから “Gene_Name” 列のみを選択します。
  • tsv_df[["symbol"]]: tsv_df データフレームから “symbol” 列のみを選択します。
  • .dropna(): 選択した列から欠損値(NaN)を含む行を削除します。
  • .drop_duplicates(): 残った行から重複する遺伝子名を削除し、各遺伝子名が一意になるようにします。
  • .reset_index(drop=True): インデックスをリセットします。drop=True とすることで、元のインデックスが新しい列として追加されるのを防ぎます。

列名の統一

compound_genes.columns = ["Compound_to_Target"]
disease_genes.columns = ["Disease_to_Target"]
  • compound_genes.columns = ["Compound_to_Target"]: compound_genes データフレームの列名を “Compound_to_Target” に変更します。
  • disease_genes.columns = ["Disease_to_Target"]: disease_genes データフレームの列名を “Disease_to_Target” に変更します。 これにより、後の結合処理で分かりやすい列名が設定されます。

行数を揃えて結合準備

max_len = max(len(compound_genes), len(disease_genes))
compound_genes = compound_genes.reindex(range(max_len))
disease_genes = disease_genes.reindex(range(max_len))
  • max_len = max(len(compound_genes), len(disease_genes)): compound_genesdisease_genes のうち、行数が多い方の長さを max_len に格納します。
  • .reindex(range(max_len)): 各データフレームの行数を max_len に揃えます。行数が足りない場合は、不足している部分に自動的にNaN(欠損値)が埋められます。これにより、異なる長さのデータフレームを横方向に結合する際に、行の不一致によるエラーを防ぎます。

データフレームの横方向結合

merged_df = pd.concat([compound_genes, disease_genes], axis=1)
  • pd.concat(): compound_genesdisease_genes の2つのデータフレームを結合します。
  • axis=1: 横方向(列方向)に結合することを指定します。これにより、“Compound_to_Target” 列と “Disease_to_Target” 列が隣り合った新しいデータフレーム merged_df が作成されます。

結果のCSV出力

output_path = "gene_lists_Compound_Disease.csv"
merged_df.to_csv(output_path, index=False)
  • output_path: 出力するCSVファイルのファイル名を定義します。
  • merged_df.to_csv(output_path, index=False): 結合された merged_df データフレームをCSVファイルとして保存します。
  • index=False: データフレームのインデックスをCSVファイルに書き込まないように指定します。

完了メッセージ

print(f"✅ Gene lists saved to: {output_path}")

  • 処理が正常に完了したことを示すメッセージと、出力されたファイルのパスを表示します。

Interveneを使ったベン図の作成

出力したgene_lists_Compound_Disease.csv をInterveneのサイトに行き、アップロードしてみて下さい。

アップロードすると、自動的にベン図が書けます。ここでは99の標的が共通であることがわかります。

共通部分は以下のコードで抽出します。

import pandas as pd
# 読み込み
df = pd.read_csv("gene_lists_Compound_Disease.csv")
# セット化(NaN除去)
compound_genes = set(df["Compound_to_Target"].dropna())
disease_genes = set(df["Disease_to_Target"].dropna())
# 共通遺伝子の抽出
common_genes = sorted(compound_genes & disease_genes)
# 保存
common_df = pd.DataFrame(common_genes, columns=["Common_Targets"])
common_df.to_csv("common_target_genes.csv", index=False)
print("✅ 共通遺伝子数:", len(common_genes))

出力では✅ 共通遺伝子数: 99となり、化合物標的と疾患原因タンパク質の共通タンパク質が99個と出てきました。

common_target_genes.csv が作成されているので、ここに漢方成分と疾患の共通標的のリストがあります!

コード詳細解説

必要なモジュールのインポート

import pandas as pd
  • pandas:データ操作と分析を効率的に行うためのPythonライブラリです。主にデータフレーム(表形式のデータ構造)を扱う際に使用します。

ファイルの読み込み

df = pd.read_csv("gene_lists_Compound_Disease.csv")
  • pd.read_csv("gene_lists_Compound_Disease.csv"): “gene_lists_Compound_Disease.csv” という名前のCSVファイルを読み込み、その内容をPandasのデータフレーム df に格納します。このファイルは、以前のスクリプトで作成された、化合物ターゲット遺伝子と疾患ターゲット遺伝子が結合されたものです。

遺伝子リストのセット化(NaN除去)

compound_genes = set(df["Compound_to_Target"].dropna())
disease_genes = set(df["Disease_to_Target"].dropna())
  • df["Compound_to_Target"]: df データフレームから “Compound_to_Target” 列を選択します。
  • .dropna(): 選択した列から欠損値(NaN)を削除します。これにより、有効な遺伝子名のみが残ります。
  • set(...): 欠損値が除去された遺伝子名のリストをPythonの set(集合)に変換します。セットは重複する要素を自動的に削除し、要素の高速な検索や集合演算(和集合、積集合など)を可能にします。同様の処理が “Disease_to_Target” 列に対しても行われ、disease_genes セットが作成されます。

共通遺伝子の抽出

common_genes = sorted(compound_genes & disease_genes)
  • compound_genes & disease_genes: これは2つのセットの積集合(intersection)を計算する演算子です。つまり、compound_genesdisease_genes の両方に存在する要素(この場合は遺伝子名)のみを抽出します。
  • sorted(...): 抽出された共通遺伝子のセットをリストに変換し、アルファベット順にソートします。これにより、結果が整理されて見やすくなります。

共通遺伝子の保存

common_df = pd.DataFrame(common_genes, columns=["Common_Targets"])
common_df.to_csv("common_target_genes.csv", index=False)
  • pd.DataFrame(common_genes, columns=["Common_Targets"]): common_genes リストを新しいPandasデータフレーム common_df に変換します。このデータフレームは “Common_Targets” という単一の列を持ちます。
  • common_df.to_csv("common_target_genes.csv", index=False): 作成された common_df を “common_target_genes.csv” という名前のCSVファイルとして保存します。index=False は、データフレームのインデックスをCSVファイルに書き込まないように指定します。

共通遺伝子数の表示

print("✅ 共通遺伝子数:", len(common_genes))

  • len(common_genes): 抽出された共通遺伝子の数を取得します。
  • 最終的な出力として、見つかった共通遺伝子の総数が表示され、処理が正常に完了したことをユーザーに知らせます。

最後に


いかがでしたでしょうか?

本記事ではすでに取得した化合物標的と疾患の原因タンパク質から共通部分を見つけ、

実際にScutellaria baicalensis(オウゴン (黄芩))がどのタンパク質に効いているかを予測しました。まだ標的が99タンパク質と多いので、次の記事でさらに重要なタンパク質だけに絞っていきます!

参考文献


Interveneを使ってコマンドラインでベン図やUpSetプロット、ヒートマップを作成する

GitHub – asntech/intervene: Intervene: a tool for intersection and visualization of multiple genomic region and gene sets

BSD License

Intervene: a tool for intersection and visualization of multiple gene or genomic region sets – BMC Bioinformatics


コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です