一个R包完成单细胞基因集富集分析 (全代码)

singleseqgset是用于单细胞RNA-seq数据的基因集富集分析的软件包。它使用简单的基础统计量(variance inflated Wilcoxon秩和检验)来确定不同cluster中感兴趣的基因集的富集。

Installation

library(devtools)
install_github("arc85/singleseqgset")
library(singleseqgset)

Introduction

基因集富集分析是一种无处不在的工具,用于从基因组数据集中提取具有生物学意义的信息。有许多不同类型的工具可用于基因集富集分析,以前的基因组富集分析工具的关键概念是比较组内基因与组外基因的差异(例如,各组之间基因表达的log fold change变化)。但最值得肯定的是Subramanian等人(PNAS 2005)(https://www.ncbi.nlm.nih.gov/pubmed/16199517)的开创性工作-Gene Set Enrichment Analysis(GSEA富集分析 - 界面操作)。

GSEA分析中已知功能的基因集可以从许多地方进行获取,包括Broad的Molecular Signatures Database(MSigDB)The Gene Ontology Resource,关键是选择最能回答当前生物学问题的基因集。举个栗子,通常您不会使用Broad的C7(免疫学基因集)中的基因集来回答有关神经元发育的问题(除非有充分的理由!)。

singleseqgset研究者在这里开发的基因集富集方法灵感来自Di WuGordon K SmythNucleic Acids Research 2012(https://www.ncbi.nlm.nih.gov/pubmed/16199517)上的工作,而WuSmyth在这个工作的基础上又开发了相关调整的MEan RAnk基因集测试(CAMERA)

CAMERA是一项竞争性基因集富集测试,可控制基因集内的基因间相关性。研究团队之所以选择使用CAMERA,是因为它不依赖于基因独立性的假设(因为我们知道基因通常具有结构化的共表达模式),也不依赖于基因标记的排列或测试样品的重采样。CAMERA通过基于基因间相关程度生成方差膨胀因子来控制基因间相关性,并将这种方差膨胀纳入Wilcoxon秩和检验中

此workflow演示了对模拟数据使用singleseqgset的标准用法。我们将执行以下步骤:

  1. 使用splatter R包模拟表达式数据;

  2. 使用msigdbr下载感兴趣的基因集;

  3. 将特定基因集添加到我们的模拟数据中(就是让我们的模拟数据可以富含某基因集);

  4. 使用标准的Seurat工作流程(v.2.3.4)处理我们的数据;

  5. 使用singleseqgset进行基因集富集分析;

  6. 将结果绘制在热图中;

Simulate data using splatter

首先,加载所有必要的程序包,并使用splatter模拟数据。

suppressMessages({
library(splatter)
library(Seurat)
library(msigdbr)
library(singleseqgset)
library(heatmap3)
})
#Splatter是用于模拟单细胞RNA测序count数据的软件包。
#创建参数并模拟数据
sc.params <- newSplatParams(nGenes=1000,batchCells=5000)
sim.groups <- splatSimulate(params=sc.params,method="groups",group.prob=c(0.4,0.2,0.3,0.1),de.prob=c(0.20,0.20,0.1,0.3),verbose=F)
sim.groups #Check out the SingleCellExperiment object with simulated dataset
## class: SingleCellExperiment
## dim: 1000 5000
## metadata(1): Params
## assays(6): BatchCellMeans BaseCellMeans ... TrueCounts counts
## rownames(1000): Gene1 Gene2 ... Gene999 Gene1000
## rowData names(8): Gene BaseGeneMean ... DEFacGroup3 DEFacGroup4
## colnames(5000): Cell1 Cell2 ... Cell4999 Cell5000
## colData names(4): Cell Batch Group ExpLibSize
## reducedDimNames(0):
## spikeNames(0):
colData(sim.groups) #The colData column "Group" contains the groups of simulated cells
## DataFrame with 5000 rows and 4 columns
##              Cell       Batch    Group       ExpLibSize
##          <factor> <character> <factor>        <numeric>
## Cell1       Cell1      Batch1   Group1 73324.2901799195
## Cell2       Cell2      Batch1   Group1 71115.1438815874
## Cell3       Cell3      Batch1   Group3  89689.371004738
## Cell4       Cell4      Batch1   Group3  44896.460028516
## Cell5       Cell5      Batch1   Group3 53956.0668720417
## ...           ...         ...      ...              ...
## Cell4996 Cell4996      Batch1   Group2 79041.7558615305
## Cell4997 Cell4997      Batch1   Group4 66684.3797711752
## Cell4998 Cell4998      Batch1   Group3 70407.9613848431
## Cell4999 Cell4999      Batch1   Group3 64645.3257427214
## Cell5000 Cell5000      Batch1   Group3 62266.9119469426
#我们将从sim.groups对象中提取模拟的计数和组别
sim.counts <- assays(sim.groups)$counts
groups <- colData(sim.groups)$Group
names(groups) <- rownames(colData(sim.groups))
table(groups)
## groups
## Group1 Group2 Group3 Group4
##   1977    992   1536    495

有次我们创建了一些模拟数据,这些数据由4个cluster组成,cluster中不同基因的表达比例不同。

Download gene sets of interest using msigdbr

在这里,我们将使用misigdbr软件包下载Hallmark Gene Sets。另外,我们可以直接从Broad网站(http://software.broadinstitute.org/gsea/msigdb/index.jsp)下载基因集,然后使用`GSEABase`软件包将其读入R。

注意:必须为您的项目选择适当的基因注释样式(gene symbols或entrez gene ID;在这里我们只是gene symbols)和物种(在这里我们使用human)。否则,您的基因组中的基因名称将与您的数据中的基因名称不匹配,并且所有基因组都将获得“0”富集得分。

h.human <- msigdbr(species="Homo sapiens",category="H")

h.names <- unique(h.human$gs_name)

h.sets <- vector("list",length=length(h.names))
names(h.sets) <- h.names

for (i in names(h.sets)) {
    h.sets[[i]] <- pull(h.human[h.human$gs_name==i,"gene_symbol"])
}

Add gene sets to simulated clusters

我们将分配5个基因集在每个cluster中专门表达(如果不进行分配,则可能出现无功能集在cluster中富集的情况。)。随机选择这20个集合,并从zero-inflatedPoisson分布中抽取每个基因,成功概率等于50%,λ值为10,这将模拟中等dropout和相对较低的基因表达量。

sets.to.use <- sample(seq(1,50,1),20,replace=F)
sets.and.groups <- data.frame(set=sets.to.use,group=paste("Group",rep(1:4,each=5),sep=""))

for (i in 1:nrow(sets.and.groups)) {

  set.to.use <- sets.and.groups[i,"set"]
  group.to.use <- sets.and.groups[i,"group"]
  gene.set.length <- length(h.sets[[set.to.use]])
  blank.matrix <- matrix(0,ncol=ncol(sim.counts),nrow=gene.set.length)
  rownames(blank.matrix) <- h.sets[[sets.to.use[i]]]
  matching <- rownames(blank.matrix) %in% rownames(sim.counts)

  if (any(matching==TRUE)) {

    matching.genes <- rownames(blank.matrix)[matching]
    nonmatching.genes <- setdiff(rownames(blank.matrix),matching.genes)
    blank.matrix <- blank.matrix[!matching,]
    sim.counts <- rbind(sim.counts,blank.matrix)

  } else {

    sim.counts <- rbind(sim.counts,blank.matrix)
    matching.genes <- rownames(blank.matrix)

  }

  group.cells <- colnames(sim.counts)[groups==group.to.use]

  for (z in group.cells) {

    if (any(matching==TRUE)) {

      sim.counts[matching.genes,z] <- ifelse(rbinom(length(matching.genes),size=1,prob=0.5)>0,0,rpois(length(matching.genes),lambda=10))
      sim.counts[nonmatching.genes,z] <- ifelse(rbinom(length(nonmatching.genes),size=1,prob=0.5)>0,0,rpois(length(nonmatching.genes),lambda=10))

    } else {

    sim.counts[matching.genes,z] <- ifelse(rbinom(length(matching.genes),size=1,prob=0.5)>0,0,rpois(length(matching.genes),lambda=10))

    }
  }

}

#Here, we will check out the sum of expression for the first gene set
len.set1 <- length(h.sets[[sets.to.use[[1]]]])
plot(apply(sim.counts[1001:(1000+len.set1),],2,sum),xlim=c(0,5000),xlab="Cells",ylab="Sum of Gene Set 1 Expression")

图片

我们已经成功地修改了模拟计数矩阵,使其包含特定cluster中感兴趣的基因集。例如,我们知道Group1细胞应显示出以下基因的富集:

HALLMARK_APICAL_SURFACEHALLMARK_COMPLEMENTHALLMARK_DNA_REPAIRHALLMARK_IL2_STAT5_SIGNALINGHALLMARK_UNFOLDED_PROTEIN_RESPONSE

Seurat workflow on simulated data

#构建seurat object
ser <- CreateSeuratObject(raw.data=sim.counts)

#归一化
ser <- NormalizeData(ser)
ser@var.genes <- rownames(ser@raw.data)[1:1000]
ser <- ScaleData(ser,genes.use=ser@var.genes)
## Scaling data matrix
#我们会假设1000个模拟基因是“可变基因”,
#我们将跳过Seurat的FindVariableGenes
ser <- RunPCA(ser,pc.genes=ser@var.genes,do.print=FALSE)

PCElbowPlot(ser)

图片

#其中top4PCs代表了多数的差异
#我们将会选择top5 PCs;

ser <- RunTSNE(ser,dims.use=1:5)

#将模拟的dataID号加入Seurat object
data.to.add <- colData(sim.groups)$Group
names(data.to.add) <- ser@cell.names
ser <- AddMetaData(ser,metadata=data.to.add,col.name="real_id")
ser <- SetAllIdent(ser,id="real_id")

#我们将会跳过使用Seurat聚类的步骤,因为我们已知道真正的聚类IDs

TSNEPlot(ser,group.by="real_id")

图片

Use singleseqgset to perform gene set enrichment analysis

首先,我们将基于logFC计算基因集富集测试的矩阵。我们选择使用已针对library大小进行校正的log-normalized数据,并存储在Seurat的“@data”slot中。

logfc.data <- logFC(cluster.ids=ser@meta.data$real_id,expr.mat=ser@data)
names(logfc.data)
## [1] "cluster.cells"  "log.fc.cluster"

logFC函数返回一个长度为2的列表,其中包含每个cluster中的细胞以及cluster之间基因的对数倍变化。下一步需要此数据计算enrichment scoresp值。

gse.res <- wmw_gsea(expr.mat=ser@data,cluster.cells=logfc.data[[1]],log.fc.cluster=logfc.data[[2]],gene.sets=h.sets)
## [1] "Removed 1 rows with all z-scores equal to zero."
names(gse.res)
## [1] "GSEA_statistics" "GSEA_p_values"

此函数返回两个列表,第一个包含测试统计信息“GSEA_statistics”,第二个包含p值“GSEA_p_values”。我们可以将这些结果绘制为热图,以可视化差异调节基因集。

res.stats <- gse.res[["GSEA_statistics"]]
res.pvals <- gse.res[["GSEA_p_values"]]

res.pvals <- apply(res.pvals,2,p.adjust,method="fdr") #Correct for multiple comparisons

res.stats[order(res.stats[,1],decreasing=TRUE)[1:10],] #Top gene sets enriched by z scores
##                                         Group1      Group2    Group3
## HALLMARK_IL2_STAT5_SIGNALING       10.51698615 -7.55892580 -8.113191
## HALLMARK_DNA_REPAIR                10.47159479 -7.62264059 -7.326454
## HALLMARK_COMPLEMENT                10.17982979 -3.68698969 -8.347697
## HALLMARK_UNFOLDED_PROTEIN_RESPONSE  9.54278550 -8.98321228 -7.275756
## HALLMARK_APICAL_SURFACE             7.63384635 -5.70116613  0.000000
## HALLMARK_ANGIOGENESIS               1.32886963 -0.91447563  0.000000
## HALLMARK_HEDGEHOG_SIGNALING         0.77628519  0.66226233  0.000000
## HALLMARK_KRAS_SIGNALING_UP          0.59844933 -0.20261236 -2.365948
## HALLMARK_COAGULATION                0.57787404  9.03118414 -6.988972
## HALLMARK_INFLAMMATORY_RESPONSE      0.05206778 -0.08661822 -1.260939
##                                         Group4
## HALLMARK_IL2_STAT5_SIGNALING        -8.4400626
## HALLMARK_DNA_REPAIR                -10.3905166
## HALLMARK_COMPLEMENT                -12.5780500
## HALLMARK_UNFOLDED_PROTEIN_RESPONSE  -5.8693210
## HALLMARK_APICAL_SURFACE              0.0000000
## HALLMARK_ANGIOGENESIS               -0.6935659
## HALLMARK_HEDGEHOG_SIGNALING          0.3350711
## HALLMARK_KRAS_SIGNALING_UP          -1.1822606
## HALLMARK_COAGULATION                -4.3269207
## HALLMARK_INFLAMMATORY_RESPONSE      -3.3347607
res.pvals[order(res.stats[,1],decreasing=TRUE)[1:10],] #Top gene sets by p values
##                                          Group1       Group2       Group3
## HALLMARK_IL2_STAT5_SIGNALING       2.858190e-24 2.489271e-13 3.451510e-15
## HALLMARK_DNA_REPAIR                2.858190e-24 1.739767e-13 1.286641e-12
## HALLMARK_COMPLEMENT                3.985134e-23 6.949503e-04 6.821492e-16
## HALLMARK_UNFOLDED_PROTEIN_RESPONSE 1.362655e-20 2.577150e-18 1.687982e-12
## HALLMARK_APICAL_SURFACE            1.594960e-13 5.830539e-08 1.000000e+00
## HALLMARK_ANGIOGENESIS              3.003553e-01 5.697704e-01 1.000000e+00
## HALLMARK_HEDGEHOG_SIGNALING        5.642487e-01 7.318339e-01 1.000000e+00
## HALLMARK_KRAS_SIGNALING_UP         6.589077e-01 1.000000e+00 4.406075e-02
## HALLMARK_COAGULATION               6.589077e-01 2.080345e-18 1.130707e-11
## HALLMARK_INFLAMMATORY_RESPONSE     1.000000e+00 1.000000e+00 3.631134e-01
##                                          Group4
## HALLMARK_IL2_STAT5_SIGNALING       1.942653e-16
## HALLMARK_DNA_REPAIR                6.709712e-24
## HALLMARK_COMPLEMENT                1.366256e-34
## HALLMARK_UNFOLDED_PROTEIN_RESPONSE 2.144160e-08
## HALLMARK_APICAL_SURFACE            1.000000e+00
## HALLMARK_ANGIOGENESIS              6.462100e-01
## HALLMARK_HEDGEHOG_SIGNALING        7.856739e-01
## HALLMARK_KRAS_SIGNALING_UP         3.417063e-01
## HALLMARK_COAGULATION               4.939474e-05
## HALLMARK_INFLAMMATORY_RESPONSE     2.460747e-03
names(h.sets)[sets.to.use[1:5]] #Compare to the simulate sets we created
## [1] "HALLMARK_APICAL_SURFACE"
## [2] "HALLMARK_COMPLEMENT"
## [3] "HALLMARK_DNA_REPAIR"
## [4] "HALLMARK_IL2_STAT5_SIGNALING"
## [5] "HALLMARK_UNFOLDED_PROTEIN_RESPONSE"
#Plot the z scores with heatmap3
heatmap3(res.stats,Colv=NA,cexRow=0.5,cexCol=1,scale="row")

图片

恭喜,您已经使用singleseqgset执行了第一个基因集富集分析!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/771532.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【JavaEE】多线程代码案例(2)

&#x1f38f;&#x1f38f;&#x1f38f;个人主页&#x1f38f;&#x1f38f;&#x1f38f; &#x1f38f;&#x1f38f;&#x1f38f;JavaEE专栏&#x1f38f;&#x1f38f;&#x1f38f; &#x1f38f;&#x1f38f;&#x1f38f;上一篇文章&#xff1a;多线程代码案例(1)&a…

花键参数确定的流程是怎么样的?

继续花键的话题&#xff0c;今天跟小伙伴们一同学习一下&#xff1a;渐开线花键的参数确定的一般流程及基本方法。 前面有好几篇介绍了花键的基本参数的概念&#xff0c;包括规格、模数、齿数、压力角等等。以及花键的定心方式&#xff0c;内外花键的配合方式。那么这些参数的…

基于docker轻松部署selenium grid环境

做web自动化的同学都知道selenium grid非常好用&#xff0c;但是环境配置特别麻烦&#xff0c;很多人都躺在了环境搭建。那么有没有更简单的方式呢&#xff0c;答案是肯定的&#xff0c;今天我们就用docker来完成它&#xff0c;希望对大家有帮助。 一、环境准备 准备一台 Linu…

6个步骤实现Postman接口压力测试(建议收藏)

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 这里讲是postman做接口并发测试&#xff0c;基础用法不做赘述 1、第一步接口可以通的情况下点击…

Web应用防火墙用在哪些场景?

WAF是Web Application Firewall的缩写&#xff0c;翻译为“Web应用防火墙”是一种网络安全设备或服务&#xff0c;用于保护Web应用程序免受各种网络攻击和漏洞的影响。 WAF特别设计用于识别和阻止特定于Web应用程序的攻击&#xff0c;例如SQL注入、跨站脚本(XSS)、跨站请求伪造…

2024最新中级会计职称考试全科题库资料。

1.根据消费税法律制度的规定&#xff0c;下列各项中&#xff0c;属于消费税征税范围的是&#xff08;&#xff09;。 A.汽车轮胎 B.食用酒精 C.铂金首饰 D.体育上用的发令纸 答案&#xff1a;C 解析&#xff1a;选项ABD均不属于消费税的征税范围。 2.甲企业&#xff08;…

PDF内存如何变小,PDF内存压缩,PDF内存变小怎么调整

在数字化时代&#xff0c;pdf已成为工作、学习和生活中不可或缺的文件格式。它以其跨平台兼容性和安全性受到广大用户的喜爱。然而&#xff0c;随着pdf文件中嵌入的图片、图形和文本内容的增多&#xff0c;文件大小往往会变得相当可观&#xff0c;给文件的传输和存储带来一定的…

2024亚太杯中文赛B题全保姆教程

B题 洪水灾害的数据分析与预测 问题 1. 请分析附件 train.csv 中的数据&#xff0c;分析并可视化上述 20 个指标中&#xff0c;哪 些指标与洪水的发生有着密切的关联&#xff1f;哪些指标与洪水发生的相关性不大&#xff1f;并 分析可能的原因&#xff0c;然后针对洪水的提前预…

Jenkins 下使用 Node 和 Npm(借助 nvm-wrapper 插件)构建前端程序

一、前言 搭建完Jenkins后&#xff0c;如何使用node进行构建前端呢&#xff0c;多个项目会使用的node的多个版本。如何动态指定node的版本进行构建呢。 方案一&#xff1a; 安装多个node版本&#xff0c;然后进行指定。这样比较麻烦。 方案二&#xff1a; 使用Jenkins的nv…

JavaSE (Java基础):面向对象(下)

8.7 多态 什么是多态&#xff1f; 即同一方法可以根据发送对象的不同而采用多种不同的方式。 一个对象的实际类型是确定的&#xff0c;但可以指向对象的引用的类型有很多。在句话我是这样理解的&#xff1a; 在实例中使用方法都是根据他最开始将类实例化最左边的类型来定的&…

基于docker环境及Harbor部署{很简短一点了,耐心看吧}

用到的环境&#xff1a; docker 、nacos、compose、harbor&#xff08;自行安装 ,以下连接作为参考&#xff09; nacos&#xff1a;史上最全整合nacos单机模式整合哈哈哈哈哈_nacos 源码启动 单机模式-CSDN博客 docker、compose、harbor:史上最全的整合Harbor安装教程&#…

Qt实现检测软件是否多开

Qt实现检测软件是否多开 在桌面软件开发中&#xff0c;软件通常要设置只允许存在一个进程&#xff0c;像一些熟知的音乐软件&#xff0c;QQ音乐这种。而这些软件在限制只有一个进程的同时&#xff0c;通常还会有双击桌面图标唤醒已运行的后台进程的功能。关于双击桌面唤醒已运…

斯坦福提出首个开源视觉语言动作大模型OpenVLA

OpenVLA&#xff1a;开源视觉语言动作大模型 摘要模型结构训练数据训练设施实验总结和局限性 项目主页 代码链接 论文链接 模型链接 摘要 现有的VLA(Vision-Language-Action )模型具有这些局限性&#xff1a; 1)大多封闭且开放&#xff1b; 2)未能探索高效地为新任务微调VLA的方…

vue3 【提效】使用 CSS 框架 UnoCSS 实用教程

该换种更高效的方式写 CSS 啦&#xff0c;举个例&#xff1a; <div class"flex"> </div>相当于 <div class"flex"> </div> <style> .flex {display: flex; } </style>当然&#xff0c;还有超多强大的功能帮我们提升…

【后端面试题】【中间件】【NoSQL】MongoDB查询过程、ESR规则、覆盖索引的优化

任何中间件的面试说到底都是以高可用、高性能和高并发为主&#xff0c;而高性能和高并发基本是同时存在的。 性能优化一直被看作一个高级面试点&#xff0c;因为只有对原理了解得很透彻的人&#xff0c;在实践中才能找准性能优化的关键点&#xff0c;从而通过各种优化手段解决性…

为什么人员定位系统很有必要性?

人员定位系统在现代社会和企业环境中具有极高的必要性&#xff0c;这主要体现在以下几个方面&#xff1a; 一、安全保障 二、提升效率 三、管理优化 四、增强合规性 综上所述&#xff0c;人员定位系统通过提供实时、准确的位置信息&#xff0c;为企业带来了安全保障、效率提升…

香橙派AIpro实测:YOLOv8便捷检测,算法速度与运行速度结合

香橙派AIpro实测&#xff1a;YOLOv8便捷检测&#xff0c;算法速度与运行速度结合 文章目录 香橙派AIpro实测&#xff1a;YOLOv8便捷检测&#xff0c;算法速度与运行速度结合一、引言二、香橙派AIpro简介三、YOLOv8检测效果3.1 目标检测算法介绍3.1.1 YOLO家族3.1.2 YOLOv8算法理…

500mA、低压差、低噪声、超快、无需旁路电容的CMOS LDO稳压器RT9013

一般描述 RT9013 SOT23-5封装的外观和丝印 RT9013 是一款高性能的 500mA LDO 稳压器&#xff0c;具有极高的 PSRR 和超低压差。非常适合具有苛刻性能和空间要求的便携式射频和无线应用。 RT9013的静态电流低至25μA&#xff0c;进一步延长了电池的使用寿命。RT9013 也适用于低…

Element中的日期时间选择器DateTimePicker和级联选择器Cascader

简述&#xff1a;在Element UI框架中&#xff0c;Cascader&#xff08;级联选择器&#xff09;和DateTimePicker&#xff08;日期时间选择器&#xff09;是两个非常实用且常用的组件&#xff0c;它们分别用于日期选择和多层级选择&#xff0c;提供了丰富的交互体验和便捷的数据…

私域和社群的差别是什么?

社群就是拉很多人建群就可以了&#xff0c;但是私域不是&#xff0c;这里有三点不同 1、私域的用户来源&#xff0c;不仅仅是微信&#xff0c;而是基于一定的联系形成的链接&#xff0c;比如买了商家的货&#xff0c;反复购买觉得好&#xff0c;推荐给亲朋好友的二次开发用户&…