Thursday, August 20, 2026

因 KEGG pathway map 是定性,能否結合 KEGG pathway map 與 Leiden 演算法,如何以Leiden 演算法定量?

 完全可行。將定性的 KEGG Pathway Map(生物拓撲圖) 與定量的 Leiden 演算法(網路社群分群) 結合,是系統生物學中非常經典且強大的做法(通常稱為機理約束的網絡模組探勘)。

結合的原理與定量化邏輯

  1. 定性圖(KEGG)作為架構(Prior Topology): KEGG 提供基因/蛋白質之間的調控方向與結構(節點 $V$ 與邊 $E$),代表「已知可能發生的生物學交互作用」。

  2. 定量數據(Expression)作為邊權重(Edge Weights): 將實驗量測到的基因表現量,計算基因對之間的相關係數或信號變化(如皮爾森相關係數 $R_{ij}$),作為網絡中每條邊的「真實傳導強度/權重」:

    $$W_{ij} = \text{KEGG\_Exist}_{ij} \times \vert{}\text{Corr}(g_i, g_j)\vert{}$$
  3. Leiden 演算法進行定量切割: Leiden 演算法吃入這張「帶有定量權重的生物圖」,不再只是切割任意共表達基因,而是在已知 KEGG 通路框架下,尋找在當前實驗條件下真正活躍(共表達強度高)的動態子模組(Sub-pathway Modules)

Python 實作演示範例

以下展示如何結合 NetworkX(處理 KEGG 定性網絡)、Pandas(處理定量表達量)與 igraph / leidenalg(執行帶權重的 Leiden 切割):

Python
import numpy as np
import pandas as pd
import networkx as nx
import igraph as ig
import leidenalg

# ==============================================================================
# 1. 建立定性的 KEGG Pathway 網路 (模擬 8 個基因的已知網絡拓撲)
# ==============================================================================
kegg_edges = [
    ("GeneA", "GeneB"), ("GeneB", "GeneC"), ("GeneC", "GeneD"),
    ("GeneA", "GeneC"), ("GeneE", "GeneF"), ("GeneF", "GeneG"),
    ("GeneG", "GeneH"), ("GeneD", "GeneE")  # 跨通路/模組的連接
]
kegg_net = nx.Graph()
kegg_net.add_edges_from(kegg_edges)
genes = list(kegg_net.nodes())

# ==============================================================================
# 2. 模擬真實樣本的定量基因表達數據 (8 個基因 x 6 個樣本)
# ==============================================================================
np.random.seed(42)
# 模擬 GeneA~D 在樣本中呈現高度同步表現,GeneE~H 為另一種同步模式
expr_matrix = np.random.randn(len(genes), 6)
expr_matrix[:4, :] += np.array([2, 4, 1, 5, 3, 6])  # 模組 1 訊號
expr_matrix[4:, :] += np.array([6, 1, 5, 2, 4, 1])  # 模組 2 訊號

df_expr = pd.DataFrame(expr_matrix, index=genes)

# ==============================================================================
# 3. 將定量數據 (相關性) 疊加至 KEGG 定性邊上 (計算邊權重)
# ==============================================================================
corr_matrix = df_expr.T.corr(method="pearson")  # 計算基因間表現量相關性

g_ig = ig.Graph()
g_ig.add_vertices(genes)

edges_ig = []
weights = []

# 只保留 KEGG 中有定義的邊,並將「表達量相關性」作為定量的邊權重
for u, v in kegg_net.edges():
    u_idx = genes.index(u)
    v_idx = genes.index(v)
    
    # 取相關性絕對值作為網絡流量/權重 (weight)
    w = abs(corr_matrix.loc[u, v])
    
    edges_ig.append((u_idx, v_idx))
    weights.append(w)

g_ig.add_edges(edges_ig)
g_ig.es["weight"] = weights

# ==============================================================================
# 4. 執行帶權重的 Leiden 演算法 (Weighted Leiden Clustering)
# ==============================================================================
# 使用 ModularityVertexPartition 並傳入定量權重 weights
partition = leidenalg.find_partition(
    g_ig,
    leidenalg.ModularityVertexPartition,
    weights="weight",
    resolution_parameter=0.5,
    seed=42
)

# ==============================================================================
# 5. 輸出整合結果
# ==============================================================================
print("📊 結合 KEGG 拓撲與表達量權重後的 Leiden 分群結果:")
for cluster_id, nodes in enumerate(partition):
    cluster_genes = [genes[idx] for idx in nodes]
    print(f"功能子模組 (Module) {cluster_id + 1}: {cluster_genes}")

應用價值

  • 過濾偽陽性: 純粹計算共表達(如 WGCNA)容易將缺乏生物學因果關係的基因聚在一起;加入 KEGG 圖拓撲能保證分出的模組符合已知生理機制。

No comments: