资讯动态

CIBERSORT零基础教程:免疫浸润分析原理、安装与结果解读全攻略

发布时间:2026/8/31 14:55:40 来源:尧图企业网站定制
简介本资源是面向生物信息学零基础学习者的转录组下游分析实战配套材料聚焦免疫微环境解析中的CIBERSORT算法应用适用于科研新手快速掌握免疫细胞浸润定量分析全流程。压缩包共13个文件包含5个CSV格式的输入与结果数据如LM22参考谱系、FPKM表达矩阵、分组信息及CIBERSORT输出、3个文本说明文件、2个已验证可一键运行的R脚本含主分析与差异检验、1份PDF教程索引、1张可视化结果PNG图及1个R历史记录文件整体大小为144.83MB。已有239人下载学习资源结构清晰按“输入—代码—输出”逻辑组织支持直接运行或对照教程逐步调试R脚本经实测兼容主流R版本附带完整注释与参数说明兼顾初学者理解与进阶用户复用需求。 手上只有一堆常规转录组表达矩阵却想看看肿瘤微环境里免疫细胞到底谁多谁少这类需求在肿瘤方向的研究里太常见了。你不想做实验不想补单细胞测序就想从现有的bulk RNA-seq数据里把免疫浸润情况挖出来——CIBERSORT就是目前用得最广、被引最多的方案。零基础能不能跑通能但网上零零散散的教程坑不少。这篇我直接按自己带人跑项目的流程把CIBERSORT的原理、安装、数据准备、运行、结果解读和排错一次讲完配套资源这块也会说清楚该去拿什么、怎么用。1. 开始之前先搞清楚CIBERSORT到底在做什么1.1 为什么免疫浸润分析成了转录组下游的“硬通货”这几年肿瘤相关文章里免疫浸润分析几乎成了标配。审稿人看免疫微环境你总得给出一张免疫细胞比例的图说明这个治疗组跟对照组之间、这个突变组跟野生型组之间到底哪种细胞在变多、哪种在变少。早期大家靠免疫组化或者流式做得细但通量低一个样本一个样本磨换一套marker还要重新标。转录组数据就不一样——每个样本本来就有一张全基因表达谱用算法从里面“拆”出细胞组成等于免费做了一层免疫分型。我见过太多人第一步就卡住了CIBERSORT官网怎么注册LM22哪里下载表达矩阵格式怎么弄为什么报错“Error in read.table”这些问题的答案散在各种问答帖里今天直接打包成一条龙。适合什么人看手上有表达矩阵、想做免疫浸润、但没系统学过R的新手以及跑过一次但结果不太信、想搞清楚原理的人。CIBERSORT对初学者最大的价值是它把免疫浸润从湿实验变成了纯计算任务你只要按格式准备好表达矩阵剩下就是一条命令的事。1.2 核心原理用“线性混合物”的思路拆细胞成分CIBERSORT的全称是Cell-type Identification By Estimating Relative Subsets Of RNA Transcripts本质是一个反卷积算法。怎么理解“反卷积”你想象自己拿到一碗混合豆浆里面有黄豆、黑豆、红豆磨出来的浆你不知道每家豆子放了多少。但你知道每种豆子磨出来的浆是什么味道、什么颜色于是根据整体口感和颜色就能反推出比例。肿瘤组织的转录组就是这碗混合豆浆——测序仪读到的每个基因的表达量是所有细胞类型表达信号的混合结果。CIBERSORT做的事情就是拿“每种免疫细胞的特征基因表达谱”当参考从混合信号里反向估算每种细胞占了多少。支撑这个计算的核心资源是LM22矩阵。LM22是一个22种免疫细胞亚型、547个marker基因构成的参考表达特征矩阵由斯坦福团队从纯化细胞亚群的表达谱里构建出来的包含naive和memory B细胞、浆细胞、CD8 T细胞、各种CD4 T细胞亚群、Treg、γδ T细胞、NK细胞、单核细胞、M0/M1/M2巨噬细胞、树突状细胞、肥大细胞、嗜酸性粒细胞、中性粒细胞等。CIBERSORT基于支持向量回归SVR完成反卷积流程上还会做1000次蒙特卡洛置换检验给每个样本算出一个P值评估结果可靠性。换句话说它不但告诉你有多少种免疫细胞还告诉你这个估算靠不靠谱。1.3 哪些场景适合用哪些场景该绕道CIBERSORT不是万能药我用下来觉得它在下面这些场景最合适RNA-seq和芯片表达数据都可以尤其是FFPE样本的转录组也能跑这在临床样本中很实用。肿瘤微环境研究比较不同分组间的免疫细胞差异跟生存分析、临床特征关联是主流用法。不要求有单细胞数据作为支撑直接用bulk数据出身快速拿到细胞比例。但也有不适合的场景。第一单细胞转录组数据不要用CIBERSORT你都拿到单细胞了直接看真实细胞类型比例就行反卷积反而是倒退。第二如果你的组织是纯细胞系或者不含丰富免疫细胞的样本比如纯骨骼肌、纯脂肪组织算出来的免疫比例意义有限。第三样本量太少小于10时结果不稳定最好有几十例以上再跑。一句话总结CIBERSORT定位是“没有单细胞条件时的最佳替代方案”想看懂这个算法的边界用起来才不会心里没底。2. 环境准备与安装把CIBERSORT安装包这件事一次搞定2.1 需要准备的三个东西跑CIBERSORT前先确认三样东西齐不齐R软件、三个依赖包、还有CIBERSORT源文件。很多新手跑到一半发现“缺东少西”基本都是这一步没规划好。R软件比较好办去R官网下载安装就行Windows和macOS都支持。建议装R 4.x版本太老的版本可能导致个别包装不上。RStudio不是必须的但强烈建议装一个它能让查看数据、写脚本、看报错信息都舒服很多尤其是对R不熟的人。CIBERSORT源文件是核心。这里要特别提醒CIBERSORT不是开源随意分发的工具它由斯坦福大学团队开发老版本1.03可以在官网注册后免费下载学术使用免费但需要同意协议。下载下来是一个压缩包里面有两个关键文件CIBERSORT.R算法主脚本和LM22.txt特征基因参考矩阵。这两个文件才是真正干活的工具网上有些Github仓库也能找到镜像但我建议还是走官网拿原版省得碰到魔改版导致结果别人不认。CIBERSORTx是新版云端形式功能更强但代码逻辑和输入形式都变了这篇教程先以本地1.03脚本为主跑通后再考虑高级版。2.2 详细安装步骤依赖包与脚本第一步安装R包。打开R或者RStudio在控制台逐行执行下面这几行代码if (!requireNamespace(BiocManager, quietly TRUE)) install.packages(BiocManager) install.packages(e1071) BiocManager::install(preprocessCore)这里简单说明一下这些包分别干什么。e1071是支持向量机实现包CIBERSORT的核心算法SVR就是靠它计算的装不上整个脚本跑不动。preprocessCore是芯片数据处理的一个基础包里面提供了quantile normalization分位数标准化函数CIBERSORT在做数据标准化时要用。BiocManager是Bioconductor包的安装管理器preprocessCore工具包得在Bioconductor源里装。Windows系统下preprocessCore一般能直接下载到预编译版本如果碰到需要编译的情况弹出一堆“gfortran”“make”之类的词通常意味着缺少RTools。解决办法是去RTools官网下载对应R版本的RTools默认安装然后重新执行BiocManager::install(preprocessCore)。macOS系统则可能需要先装Command Line Tools。这一步最容易劝退新手但其实只要记住“缺编译工具就装RTools”就够了。第二步把下载好的CIBERSORT压缩包解压把CIBERSORT.R和LM22.txt放到工作目录里。工作目录怎么转在RStudio里用setwd(你的目录路径)或者RStudio右下角Files面板里进入目标文件夹后点More Set As Working Directory。这里有个小建议路径纯英文不要带中文和空格。R里处理中文路径偶尔会出诡异问题为了稳妥项目文件夹就命名成cibersort_test这类英文名。2.3 怎么验证安装是否成功很多教程直接让你跳到运行但我觉得验证这一步不能省不然你都不知道自己装没装OK。在R控制台执行source(CIBERSORT.R) ls()如果输出里能看到cibersort这个函数说明主脚本加载成功。其实CIBERSORT.R内部会自动检查依赖包如果缺包source的时候就会报错提醒。source不报错基本上九成成功了。再验证LM22能不能正常读入sig - read.table(LM22.txt, header TRUE, row.names 1, check.names FALSE) dim(sig)正常会显示547 22说明特征矩阵读对了。这两个验证都通过就可以进入下一步了。3. 输入数据准备一份规范的表达矩阵长什么样3.1 格式要求第一列基因名后续列样本名CIBERSORT对输入表达矩阵的要求非常明确每一行是一个基因每一列是一个样本第一列是基因名推荐用Gene Symbol后面的列名是样本名。CSV和TXT都可以分隔符用tab或逗号都行但要注意headerTRUE。我经常收到别人发来的求助数据问题五花八门有人的矩阵行名是Ensembl ID有人的是Entrez ID还有人把探针ID也塞进来了。CIBERSORT本身不挑ID类型但我强烈建议用Gene Symbol原因是LM22矩阵里用的就是Gene Symbol用其他ID会导致匹配基因数量大幅下降结果稳定性受影响。第一列基因名必须唯一不能有重复。如果同一个基因出现了多行后续运行会报错或者匹配结果错乱。这里提前去重省得后面卡住。3.2 基因名转换与去重附代码数据里经常是Ensembl ID — 转换其实不难。如果R里面还没装org.Hs.eg.db先装一下专门用来做ID转换if (!requireNamespace(BiocManager, quietly TRUE)) install.packages(BiocManager) BiocManager::install(org.Hs.eg.db)转换核心代码library(org.Hs.eg.db) # 假设expr是表达矩阵行名是Ensembl ID ensembl_ids - rownames(expr) # 查对应关系 symbol_map - select(org.Hs.eg.db, keys ensembl_ids, keytype ENSEMBL, columns SYMBOL) # 合并到表达矩阵 expr$SYMBOL - symbol_map$SYMBOL[match(ensembl_ids, symbol_map$ENSEMBL)] # 丢弃没有匹配到symbol的行 expr - expr[!is.na(expr$SYMBOL), ] # 如果有重复symbol保留表达量总和最大的那行或者按平均表达量取最大 dup_genes - expr$SYMBOL[duplicated(expr$SYMBOL)] expr - expr[!duplicated(expr$SYMBOL), ]这个去重逻辑并不是唯一标准有人习惯按行方差取最大有人按平均表达量取最大一般来说效果差异不大。重要的是“先合成一个基因一行”保证后面流程走得通。3.3 表达量单位FPKM、TPM还是counts很多新手纠结CIBERSORT到底要求什么格式FPKM行不行TPM行不行counts行不行我直接给结论FPKM、TPM、芯片数据都可以脚本内置了rank normalization会自动把表达量排序后映射到固定秩次上不同定量方式的尺度差异会被磨平一部分。但这不代表counts就一定完全等效。counts没有做过长度归一化跟FPKM/TPM的基因间可比性都不一样CIBERSORT这种基于相对丰度的算法对基因长度偏差其实不敏感但稳妥起见我建议如果你手里是counts先转成TPM再跑。转换TPM的代码网上很多最简单的思路是拿每个基因的转录本长度用counts / length得到TPM。如果没有基因长度注释也可以用DESeq2::vst()或者limma::voom()做了归一化再跑效果大家反馈也还行。核心目标是让不同样本之间、样本与LM22之间处于可比的表达尺度。3.4 跟LM22匹配不上怎么办这是运行前最容易被忽视的一步。你的表达矩阵有2万个基因LM22只有547个基因两者取交集后还剩多少如果只剩一两百个结果可靠性就会打折扣。CIBERSORT脚本运行时会自动筛选出两个矩阵共有的基因用于分析不需要你手动merge但我建议你自己先跑一次交集统计心里有数。sig_genes - rownames(sig) expr_genes - rownames(expr) intersect_genes - intersect(sig_genes, expr_genes) length(intersect_genes)正常情况应匹配到400个以上。如果低于300建议检查基因ID类型是否是Gene Symbol以及数据来源是否为人类样本。专门提醒这一点是因为小鼠样本直接丢进去会匹配极少数基因结果是完全不能用的。小鼠数据想要用CIBERSORT得先把小鼠基因名转换成对应的人类同源基因转换工具可以用biomaRt包或者直接用同源基因表批量映射这一步虽然麻烦一点但属于必经之路。4. 运行CIBERSORT核心命令与结果解读4.1 一行命令跑起来参数逐个说数据准备完毕正式运行。在R控制台依次执行source(CIBERSORT.R) res - cibersort(sig_matrix LM22.txt, mixture_file expr.txt, perm 1000, QN TRUE)这里逐项说一下参数含义。sig_matrix指的是参考矩阵文件也就是LM22.txt放在工作目录里直接写文件名就行。mixture_file指你的表达矩阵文件注意格式要跟前面讲的一致。文件里不能有额外的第一列行名列CIBERSORT脚本默认第一列是基因名后续都是样本。perm是置换检验次数默认1000这个数值决定了P值的可靠性。也可以设成100跑得快一点但在文章里审稿人会挑毛病建议保持1000。置换检验的大致逻辑是把基因表达量打乱重排看看随机状态下能不能得到同样好的反卷积结果如果随机状态也能拟合得很好说明你真实的结果可能是运气P值就会变大。QN表示是否做分位数标准化TRUE是推荐设置。CIBERSORT自带的分位数标准化能有效消除样本间测序深度、批次效应的影响。前提是样本要做过log2转换或至少标准化否则QN对原始counts可能会把正常信号拉平。有人说QNTRUE会误删真实表达差异但在免疫浸润场景里QN带来的稳定性远大于风险先用TRUE跑通再对比FALSE结果也不迟。运行时间方面几十个样本、perm1000的情况下可能需要10到30分钟取决于电脑CPU性能。提前做好心理建设遇到“卡住不动”别急着关。运行结束后工作目录下会输出一个结果表格文件同时R环境里也会生成名为res的数据框对象下一步直接用它做可视化。4.2 输出文件里每一列的含义打开结果表格你会发现列数比预期多很多前面22列是22种免疫细胞的比例后面还有三列——P-value、Correlation、RMSE。这三列是判断结果质量的三个关键指标别急着开心先看它们。P-value是置换检验算出来的显著性越小说明反卷积结果越可靠。经验阈值是P0.05如果样本P值不显著意味着你的结果和随机排序得到的拟合程度差不多可信度低。我习惯跑完后先看一眼有多少样本P0.05如果一半以上不显著就要考虑数据本身是不是有问题。Correlation是真实混合表达谱与估算结果之间的相关系数值越大说明反卷积拟合效果越好一般要大于0.8越低越不靠谱。RMSE是均方根误差越小越好反过来看。有人说这三列不必全看但我建议都看一下尤其投文章前保证所有样本P0.05、相关系数都够高。注意结果里免疫细胞比例是相对丰度每一行之和约等于1不是绝对细胞数量写文章时措辞用“占比/比例”不要说“细胞数”。4.3 用R快速画出免疫浸润堆叠柱状图与热图结果只有表格还不行文章里需要图。第一张图是堆叠柱状图展示每个样本的免疫细胞构成第二张是热图展示细胞类型与样本的关系。堆叠柱状图用ggplot2画library(ggplot2) library(reshape2) # res里前22列是细胞比例如果列数有差异就按实际修改 df - as.data.frame(res) df$Sample - rownames(df) # 取22列细胞比例数据转为长格式 df_melt - melt(df, id.vars Sample, variable.name CellType, value.name Proportion) ggplot(df_melt, aes(x Sample, y Proportion, fill CellType)) geom_bar(stat identity, width 0.8) theme_bw() theme(axis.text.x element_text(angle 45, hjust 1)) labs(x Sample, y Relative Percentage, fill Cell Type)热图用pheatmap更省事library(pheatmap) # 取细胞比例矩阵行是样本列是细胞类型 mat - as.matrix(df[, 1:22]) pheatmap(mat, cluster_cols TRUE, cluster_rows TRUE, color colorRampPalette(c(blue, white, red))(100))图上还能顺手加分组注释比如把“治疗组/对照组”作为注释条展示。这个技能后面做生存分析、临床特征关联都用得上建议一次学会。5. 常见问题速查我踩过的坑一次帮你避完5.1 报错信息对照表我把自己和身边人遇到过的高频问题整理成了表格按“症状→原因→解法”的方式查起来最快。报错信息 / 症状可能原因解决办法Error in read.table... no lines available in input表达矩阵文件为空或路径写错检查文件是否在工作目录文件名大小写是否正确Error in if (min(eset) 0)表达矩阵没有做log2转换含大量0用log2(expr 1)转换或标准化后再跑Error: could not find function cibersortCIBERSORT.R没有source成功执行source(CIBERSORT.R)确认工作目录有该文件preprocessCore安装失败Windows缺少RTools或未配置编译器安装对应版本的RTools重启R后重试运行到一半卡住perm1000且样本量大计算慢先设perm100测试流程跑通后再放大到1000结果里大部分P值0.05数据质量差或样本类型不匹配检查样本是否混入非目标组织检查基因匹配数基因匹配数过少表达矩阵用的不是Gene Symbol做ID转换确认是人类样本5.2 几个独家经验帮你少走弯路第一路径别带中文。这是生信领域最朴素但最有效的经验。R的底层文件读取在某些系统中对中文路径支持不稳定尤其是Windows系统报错还可能不是路径问题导致的。项目目录、文件名全部用英文字母和数字最省事。第二多数据集合并跑之前先做批次校正。如果想把两个GEO数据集的表达矩阵合并到一起跑CIBERSORT建议先用sva::ComBat_seq()做批次效应移除否则批次差异会被当成生物学差异算出来的免疫细胞比例会带上一层“批次滤镜”。这个细节很多新手不知道但文章投出去容易被审稿人看出问题。第三结果解读时别陷入“唯P值论”。P值是一个有用的筛选指标但也要看效应量。比如某个样本P0.049跟另一个样本P0.051本质上差异不大不要因为一个临界值就把后者删掉。处理时更推荐的做法是把不显著的样本标注出来在敏感性分析里剔除P0.05的样本再验证一遍看结论是否稳健。第四小样本量时优先跑CIBERSORTx做绝对分数。本地版CIBERSORT输出的是相对比例对于样本量极小的探索性分析相对比例波动会很大。如果你后续还要做多组学整合或者关心细胞绝对丰度变化建议同一批数据用CIBERSORTx的模式跑一遍做交叉验证。5.3 结果与生存分析、临床信息怎么无缝衔接免疫浸润分析很少是终点通常只是第一步后面要接生存分析或相关性分析。拿到res数据框后先把它保存为CSV然后用样本名做key跟临床信息表mergewrite.csv(res, cibersort_results.csv) # 假设clin是临床数据包含样本名、生存时间、生存状态、分组 merged - merge(clin, as.data.frame(res), by.x sample_id, by.y row.names)后面就可以直接对细胞比例做差异检验wilcox.test、相关性分析cor.test、生存分析survival包甚至拿细胞比例做LASSO回归都是顺理成章的事。CIBERSORT真正有价值的部分是下游关联分析能算出比例不算本事能讲出生物学故事才算。个人实操下来CIBERSORT这个工具其实是“门槛低、天花板高”的典型——安装和跑通半天就能完成但把结果解读清楚、跟临床问题关联起来才是拉开差距的地方。最后再分享一个小技巧每次跑完把res保存一份带日期的版本方便回溯。数据分析最怕的就是跑完不存档三个月后想找回当时的参数配置和结果发现全丢了。养成“输入脚本输出结果”一起打包的习惯整个项目复盘会轻松很多。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价