1. 初识CCLE你的癌症细胞系研究“百宝箱”如果你刚开始接触癌症研究特别是想做细胞系层面的分析那CCLE数据库绝对是你绕不开的一个宝藏。我刚开始做肝癌相关课题的时候导师就让我从这里找数据当时也是一头雾水什么表达谱、突变数据、药物敏感性感觉信息量巨大不知道从何下手。但用熟了之后才发现它就像一个整理得井井有条的“百宝箱”里面装满了上千种癌症细胞系的详细“档案”从基因表达、拷贝数变异到蛋白质丰度应有尽有。对于咱们做肝癌研究的来说最大的好处就是不用自己辛辛苦苦去养细胞、做测序直接就能拿到一批经过标准化处理的、高质量的数据大大加快了研究的起步速度。CCLE的全称是Cancer Cell Line Encyclopedia你可以把它理解为一个超级详细的“癌细胞系百科全书”。它由Broad研究所等机构牵头建立目的就是为了给全球的癌症研究者提供一个统一、可靠的体外模型数据资源。我实测下来它的数据质量非常稳因为所有细胞系的测序和分析都是在同一平台、同一流程下完成的这就避免了不同实验室数据之间的批次效应让我们做后续分析的时候心里更有底。特别值得一提的是它里面包含了不少肝癌细胞系比如大家熟悉的HepG2、Huh-7、SNU-398等等这对于我们聚焦于肝癌机制探索、生物标志物发现或者药物筛选简直是量身定做的起点。那么这个数据库到底适合谁用呢我觉得主要分三类人第一类是刚入门的研究生或科研新手想快速上手癌症生物信息学分析CCLE提供了现成的、干净的数据让你能跳过最头疼的数据预处理直接进入核心的分析环节第二类是实验生物学家手头有了一些有趣的发现想先在公共数据库的细胞系水平上进行验证或扩大样本量第三类就是专注于计算生物学或生物信息学的研究者需要大规模、标准化的数据来构建预测模型或进行算法开发。无论你属于哪一类只要你的研究涉及癌症细胞系CCLE都应该是你工具箱里的首选。2. 实战第一步精准获取肝癌细胞系数据知道了CCLE的好接下来咱们就得动手把它里面的宝贝“挖”出来了。整个过程可以概括为“找对门、下对货、挑对人”听起来简单但每一步都有些小细节需要注意不然很容易拿到一堆用不了的数据白白浪费时间。### 2.1 找到官方入口与数据下载首先我们得找到正版的数据源。最权威的途径就是直接访问Broad研究所的DepMap门户网站。这里我强烈建议大家养成从官方渠道下载数据的习惯因为第三方网站的数据可能不是最新版或者经过了二次处理容易引入不必要的麻烦。进入DepMap官网后找到“Data”或“Download”板块你会看到不同版本的数据集。这里有个关键点CCLE的数据现在已经整合进了更大的DepMap项目中所以我们需要找的是像“CCLE Expression (RNAseq)”或“Omics”这类文件。对于表达分析我们最需要的就是那个基因表达矩阵文件通常名字类似CCLE_expression.csv或OmicsExpressionProteinCodingGenesTPMLogp1.csv。点击下载文件通常不小有几百兆需要一点耐心。除了表达数据我建议你把样品信息文件也一起下载下来名字一般是sample_info.csv。这个文件是后续筛选细胞的“花名册”至关重要。它里面记录了每个细胞系的详细信息比如在DepMap中的唯一ID、细胞系名称、来源的癌症类型primary_disease、组织来源lineage等等。有时候你可能会看到数据有多个版本号我的经验是选择最新的稳定版Stable Release就行新版本通常会修复一些bug并增加新的细胞系数据。### 2.2 解读样品信息表与精准筛选数据下载到本地后先别急着处理那个巨大的表达矩阵。咱们应该先从“花名册”——sample_info.csv入手。用Excel或者文本编辑器打开它你会看到密密麻麻几十列信息。刚开始看可能会有点懵但别担心我们不需要全部关注。我通常最关心的几列是DepMap_ID细胞在数据库中的唯一身份证号、stripped_cell_line_name简洁的细胞系标准名称比如HUH7、primary_disease原发疾病这里就是我们筛选肝癌的关键、以及lineage谱系比如Liver。接下来就是动用R语言进行精准筛选的时刻了。这也是整个流程中第一个需要写代码的环节。思路很简单读取样品信息表然后从中挑出所有primary_disease为“Liver Cancer”的行。这里有个细节不同版本的数据中疾病名称的写法可能略有差异有的可能是“Liver Cancer”有的可能是“Hepatocellular Carcinoma”所以下载数据后最好先用unique()函数查看一下primary_disease这一列具体有哪些取值确保筛选条件写对。下面是我常用的代码片段# 读取样品信息 sample_info - read.csv(sample_info.csv, stringsAsFactors FALSE) # 查看所有癌症类型确认‘肝癌’的确切名称 unique(sample_info$primary_disease) # 筛选出肝癌细胞系 liver_cell_lines - sample_info[sample_info$primary_disease Liver Cancer, ] # 看看我们筛选出了多少种肝癌细胞系 nrow(liver_cell_lines) print(liver_cell_lines$stripped_cell_line_name)运行完这段代码你就能得到一个只包含肝癌细胞系的数据框liver_cell_lines。我建议在这一步就把这个筛选结果单独保存下来比如存成.RData格式因为后续几步都要用到它。save(liver_cell_lines, file liver_cell_line_info.RData)3. 构建基因表达矩阵从海量数据中“捞针”拿到了我们感兴趣的肝癌细胞系名单下一步就是从庞大的全局表达矩阵里把这些细胞对应的表达数据“提取”出来构建一个专属于肝癌的分析矩阵。这个过程有点像拿着一份名单去一个住着上千人的大宿舍里把名单上的人找出来并记录下他们的信息。### 3.1 读取与匹配全局表达数据首先我们需要把之前下载的那个巨大的CCLE_expression.csv文件读进R里。这个文件行是基因列是细胞系以DepMap_ID标识单元格里的值是经过log2(TPM1)转换后的基因表达量。这种格式在生物信息学中非常常见。直接读取可能会因为文件过大而有点慢耐心等待一下。# 读取全局表达矩阵 exp_matrix - read.csv(CCLE_expression.csv, row.names 1, check.names FALSE) # 查看一下数据规模和前几行几列 dim(exp_matrix) exp_matrix[1:3, 1:3]这里row.names 1是把第一列通常是基因名或Ensembl ID设置为行名。check.names FALSE是为了防止R自动把列名即细胞系ID中的特殊字符比如“-”改成点保持原样有利于后续精确匹配。接下来就是关键的数据匹配了。我们的目标是从exp_matrix这个“大宿舍”里只保留那些列名细胞系ID存在于我们肝癌名单liver_cell_lines$DepMap_ID中的列。# 获取我们需要的肝癌细胞系ID列表 target_ids - liver_cell_lines$DepMap_ID # 从全局矩阵中提取这些ID对应的列 liver_exp_matrix - exp_matrix[, colnames(exp_matrix) %in% target_ids] # 检查提取后的矩阵维度 dim(liver_exp_matrix)### 3.2 数据整合与清洗成功提取后我们得到了一个行是基因、列是肝癌细胞系ID的表达矩阵。但这里有个问题矩阵的列名是DepMap_ID如ACH-001113而我们人类更习惯看细胞系的实际名称如HUH7。所以我们需要把liver_cell_lines中的细胞系名称信息整合进来。一个稳妥的方法是先确保两个数据框的顺序一致然后直接赋值列名。更通用的做法是使用match()函数或通过data.frame的合并操作。我更喜欢下面这种清晰的方式# 将细胞系信息表的行名设为DepMap_ID方便匹配 rownames(liver_cell_lines) - liver_cell_lines$DepMap_ID # 确保表达矩阵的列顺序与信息表的行顺序一致基于共同的ID common_ids - intersect(colnames(liver_exp_matrix), rownames(liver_cell_lines)) liver_exp_matrix - liver_exp_matrix[, common_ids] liver_cell_lines - liver_cell_lines[common_ids, ] # 现在将列名从ID替换为更易读的细胞系名称 colnames(liver_exp_matrix) - liver_cell_lines$stripped_cell_line_name # 查看整合后的矩阵 liver_exp_matrix[1:3, 1:3]有时候数据中会存在缺失值NA或重复的基因名比如同一个基因有多个转录本ID在后续分析中我们通常只需要一个。因此简单的数据清洗是必要的# 1. 去除在任何样本中表达量都为NA的基因这些基因没有信息 liver_exp_matrix - liver_exp_matrix[complete.cases(liver_exp_matrix), ] # 2. 如果存在重复的行名基因取平均值或最大值作为代表根据分析目的选择 # 例如取平均值 if(any(duplicated(rownames(liver_exp_matrix)))) { liver_exp_matrix - aggregate(liver_exp_matrix, bylist(rownames(liver_exp_matrix)), FUNmean) rownames(liver_exp_matrix) - liver_exp_matrix$Group.1 liver_exp_matrix$Group.1 - NULL } # 最后保存这个干净的、专属于肝癌的表达矩阵 write.csv(liver_exp_matrix, file Liver_Cancer_CCLE_Expression_Matrix.csv, row.names TRUE) save(liver_exp_matrix, liver_cell_lines, file Liver_CCLE_Data_Processed.RData)走到这一步恭喜你你已经成功地从CCLE这个大海里捞出了属于肝癌的那一勺水并且把它整理成了干净、规整的表达矩阵。这个矩阵就是你后续所有分析的基石无论是差异表达、聚类还是生存分析结合其他数据都可以在此基础上展开。4. 基础分析演练让肝癌表达数据“说话”有了清洗好的肝癌细胞系表达矩阵我们就可以让它“说话”回答一些基础的生物学问题了。这里我分享两个最常用、也最能快速出结果的分析思路看看肝癌细胞系内部的异质性以及寻找关键的标志基因。这些分析不需要特别高深的编程技巧用R语言的基础包和几个流行的生物信息学包就能完成。### 4.1 探索性分析聚类与可视化拿到数据我习惯先做个聚类热图Heatmap直观地看看这些肝癌细胞系在基因表达模式上是不是有自然的分组。比如是不是有些细胞系聚在一起可能代表某种亚型这能给我们后续的深入分析提供线索。做热图我常用pheatmap包因为它默认的配色和聚类效果就很好看而且可以方便地添加样本注释比如细胞系的来源、突变状态等如果我们有其他数据的话。不过全局基因做热图维度太高计算慢且噪音多我们通常先选择一组变异系数大的基因比如top 500或者直接使用已知的肝癌相关基因集。# 安装并加载包 # install.packages(pheatmap) library(pheatmap) # 计算所有基因在所有样本中的变异系数标准差/均值衡量基因表达的变化程度 gene_vars - apply(liver_exp_matrix, 1, sd) / apply(liver_exp_matrix, 1, mean) # 选择变异系数最大的前500个基因 top_variable_genes - names(sort(gene_vars, decreasing TRUE))[1:500] # 提取这部分基因的表达数据 exp_for_heatmap - liver_exp_matrix[top_variable_genes, ] # 绘制热图这里先对行基因进行标准化使比较更公平 pheatmap(exp_for_heatmap, scale row, # 按行标准化 clustering_distance_rows euclidean, clustering_distance_cols euclidean, clustering_method complete, show_rownames FALSE, # 基因太多不显示名字 show_colnames TRUE, color colorRampPalette(c(navy, white, firebrick3))(100), main Heatmap of Top 500 Variable Genes in Liver Cancer Cell Lines)通过热图你可能会发现细胞系分成了几个明显的簇。这时候你可以结合liver_cell_lines中的其他信息比如primary_or_metastasis是原发灶还是转移灶或者Subtype如果有的话通过pheatmap的annotation_col参数添加为热图上方的注释条看看这些分组是否与某些临床或生物学特征相关。### 4.2 差异表达基因初探另一个常见问题是如果我们根据某个特征比如是否有TP53突变这个信息可以从CCLE的突变数据中获得需要额外下载和处理把细胞系分成两组那么这两组之间哪些基因的表达差异最显著这就是差异表达分析。这里我们用最简单的t检验来演示思路。假设我们手动将细胞系分成了两组仅为演示实际分组应有生物学依据。# 假设我们根据某个外部信息或聚类结果将细胞系分为Group_A和Group_B # 这里随机指定前5个为Group_A后5个为Group_B仅为示例 group_labels - rep(c(Group_A, Group_B), each 5)[1:ncol(liver_exp_matrix)] names(group_labels) - colnames(liver_exp_matrix) # 对每个基因进行t检验 p_values - apply(liver_exp_matrix, 1, function(gene_exp) { t.test(gene_exp[group_labels Group_A], gene_exp[group_labels Group_B])$p.value }) # 计算log2 Fold Change (以Group_B相对于Group_A为例) mean_a - apply(liver_exp_matrix[, group_labels Group_A], 1, mean) mean_b - apply(liver_exp_matrix[, group_labels Group_B], 1, mean) log2fc - mean_b - mean_a # 注意我们的数据已经是log2(TPM1)所以这里差值近似log2FC # 整理结果 deg_results - data.frame( Gene rownames(liver_exp_matrix), Log2FC log2fc, PValue p_values, stringsAsFactors FALSE ) # 按P值排序查看最显著的基因 deg_results - deg_results[order(deg_results$PValue), ] head(deg_results, 20) # 可以简单画个火山图看看 # install.packages(ggplot2) library(ggplot2) deg_results$Significant - ifelse(deg_results$PValue 0.01 abs(deg_results$Log2FC) 1, Yes, No) ggplot(deg_results, aes(x Log2FC, y -log10(PValue), color Significant)) geom_point(alpha 0.6) scale_color_manual(values c(grey, red)) theme_minimal() labs(title Volcano Plot of Differential Expression, x Log2 Fold Change, y -Log10 P-value)当然真实的差异分析需要考虑更多因素比如方差齐性检验、多重检验校正得到FDR值使用更稳健的包如limma或DESeq2后者更适合计数数据而CCLE的TPM数据经过log转换后通常用limma。但上面的流程清晰地展示了从数据到结果的完整路径。找到的差异基因就可以作为候选分子去数据库里查功能、做通路富集分析故事线就慢慢展开了。5. 避坑指南与高阶应用思路走完前面的流程你应该已经能独立完成从CCLE下载数据到完成基础分析的全过程了。不过根据我自己的经验有几个坑是新手特别容易踩的这里重点说一下。同时也分享几个可以进一步探索的高阶方向让你的研究不止于基础分析。### 5.1 常见问题与解决方案第一个坑是数据版本和ID匹配问题。CCLE/DepMap的数据更新比较频繁不同版本间细胞系的数量、ID甚至列名都可能微调。所以一定要确保你下载的sample_info.csv和expression.csv来自同一个数据发布版本。匹配时用DepMap_ID是最可靠的用细胞系名称匹配可能会因为命名别名问题失败。我习惯在筛选后用intersect()函数检查一下两个列表的共同ID确保没有遗漏或错配。第二个是数据格式与理解。CCLE提供的表达量通常是log2(TPM1)。这意味着数值是连续型的可以直接用于t检验、相关性分析等。但你要知道它经过了log转换所以在解释Fold Change时2的Log2FC次方才是真实的表达倍数变化。另外有些分析如某些机器学习算法可能希望输入原始TPM值这时你需要进行反转换TPM 2^(log2TPMplus1) - 1。第三个是样本量问题。肝癌细胞系在CCLE里可能只有二三十个样本量相对较小。这在进行统计检验尤其是需要分组比较时统计效力可能不足。一个解决办法是结合其他数据库比如TCGA中的肝癌病人数据进行交叉验证或者利用CCLE中所有细胞系的数据进行泛癌分析寻找肝癌特异的模式。### 5.2 整合多组学数据与关联分析CCLE的强大之处在于它不止有RNA表达数据。如果你下载了它的突变数据CCLE_mutations.csv、拷贝数变异数据、甚至蛋白质组数据你就可以进行真正的多组学整合分析。这才是挖掘CCLE深度价值的玩法。例如你可以问在肝癌细胞系中TP53基因突变与哪些基因的表达变化最相关思路就是先从突变数据中提取肝癌细胞系的TP53突变状态突变型 vs 野生型然后以这个状态作为分组依据在表达矩阵中做差异分析就像4.2节演示的但分组依据是真实的突变信息。这样找到的基因很可能就是TP53调控网络的下游靶点。更进一步可以关联药物敏感性数据PRISM或CTRP。CCLE项目对大部分细胞系都进行了药物筛选。你可以下载药物反应数据然后计算某个基因的表达水平与细胞系对上百种药物敏感性的相关性例如计算皮尔逊相关系数。如果你发现某个基因的高表达与对某种化疗药的耐药性显著相关这就能为“生物标志物-药物反应”关联提供很强的计算证据指导后续的实验验证。我做过一个小项目就是通过这种方式在肝癌细胞系里找到了一个与索拉非尼耐药潜在相关的基因后续用实验初步验证了表型。注意进行多数据表关联时核心依然是细胞系DepMap_ID的精确匹配。务必以它为桥梁确保突变、拷贝数、药敏数据都对应到同一批肝癌细胞系上。建议在R中创建一个以DepMap_ID为键的主数据对象比如列表把不同来源的数据都整理进去这样后续分析调用起来会非常清晰。最后别忘了数据可视化的重要性。除了热图、火山图箱线图用于比较单基因在两组间的表达、散点图用于展示两个基因的相关性或基因表达与药敏IC50值的相关性都是非常有效且直观的工具。用ggplot2画图调整好颜色和主题能让你的发现更令人信服。记住清晰的图表有时比复杂的算法更能打动读者。