401_时序多组学数据分析¶
一句话说明¶
时序多组学分析就是在多个时间点同时测量基因组、转录组、蛋白组等数据,找出随时间变化的生物学规律。
核心知识点¶
什么是时序多组学¶
- 时序数据:在多个时间点(T0、T1、T2…)采集同一批样本的多种组学数据
- 常见场景:药物处理前后、疾病进展不同阶段、发育不同时期
- 核心挑战:时间点之间的批次效应、缺失数据插补、动态模式识别
数据类型组合¶
| 组学层 | 数据类型 | 常用工具 |
|---|---|---|
| 基因组 | DNA变异 | GATK |
| 转录组 | RNA-seq计数 | DESeq2 |
| 蛋白组 | 蛋白丰度 | MaxQuant |
| 代谢组 | 代谢物浓度 | MetaboAnalyst |
关键分析步骤¶
- 时间点对齐:确保各组学数据的时间节点一致
- 数据归一化:消除批次效应(ComBat-seq、Harmony)
- 时序模式挖掘:找出随时间显著变化的特征
- 多组学整合:关联不同层次的时序变化
实战代码¶
import pandas as pd # 数据处理
import numpy as np # 数值计算
import matplotlib.pyplot as plt # 绘图
# ========== 1. 模拟时序多组学数据 ==========
np.random.seed(42)
timepoints = [0, 6, 12, 24, 48] # 时间点(小时)
n_genes = 100 # 基因数量
n_samples = 3 # 每个时间点的生物学重复数
# 生成转录组时序数据
rna_data = {}
for t in timepoints:
# 模拟不同时间点的表达量(加入时间趋势+噪声)
expr = np.random.poisson(lam=100 + t * 2, size=(n_genes, n_samples))
rna_data[f"T{t}h"] = pd.DataFrame(
expr,
index=[f"Gene_{i}" for i in range(n_genes)],
columns=[f"Sample_{j}" for j in range(n_samples)]
)
# ========== 2. 合并各时间点数据 ==========
# 计算每个时间点的均值表达量
mean_expr = pd.DataFrame({
tp: df.mean(axis=1) # 对每个基因取3个重复的均值
for tp, df in rna_data.items()
})
print("时序表达矩阵形状:", mean_expr.shape) # (100基因, 5时间点)
# ========== 3. 识别时序变化基因 ==========
from scipy import stats
# 对每个基因做线性回归(时间 vs 表达量)
time_numeric = np.array(timepoints) # 将时间转为数值
results = []
for gene in mean_expr.index:
expr_values = mean_expr.loc[gene].values # 该基因在各时间点的表达量
slope, intercept, r_value, p_value, std_err = stats.linregress(
time_numeric, expr_values
)
results.append({
"gene": gene,
"slope": slope, # 斜率:正值=随时间升高,负值=降低
"r_squared": r_value**2, # 决定系数:反映线性拟合程度
"p_value": p_value # 统计显著性
})
results_df = pd.DataFrame(results)
# 筛选显著时序变化基因(p<0.05 且 R²>0.8)
sig_genes = results_df[(results_df["p_value"] < 0.05) &
(results_df["r_squared"] > 0.8)]
print(f"显著时序变化基因数: {len(sig_genes)}")
# ========== 4. 聚类时序模式 ==========
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans
# 对表达量做Z-score归一化(消除量级差异,关注变化趋势)
scaler = StandardScaler()
expr_scaled = scaler.fit_transform(mean_expr.T).T # 按基因归一化
# K-means聚类:找3种时序模式(上升、下降、先升后降等)
kmeans = KMeans(n_clusters=3, random_state=42)
clusters = kmeans.fit_predict(expr_scaled)
mean_expr["cluster"] = clusters # 将聚类结果加入数据框
# ========== 5. 可视化每个聚类的时序模式 ==========
fig, axes = plt.subplots(1, 3, figsize=(15, 4))
for cluster_id in range(3):
cluster_genes = mean_expr[mean_expr["cluster"] == cluster_id]
ax = axes[cluster_id]
# 画每个基因的时序曲线(浅色)
for _, row in cluster_genes.drop("cluster", axis=1).iterrows():
ax.plot(timepoints, row.values, alpha=0.3, color="steelblue")
# 画聚类均值曲线(深色)
ax.plot(timepoints,
cluster_genes.drop("cluster", axis=1).mean().values,
color="red", linewidth=2, label="Mean")
ax.set_title(f"Cluster {cluster_id} (n={len(cluster_genes)})")
ax.set_xlabel("Time (hours)")
ax.set_ylabel("Normalized Expression")
plt.tight_layout()
plt.savefig("temporal_clusters.png", dpi=150)
print("图片已保存")
面试常问点¶
Q: 时序多组学与普通多组学有什么区别? A: 时序多组学额外引入时间维度,需要考虑时间依赖性、样本追踪和动态因果关系,分析复杂度更高。
Q: 如何处理时序数据中的缺失时间点? A: 常用方法:样条插值(spline interpolation)、线性插值、基于模型的插补(如高斯过程回归)。
Q: 时序多组学中如何判断因果关系? A: 格兰杰因果检验(Granger causality)、动态贝叶斯网络(DBN)、信息论方法(Transfer Entropy)。
Q: 批次效应在时序数据中特别危险,为什么? A: 不同时间点往往在不同批次中处理,批次效应可能与时间效应混淆,导致假阳性时序基因。
速查表¶
| 工具/方法 | 用途 | 语言 |
|---|---|---|
maSigPro | 时序差异表达分析 | R |
ImpulseDE2 | 脉冲式时序变化检测 | R |
MOFA+ | 时序多组学因子分析 | Python/R |
DTW | 动态时间规整(时序相似度) | Python |
splineTimeR | 样条拟合时序数据 | R |
ComBat-seq | 批次效应校正 | R |