# 第8章：网络药理学基础

> 本章将核心基因与药物联系起来，回答"这些基因能被什么药物调控？" 学完本章，你将拥有一份候选药物清单，并通过网络分析揭示药物的作用机制。

---

## 8.1 网络药理学是什么？

### 1.1 定义

```
网络药理学 = 系统生物学 + 多向药理学 + 网络科学

传统药理学：
一个药物 → 一个靶点 → 一种疾病
（如：阿司匹林 → COX → 抗炎）

网络药理学：
一个药物 → 多个靶点 → 多个通路 → 一种疾病
（如：中药成分 → 调控10个靶点 → 影响3条通路 → 治疗COPD合并DM）

核心假设：
疾病不是单一靶点的问题，而是网络失衡
好的药物应该调控网络的多个节点，恢复平衡
```

### 1.2 分析流程

```
核心基因列表
    ↓
① 查询药物的靶点信息
    ↓
② 找到能调控核心基因的药物
    ↓
③ 构建"药物-靶点-疾病"网络
    ↓
④ 功能富集分析药物的作用机制
    ↓
⑤ 评估药物-靶点的结合能力
    ↓
候选药物推荐
```

---

## 8.2 药物靶点数据库

### 2.1 常用数据库

| 数据库 | 网址 | 特点 | 用途 |
|--------|------|------|------|
| **DrugBank** | drugbank.ca | 最全面，包含FDA批准药和实验药 | 查询已知靶点 |
| **TTD** | db.idrblab.net/ttd | 治疗靶点数据库 | 疾病相关靶点 |
| **STITCH** | stitch.embl.de | 化合物-蛋白相互作用 | 预测化合物靶点 |
| **SwissTargetPrediction** | swisstargetprediction.ch | 基于结构预测 | 预测小分子靶点 |
| **PharmGKB** | pharmgkb.org | 药物基因组学 | 基因型-药物反应 |
| **TCMSP** | tcmsp-e.com | 中药系统药理学 | 中药成分靶点 |
| **HERB** | herb.ac.cn | 高通量实验中药数据库 | 中药现代化研究 |

### 2.2 使用策略

```
查询优先级：

1. 已知药物（DrugBank/TTD）
   → 查询核心基因是否已有靶向药物
   → 如果有 = 已有药物可能用于合并症治疗

2. 中药成分（TCMSP/HERB）
   → 从传统中药中找活性成分
   → 适合补充"天然产物"维度

3. 预测工具（SwissTargetPrediction）
   → 对感兴趣的化合物预测靶点
   → 用于新化合物或已上市药物的 repurposing
```

---

## 8.3 药物-靶点查询实操

### 3.1 DrugBank查询

```r
library(RCurl)
library(XML)
library(rjson)

# DrugBank数据下载（需要注册获取API Key）
# 或者下载完整数据集

# 方法1：批量下载完整数据（推荐）
# 访问 https://go.drugbank.com/releases/latest
# 下载 drugbank_all_full_database.xml.zip
# 解压后解析XML

# 方法2：用dplyr和stringr手动整理（如果数据量小）
# 这里演示从已知数据整理

# 读取DrugBank数据（假设已下载并解析）
# 实际应用中可以用XML包解析

# 简化的查询方法：用drugbankR包
# install.packages("drugbankR")
# 或从GitHub安装
```

### 3.2 手动整理药物-靶点关系

```r
# ============================================================
# 网络药理学：药物-靶点映射
# ============================================================

library(tidyverse)

# 读取核心基因
core_genes <- read.csv("output/core_genes_final.csv")$Gene

# ---- 方法1：从已知数据库手动整理 ----
# 这里使用模拟数据演示，实际应从数据库查询

# 创建一个示例药物-靶点数据库
drug_targets <- data.frame(
    Drug = c("Metformin", "Metformin", "Metformin",
             "Dexamethasone", "Dexamethasone",
             "Quercetin", "Quercetin", "Quercetin", "Quercetin",
             "Resveratrol", "Resveratrol",
             "Curcumin", "Curcumin", "Curcumin",
             "NAC", "NAC",
             "Vitamin D", "Vitamin D"),
    Target = c("AMPK", "SIRT1", "mTOR",
               "GR", "NFKB1",
               "IL6", "TNF", "VEGFA", "TP53",
               "SIRT1", "AMPK",
               "TNF", "IL6", "NFKB1",
               "ROS", "NFKB1",
               "VDR", "IL6"),
    Database = c(rep("DrugBank", 18)),
    stringsAsFactors = FALSE
)

# 筛选靶向核心基因的药物
core_drug_targets <- drug_targets[drug_targets$Target %in% core_genes, ]

# 统计每个药物靶向的核心基因数
drug_summary <- core_drug_targets %>%
    group_by(Drug) %>%
    summarise(
        Target_Count = n(),
        Targets = paste(Target, collapse = ", "),
        .groups = "drop"
    ) %>%
    arrange(desc(Target_Count))

print(drug_summary)

# 保存
write.csv(drug_summary, "output/drug_target_summary.csv", row.names = FALSE)
write.csv(core_drug_targets, "output/core_gene_drug_targets.csv", row.names = FALSE)
```

### 3.3 TCMSP中药数据库查询

```r
# TCMSP查询（模拟）
# 实际应用中：
# 1. 访问 https://tcmsp-e.com/
# 2. 在"Targets"中输入核心基因名
# 3. 查看相关化合物

# 模拟TCMSP结果
tcmsp_results <- data.frame(
    Molecule = c("Quercetin", "Kaempferol", "Luteolin", 
                 "Apigenin", "Berberine", "Baicalin"),
    Herb = c("Ginkgo", "Ginkgo", "Scutellaria",
             "Scutellaria", "Coptis", "Scutellaria"),
    Target = c("IL6, TNF, VEGFA", "TP53, SIRT1", "IL6, TNF",
               "TP53", "TNF, IL6", "TNF, IL6"),
    OB = c(46.4, 41.9, 36.2, 23.1, 36.9, 40.1),
    DL = c(0.28, 0.24, 0.25, 0.22, 0.73, 0.65),
    stringsAsFactors = FALSE
)

# 筛选OB > 30% 且 DL > 0.18 的成分
tcmsp_filtered <- tcmsp_results %>%
    filter(OB >= 30, DL >= 0.18)

print(tcmsp_filtered)
```

---

## 8.4 网络构建

### 4.1 "药物-靶点-疾病"网络

```r
library(igraph)
library(ggraph)

# 构建网络数据
nodes <- data.frame(
    name = c(core_genes, 
             unique(drug_summary$Drug),
             "COPD", "Diabetes"),
    type = c(rep("Gene", length(core_genes)),
             rep("Drug", length(unique(drug_summary$Drug))),
             rep("Disease", 2)),
    stringsAsFactors = FALSE
)

# 边：药物-靶点
edges_drug_target <- core_drug_targets %>%
    select(from = Drug, to = Target)

# 边：基因-疾病（假设核心基因都与两种疾病相关）
edges_gene_disease <- expand.grid(
    Gene = core_genes,
    Disease = c("COPD", "Diabetes"),
    stringsAsFactors = FALSE
) %>%
    select(from = Gene, to = Disease)

# 合并边
edges <- bind_rows(edges_drug_target, edges_gene_disease)

# 创建网络
g <- graph_from_data_frame(edges, vertices = nodes, directed = FALSE)

# 画网络
ggraph(g, layout = "fr") +
    geom_edge_link(aes(color = type), alpha = 0.5) +
    geom_node_point(aes(color = type, size = degree(g)), alpha = 0.8) +
    geom_node_text(aes(label = name), repel = TRUE, size = 3) +
    scale_color_manual(values = c(
        "Gene" = "#F24236",
        "Drug" = "#2E86AB",
        "Disease" = "#F6AE2D"
    )) +
    scale_size_continuous(range = c(3, 10)) +
    theme_graph() +
    labs(title = "药物-靶点-疾病网络")

ggsave("output/19_drug_target_disease_network.png", width = 12, height = 10)
```

---

## 8.5 药物功能富集

```r
library(clusterProfiler)
library(org.Hs.eg.db)

# 获取候选药物靶向的全部基因
candidate_drugs <- drug_summary$Drug[drug_summary$Target_Count >= 2]
drug_all_targets <- drug_targets$Target[drug_targets$Drug %in% candidate_drugs]
drug_all_targets <- unique(drug_all_targets)

# 转ENTREZ ID
drug_target_df <- bitr(drug_all_targets, 
                       fromType = "SYMBOL",
                       toType = "ENTREZID",
                       OrgDb = org.Hs.eg.db)

# KEGG富集
drug_kegg <- enrichKEGG(
    gene = drug_target_df$ENTREZID,
    organism = 'hsa',
    pAdjustMethod = "BH",
    pvalueCutoff = 0.05
)

# 可视化
dotplot(drug_kegg, showCategory = 15, 
        title = "候选药物靶点KEGG富集")
ggsave("output/20_drug_KEGG.png", width = 10, height = 8)

# 与核心基因的富集结果对比
# 如果两者富集的通路高度重叠，说明药物确实作用于疾病相关通路
```

---

## 8.6 药物筛选评分

```r
# ============================================================
# 候选药物综合评分
# ============================================================

# 评分维度：
# 1. 靶向核心基因数量（越多越优）
# 2. 已知临床证据（有临床数据加分）
# 3. 安全性（已上市药物加分）
# 4. 与疾病通路的相关性

drug_score <- drug_summary %>%
    mutate(
        Score_Target = Target_Count * 10,  # 靶点得分
        Score_Clinical = case_when(
            Drug %in% c("Metformin", "Dexamethasone") ~ 20,
            TRUE ~ 5
        ),
        Score_Safety = case_when(
            Drug %in% c("Metformin", "NAC", "Vitamin D") ~ 20,
            TRUE ~ 10
        ),
        Total_Score = Score_Target + Score_Clinical + Score_Safety
    ) %>%
    arrange(desc(Total_Score))

print(drug_score)

# 可视化得分
ggplot(head(drug_score, 10), 
       aes(x = reorder(Drug, Total_Score), y = Total_Score)) +
    geom_bar(stat = "identity", fill = "#2E86AB") +
    coord_flip() +
    labs(x = "候选药物", y = "综合评分",
         title = "候选药物综合评分排名") +
    theme_minimal()

ggsave("output/21_drug_score.png", width = 8, height = 6)
```

---

## 8.7 本章作业

1. ✅ 为你的每个核心基因查询已知靶向药物（至少用2个数据库）
2. ✅ 列出候选药物清单，标注来源数据库
3. ✅ 构建"药物-靶点-疾病"网络图
4. ✅ 对候选药物做KEGG富集分析
5. ✅ 思考题：如果一个中药成分靶向3个核心基因，但每个靶点的结合力都很弱，这个成分还有价值吗？

---

> 📌 **核心要点**：网络药理学的价值不在于"预测一个神药"，而在于提供**可验证的假设**。预测的候选药物需要通过分子对接（第9章）和实验验证来确认。一个好的网络药理学分析，能让审稿人看到"从基因到药物"的逻辑链条是完整的。
