从一款抗癌药的研发说起科学家如何用基因富集分析找到药物靶点并预测副作用让新药研发更安全高效
开场:那个改变一切的基因突变
2018年,一款名为 pembrolizumab(帕博利珠单抗)的抗癌药横空出世。它不是传统的化疗药物,而是一种免疫检查点抑制剂——简单说,它不是直接去杀灭癌细胞,而是帮人体免疫系统”看清”癌细胞,从而让免疫细胞去攻击肿瘤。
这款药的研发背后,有一群科学家在做一件非常关键的事情:他们通过基因富集分析,从海量数据中找到了那个能精准打击肿瘤的靶点。
今天,我们就来聊聊这个看似高深、实则充满智慧的科学过程。
第一章:先搞清楚”基因富集分析”到底是什么
想象一下,你是一个侦探,手里有一百万条线索(基因数据)。你不能一条条去查,那样累死也查不完。基因富集分析就像是给这些线索”分类归档”,把最相关的线索拎出来,让你一眼就能看到关键。
它的具体做法
基因富集分析的核心逻辑是:当你做了一次基因表达实验,发现几百个基因发生了变化,这些基因并不是随机乱变的——它们往往集中在某些特定的”功能模块”里。这些模块在生物学上被称为”通路”(pathway)或”功能类别”(GO term)。
比如,你可能发现这些差异基因都跟”细胞周期”有关,那就说明这个癌症的驱动机制很可能跟细胞疯狂分裂有关。
一个真实的例子
科学家在研究一种叫做”酪氨酸激酶抑制剂”的抗癌药时,他们先对肿瘤组织做了基因测序,找到了500个表达异常的基因。然后用基因富集分析工具一跑,发现这些基因显著富集在以下几类通路中:
# 基因富集分析结果示例(简化版)
通路名称: "PI3K-AKT信号通路" 富集得分: 2.14e-05(P值)
通路名称: "细胞周期调控" 富集得分: 3.56e-04
通路名称: "EGFR信号通路" 富集得分: 1.23e-03
P值越小,说明这个通路的富集越不可能是偶然的。PI3K-AKT通路在多种癌症中都是关键驱动因素,这就给了科学家一个明确的靶点方向。
第二章:从癌症数据到药物靶点的完整流程
第一步:获取基因表达数据
现代癌症研究有一个非常庞大的公共资源,叫做 TCGA(The Cancer Genome Atlas),它包含了数千例各种癌症的基因数据。科学家可以下载这些数据,看看”癌组织”和”正常组织”之间,哪些基因表达不一样。
这里用一个简单的 Python 代码演示如何处理差异表达基因的数据:
import pandas as pd
from scipy import stats
# 假设我们有一个基因表达矩阵(行是基因,列是样本)
# 前10列是癌组织,后10列是正常组织
gene_expression = pd.read_csv('expression_matrix.csv', index_col=0)
# 计算每个基因的t检验,找出差异表达的基因
results = []
for gene in gene_expression.index:
tumor = gene_expression.loc[gene, :10]
normal = gene_expression.loc[gene, 10:]
t_stat, p_value = stats.ttest_ind(tumor, normal, equal_var=False)
# 计算log2倍数变化
log2fc = stats.tmean(tumor) - stats.tmean(normal)
results.append({
'gene': gene,
'log2fc': log2fc,
'p_value': p_value
})
diff_genes = pd.DataFrame(results)
# 筛选显著差异基因(p < 0.05 且 |log2fc| > 1)
diff_genes['p_adj'] = diff_genes['p_value'].rank(pct=True) # 简化校正
significant_genes = diff_genes[(diff_genes['p_value'] < 0.05) &
(abs(diff_genes['log2fc']) > 1)]
print(f"共发现 {len(significant_genes)} 个差异表达基因")
运行完这段代码,你就能拿到一份”差异基因清单”,这就是后续分析的基础。
第二步:基因富集分析——给差异基因”贴标签”
拿到差异基因后,科学家会使用 R 语言中的著名工具 clusterProfiler 来做基因富集分析。它能把基因映射到已知的生物学通路中,告诉你哪些通路被”显著激活”或”抑制”。
”`r
R语言代码示例:使用clusterProfiler进行GO和KEGG富集分析
library(clusterProfiler) library(org.Hs.eg.db)
输入:差异基因列表(基因ID)
gene_list <- significant_genes$gene # 差
