1. 从公共数据库挖掘基因表达数据的价值
TCGA和GEO这两个公共数据库简直就是生物医学研究的金矿。我刚开始接触生物信息学的时候,完全没想到这些免费公开的数据里藏着这么多宝贝。TCGA(癌症基因组图谱)收集了上万例癌症患者的基因组、转录组等数据,而GEO(基因表达综合数据库)则包含了全球研究者上传的各种基因表达数据。这两个数据库加在一起,就像是一个巨大的基因表达"图书馆"。
在实际研究中,我们经常会遇到这样的情况:发现某个基因(比如PDCD1或者GPX3)在疾病中很重要,但具体它参与哪些生物学过程却不太清楚。这时候,通过分析这个基因与其他基因的表达相关性,就能像侦探破案一样,找出它的"同伙",进而推测它的功能。这种方法在业内被称为"guilt by association"(协同犯罪),我更喜欢叫它"找朋友"方法——通过看一个基因经常和哪些基因一起出现,来猜测它是干什么的。
2. 数据准备与预处理
2.1 数据加载与检查
首先得把数据准备好。我通常会使用R语言来处理这些数据,因为它有丰富的生物信息学包支持。假设我们已经从TCGA下载并整理好了表达矩阵数据,保存为exprSet_arrange.Rdata文件。加载数据很简单:
load(file = "exprSet_arrange.Rdata") exprSet[1:3,1:3]这个操作会显示出表达矩阵的前三行和三列,帮助我们确认数据结构是否正确。记住,在基因表达矩阵中,行通常是样本,列是基因。这个检查步骤很重要,我曾经因为没检查数据结构,浪费了半天时间跑分析,结果发现数据方向反了。
2.2 数据质量控制
拿到数据后,千万别急着分析。我吃过亏,后来养成了先做质控的习惯。要看下数据是否有缺失值,表达量分布是否合理。可以用下面这些简单的代码检查:
# 检查缺失值 sum(is.na(exprSet)) # 查看表达量分布 summary(exprSet[,1:5])如果发现有问题,比如太多缺失值或者表达量分布异常,就需要考虑是否要过滤样本或基因,或者进行归一化处理。这个步骤虽然枯燥,但能避免后续分析出现大问题。
3. 批量相关性分析实战
3.1 相关性分析方法选择
相关性分析有很多方法,最常用的是Pearson和Spearman。Pearson衡量线性相关性,而Spearman衡量单调关系,对异常值更稳健。在基因表达分析中,我更喜欢用Spearman,因为基因表达关系不一定是线性的。
3.2 批量计算实现
假设我们要研究PDCD1这个基因,想知道哪些基因和它表达模式相似。下面是具体的代码实现:
y <- as.numeric(exprSet[,"PDCD1"]) colnames <- colnames(exprSet) cor_data_df <- data.frame(colnames) for (i in 1:length(colnames)){ test <- cor.test(as.numeric(exprSet[,i]), y, type="spearman") cor_data_df[i,2] <- test$estimate cor_data_df[i,3] <- test$p.value } names(cor_data_df) <- c("symbol","correlation","pvalue") head(cor_data_df)这段代码会对PDCD1和所有其他基因做Spearman相关性分析,保存相关系数和p值。在我的笔记本上,处理2万个基因大概需要30秒左右。如果数据更大,可以考虑用并行计算加速。
4. 结果筛选与验证
4.1 筛选显著相关基因
拿到相关性结果后,我们需要筛选出真正有意义的关联。通常我会设置两个阈值:p值小于0.05(统计显著),然后按相关系数绝对值取前500个基因。当然,这个数量可以根据需要调整。
library(dplyr) library(tidyr) cor_data_sig <- cor_data_df %>% filter(pvalue < 0.05) %>% arrange(desc(abs(correlation))) %>% dplyr::slice(1:500)4.2 可视化验证
筛选出来的基因需要验证。我特别喜欢用ggstatsplot包来做可视化,因为它不仅展示散点图,还自带统计检验结果。比如验证一个正相关基因IL2RG和一个负相关基因MARK1:
library(ggstatsplot) # 正相关基因示例 p1 <- ggscatterstats(data = exprSet, y = PDCD1, x = IL2RG, centrality.para = "mean", margins = "both", xfill = "#CC79A7", yfill = "#009E73", marginal.type = "histogram", title = "Relationship between PDCD1 and IL2RG") # 负相关基因示例 p2 <- ggscatterstats(data = exprSet, y = PDCD1, x = MARK1, centrality.para = "mean", margins = "both", xfill = "#CC79A7", yfill = "#009E73", marginal.type = "histogram", title = "Relationship between PDCD1 and MARK1") # 用cowplot拼图 library(cowplot) plot_grid(p1, p2, nrow = 1, labels = LETTERS[1:2])这种可视化不仅能直观展示相关性,还能看到表达量分布,非常实用。
5. 功能注释与通路分析
5.1 基因ID转换
有了相关性显著的基因列表后,就可以进行功能注释了。但首先需要把基因符号转换成ENTREZ ID,因为很多注释工具使用这种ID。
library(clusterProfiler) library(stringr) gene <- str_trim(cor_data_sig$symbol, 'both') gene = bitr(gene, fromType="SYMBOL", toType="ENTREZID", OrgDb="org.Hs.eg.db")5.2 GO富集分析
接下来做GO富集分析,看看这些基因主要参与哪些生物学过程、分子功能和细胞组分:
go <- enrichGO(gene = gene$ENTREZID, OrgDb = "org.Hs.eg.db", ont = "all") # 条形图展示 barplot(go, split="ONTOLOGY") + facet_grid(ONTOLOGY~., scale="free") # 气泡图展示 dotplot(go, split="ONTOLOGY") + facet_grid(ONTOLOGY~., scale="free")通过这些分析,我们可能会发现PDCD1相关的基因富集在T细胞激活、免疫反应等通路中,这与已知的PDCD1功能是一致的。这种方法的神奇之处在于,即使对功能完全未知的基因(比如很多lncRNA),也能给出可能的功能提示。
6. 实际应用案例:GPX3与ECM的关系
最近我在分析肺纤维化数据时,用这个方法研究了GPX3基因。通过分析单细胞RNA测序数据,发现GPX3与ECM(细胞外基质)评分显著相关:
load("mydata_for_gpx3_ecm_association.rds") ggscatterstats(data = mydata, y = ECM_Score, x = GPX3, centrality.para = "mean", margins = "both", xfill = "#CC79A7", yfill = "#009E73", marginal.type = "histogram", title = "Relationship between GPX3 and ECM_Score from fibroblasts in GSE135895")这个分析提示GPX3可能参与细胞外基质的调控,为后续实验提供了重要线索。这种从大数据中发现线索,再通过实验验证的研究模式,正在成为生物医学研究的新范式。
7. 方法优势与注意事项
这种基于相关性分析反向推导基因功能的方法有几个明显优势:首先,它不需要预先知道基因功能;其次,它对编码基因和非编码RNA都适用;最后,它完全基于公共数据,成本低廉。
但也要注意几个问题:相关性不等于因果关系,需要实验验证;不同癌症类型的结果可能不同;样本量会影响相关性稳定性。我在实践中会同时分析多个独立数据集,只有重复出现的结果才更可信。
这个方法最让我兴奋的是它的应用前景。随着单细胞测序数据的爆发式增长,我们可以更精细地分析基因在不同细胞类型中的"朋友圈",这将大大推进我们对基因功能的理解。