FEATURED · 精选文章

IOBR包实操:一站式搞定肿瘤免疫浸润分析

发布时间 / 2026/9/1 15:37:41
来源 / 创域科博编辑部
栏目 / 资讯中心
IOBR包实操:一站式搞定肿瘤免疫浸润分析 简介这是一份专注于肿瘤微环境解析的IOBR免疫浸润分析R包源码包主要面向使用R语言进行肿瘤免疫微环境研究的生物信息学者与科研人员。包内含18个文件以7个R脚本为核心覆盖数据生成、批量运行、结果可视化等流程另含3个RData样例数据、2个CSV配置/结果文件、2个PNG示例图以及HTML报告和说明文档压缩包共9.53MB结构清晰便于快速上手。代码整合了CIBERSORT、TIMER、xCell等8种免疫浸润算法和264个基因集签名并支持PCA、z-score、ssGSEA三种打分方式同时提供了单细胞配体-受体活性网络与肿瘤微环境聚类等进阶功能。目前已有206人学习下载。通过运行附带的R脚本用户可以快速复现免疫浸润分析流程学习数据加载、方法调用、热图绘制等关键步骤也可基于源码进行二次扩展尤其适合需要系统掌握IOBR包实际操作的进阶学习者。 去年秋天帮一个朋友复现一组肿瘤转录组数据她的课题需要补一段免疫浸润分析。我打开常用工具清单一看就头皮发麻CIBERSORT要先注册登录服务器等邮件EPIC 是另一个独立 R 包MCPcounter 要单独读文档ESTIMATE 还得去在线页面提交折腾一圈下来同一个表达矩阵被我在五六个平台之间来回搬运输出格式还完全对不上。后来我直接把 IOBR 这个免疫浸润分析 R 包搬出来几分钟跑完主流反卷积方法才算是把问题真正落地。如果你也经常被审稿人要求换一种算法验证浸润结果或者想在同一个环境里横向比较多个算法的输出这篇实操记录应该能帮你省下不少弯路。1. 为什么把十几个算法塞进同一个包是件靠谱的事1.1 免疫浸润分析长期以来的分裂现状肿瘤微环境里的免疫细胞组成一直是生信分析的高频需求。但怎么做免疫浸润分析这件事本身在过去几年里非常分裂每一个经典算法几乎都有自己的生态位CIBERSORT 依赖网站提交和 LM22 签名矩阵EPIC 有自己的一套标准化逻辑MCPcounter 强调绝对丰度ESTIMATE 给的是综合评分而不是具体细胞比例。如果你需要同时报告多种算法的结果这在现在的审稿意见里很常见你就得逐个访问工具、逐个整理输出、再手动匹配样本名。这种做法的最大问题不是慢而是不可复现。不同平台的版本在更新签名矩阵在不同版本里可能被修改你在周一跑出的结果和周三跑出的结果也许就有细微差异。更麻烦的是你很难追溯某个数值到底来自哪一个版本的算法。1.2 IOBR 的定位不是新算法是算法管家IOBR 的全称是 Immuno-Oncology Bioinformatics Resource它不是一个从零发明的反卷积算法而是把目前常用的免疫浸润反卷积方法统一封装进了同一套 R 环境里。CIBERSORT、EPIC、ESTIMATE、MCPcounter、quantiseq、TIMER、xCell 这些方法可以在本地通过同一个函数调用输入同一份表达矩阵返回格式相近的数据框省掉在线提交和跨平台搬运。同时IOBR 还内置了一批肿瘤微环境相关的 signature 集合可以基于 GSVA 或 ssGSEA 给样本做功能性打分。这意味着你可以在同一套代码里完成免疫细胞组成推断和免疫相关通路活性打分两条分析主线输出结果也比较容易 merge 进下游的临床关联分析。对于做肿瘤生信、课题组没有专职生信人员、或者需要频繁出图汇报的研究者来说这个定位非常实用。1.3 适用场景与边界我个人的使用体感是IOBR 适合三类场景第一批次处理多个队列的表达矩阵需要统一流程第二审稿人要求用多种算法交叉验证免疫浸润结论第三从转录组数据快速生成肿瘤微环境画像用于临床特征关联探索。但也要说清楚它的边界。IOBR 的反卷积结果质量根本上取决于输入表达矩阵的质量和算法本身的假设。对于空间转录组、单细胞数据IOBR 并不能直接给出单细胞级别的细胞类型鉴定它面向的主要是 bulk 转录组。另外它内部封装的算法是重实现的逻辑部分算法和原版工具在细节参数上可能略有差异在严谨的临床研究中关键结论最好还是用原版工具再复核一次。2. 安装环境一半人卡住的不是代码是依赖2.1 前置准备R 版本、BiocManager 和 devtoolsIOBR 对 R 版本有要求实测 R 4.0 以下大概率装不上建议直接用 4.1 以上的版本。先确认一下当前环境R.version.string # [1] R version 4.3.2 (2023-10-31)接下来安装依赖包。IOBR 依赖一批 Bioconductor 包其中比较关键的是 limma、GSVA、clusterProfiler、ComplexHeatmap、org.Hs.eg.db。建议先把这些装好再装 IOBR 本体if (!requireNamespace(BiocManager, quietly TRUE)) install.packages(BiocManager) BiocManager::install(c(limma, GSVA, clusterProfiler, ComplexHeatmap, org.Hs.eg.db))如果你身处国内网络环境包下载超时是家常便饭。可以在安装前先设置镜像和较长的超时时间options(timeout 300) options(BioC_mirror https://mirrors.tuna.tsinghua.edu.cn/bioconductor) options(repos c(CRAN https://mirrors.tuna.tsinghua.edu.cn/CRAN/))然后从 GitHub 安装 IOBRif (!requireNamespace(devtools, quietly TRUE)) install.packages(devtools) devtools::install_github(IOBR/IOBR, dependencies TRUE)2.2 三个最常见的翻车点第一个翻车点是 ComplexHeatmap 装不上。这个包依赖较多如果 R 版本太老很可能编译失败。解决办法是先把 R 升级到 4.1 以上再从 Bioconductor 单独安装不要用 install.packages 硬装。第二个翻车点是编译工具链缺失。在 Windows 上如果 Rtools 没有安装好install_github 时编译源码会直接报错在 Linux 服务器上可能缺少 libcurl 或 libxml2 等系统库。这类报错通常出现在installation of package had non-zero exit status之后解决思路是先看系统依赖而不是反复重装同一个包。第三个翻车点是网络拉取 GitHub 源码失败。IOBR 本体也是从 GitHub 安装的网络波动时可能报错 unable to access repository。可以先设置options(timeout 600)再重试。如果反复失败手动下载源码 zip 到本地后devtools::install_local()也是可行方案。2.3 验证安装成功的正确姿势装完先别急着跑自己的数据用包内置数据验证环境是否完整library(IOBR) data(TIL10, package IOBR) names(TIL10) # 输出通常包含 cibersort、epic、estimate、mcpcounter、quantiseq、timer、xcell 等结果如果TIL10能顺利载入并且names()能看到多个算法名说明主体功能基本可用。再顺手确认一下?deconvo_tme能弹出帮助页就可以进入正式分析了。3. 从表达矩阵到浸润结果主流程代码拆解3.1 准备好输入数据格式和基因命名IOBR 的输入表达矩阵行名是基因列名是样本本质上就是常规的 bulk 表达矩阵。我自己习惯直接从 RDS 或 TXT 读入expr - read.table(expression_matrix.txt, header TRUE, row.names 1, check.names FALSE)这里check.names FALSE很重要。如果不关掉样本名里有杠号或数字开头时会被 R 自动改成不伦不类的合法变量名后面跟临床数据 merge 时容易对不上。另外IOBR 里的多数算法依赖基因 SYMBOL。如果你手里是 ENSEMBL ID需要先转换。我常用 clusterProfiler 的bitr()library(clusterProfiler) library(org.Hs.eg.db) trans - bitr(rownames(expr), fromType ENSEMBL, toType SYMBOL, OrgDb org.Hs.eg.db) expr - expr[trans$ENSEMBL, ] rownames(expr) - trans$SYMBOL # 去掉转换后可能出现的重复基因名 expr - expr[!duplicated(rownames(expr)), ]转换完之后建议顺手过滤掉低表达基因。大量全零行会让部分算法报错或者产生明显偏离的比值keep - rowMeans(expr) 0.1 expr - expr[keep, ]3.2 deconvo_tme一条命令跑一个算法IOBR 的核心反卷积函数是deconvo_tme()。它的基本逻辑是传入表达矩阵指定一个 method返回一个样本为行、细胞类型为列的数据框。cib - deconvo_tme(eset expr, method cibersort, perm 100)perm是置换检验次数。CIBERSORT 默认推荐 1000 次但我在探索性分析中实测 100 次的结果方向和显著性基本一致时间却省了很多。正式发文时再用 1000 次跑最终版本属于比较务实的用法。如果需要同时跑多个算法我习惯分开调用再合并cib - deconvo_tme(eset expr, method cibersort) epic - deconvo_tme(eset expr, method epic) mcest - deconvo_tme(eset expr, method estimate) mcp - deconvo_tme(eset expr, method mcpcounter) tme_res - cbind(cib, epic, mcest, mcp)合并之后要做一件事检查列名是否有重复然后用make.unique()处理colnames(tme_res) - make.unique(colnames(tme_res))3.3 signature_score给微环境做功能性打分除了细胞比例IOBR 还提供 signature 打分能力。包内置了signature_collection包含多套文献里常用到的基因集包括免疫评分、T 细胞毒性、趋化因子相关等。计算方式我一般选 ssGSEA因为它对样本量要求不算苛刻跑起来也快data(signature_collection, package IOBR) sig_score - calculate_sig_score( eset expr, signature signature_collection, method ssgsea )这里有个版本细节早期版本这个函数叫signature_score()后来更新为calculate_sig_score()。如果你装的是旧版本函数名对不上不要慌用ls(package:IOBR)搜一下当前版本里的实际命名即可。这种函数名随版本迭代变化的情况在活跃维护的包里并不罕见严格来说也不算 bug。4. 结果可视化和临床关联不是出图就完事4.1 先把浸润结果和临床信息对齐跑完反卷积拿到的是纯免疫浸润结果下一步几乎一定是跟临床特征关联。这一步最怕样本顺序错位。推荐做法不是直接cbind而是用样本 ID 显式匹配clin - read.csv(clinical.csv, stringsAsFactors FALSE) clin$CD8T_cib - cib$Cibersort_CD8_T cells[match(clin$ID, rownames(cib))]这里用match()而不是直接按行合并。因为你无法保证临床表里的样本排列顺序和表达矩阵完全一致一旦某个样本被删除过顺序就会错位而这种错位极其隐蔽。4.2 相关性热图与分组对比免疫细胞之间的相关性是展示肿瘤微环境格局的一个常用视角。如果你的数据量不大直接用 IOBR 自带的plot_heatmap()就可以plot_heatmap( eset tme_res, group clin$subtype, show_rownames FALSE )注意IOBR 绘图函数的参数名在不同版本间调整过看到报错先执行?plot_heatmap确认当前版本的参数规范。这不算绕路是熟练使用活跃维护的 R 包的基本习惯。如果只是看某个细胞亚群在不同临床分组间的差异箱线图更直观。可以用plot_boxplot()或自己用 ggplot 画两者都是常规操作。我这里不多展开。4.3 生存分析森林图审稿人特别喜欢看某群免疫细胞比例和预后相关的森林图。做法通常是对每个浸润指标按中位数分成高、低两组跑 Cox 回归得到 HR 和 p 值然后把所有指标的结果画在一张森林图上。IOBR 内置了plot_forest()这类绘图函数但它不是帮你算 Cox 的需要自己先把统计结果算好。我一般先把结果整理成数据框再用plot_forest()或者forestplot包绘制。关键在于这一步的逻辑是多指标批量关联预后所以循环里别忘记把连续型变量标准化或者统一按中位数分组否则不同指标的 HR 没有可比性。5. 实操中那些文档里不写的坑5.1 不同算法的丰度度量根本不是一回事IOBR 把算法封装在了一起但它没有消除算法之间的本质差异。比如 CIBERSORT 输出的是相对比例所有细胞类型的占比加起来接近 100而 EPIC 和 MCPcounter 给的是绝对丰度分数ESTIMATE 给的是综合评分。三者放在同一张热图里做颜色映射时如果不做 scale结果图会非常难看而且毫无比较意义。我在一个 200 例的队列里同时跑过 CIBERSORT 和 MCPcounterCD8 T 细胞的两类分数虽然趋势一致但数值范围完全不同。这个差异不是 bug是算法自身定义不同。做相关性分析时建议先对每个指标的列做scale()标准化或者分别展示不要混在一起解读数值大小。5.2 基质细胞分数和免疫细胞分数别混淆ESTIMATE 输出的 ImmuneScore 和 StromalScore 是肿瘤微环境里免疫成分和基质成分的综合评分不是某种具体免疫细胞的比例。有些新手会把 ImmuneScore 当成总免疫细胞量直接跟 CIBERSORT 的各类细胞比例加和去比较这种比较在数学上不成立。更严谨的做法是ESTIMATE 的结果用来描述微环境整体状态CIBERSORT/EPIC 的结果用来回答具体细胞亚群的问题。我自己的经验是做泛癌公共数据探索时先看 ESTIMATE 的整体画像再用具体细胞亚群做差异和生存分析两条线各有分工不要试图合并成一个指标。5.3 反卷积结果在解读上要保持克制反卷积本质上是一种基于基因表达特征的推断不是流式细胞术那样的直接测量。在小样本或信号较弱的队列里细胞比例 1% 上下的波动可能只是噪声。我曾经见过有人对某个免疫细胞 0.3% 的 p 值差异做出一大段生物学解释这在统计上非常危险。更稳的姿势是先看多种算法是否方向一致再看差异是否大到有实际意义最后才结合通路打分解释机制。5.4 正式分析记得写清楚引用用 IOBR 发论文methods 部分不能只写使用 IOBR 进行分析需要引用它的原始论文。在 R 里执行citation(IOBR)会输出标准的 BibTeX 条目。同时如果你用了 CIBERSORT、ESTIMATE 等底层算法这些算法的原始文献也要一并引用。审稿人对工具引用查得很细这里漏一个都可能被要求补。我第一次在 TCGA 的几百个样本上跑完整套流程时用的还是默认 1000 次置换吃饭回来发现还在跑。后来把perm降到 100方向、显著性基本没变时间省了一大半。如果你也是拿 IOBR 做前期探索建议先用TIL10内置数据把流程完整走通一遍再上自己的表达矩阵——这个热身步骤能把大多数报错和困惑拦在正式分析之前值得多花这十分钟。本文还有配套的精品资源点击获取
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻