内容


1简介

截然不同的是一种在两组或多组分布之间进行差异检验的统计方法;差分测试是通过对每个样本的累积分布函数(cdfs)进行分层非参数排列测试。虽然大多数差分表达方法的目标是条件之间的平均丰度差异,截然不同的,通过比较完整的cdfs,识别了涉及均值变化的差异模式,以及不涉及均值的更微妙的变化(例如,具有相同均值的单峰分布和双峰分布)。截然不同的是一种通用且灵活的工具:由于其完全非参数性质,即不假设数据是如何生成的,因此它可以应用于各种数据集。它特别适合于对单细胞数据进行差异状态分析(例如,细胞亚群内的差异分析),如单细胞RNA测序(scRNA-seq)和高维流式或大规模细胞术(HDCyto)数据。

目前,协变量是不允许的,只实现2组比较。在以后的版本中,我们将允许协变量和两个以上组之间的差异测试。

预印本将在未来几个月内发布。

要访问小插图中使用的R代码,输入:

browseVignettes(“的”)

有关的问题截然不同的是否应作为新问题在BugReports

引用截然不同的类型:

引用(“的”)

1.1Bioconductor安装

截然不同的可于Bioconductor并可以安装命令:

如果(!requireNamespace("BiocManager", quiet =TRUE)) install.packages("BiocManager")::install("distinct")

2微分状态分析

差异状态分析旨在研究细胞亚群条件之间的差异模式。使用截然不同的需要来自两组或两组以上样本(即实验条件)的数据,每组至少2个样本(即生物重复)。给定一个单细胞rna测序(scRNA-seq)或高维流式或大规模细胞术(HDCyto)数据集,首先需要通过某种形式的聚类算法将细胞聚在一起;截然不同的然后应用于识别组之间的差异模式,在每个细胞集群内。

2.1输入数据

加载示例数据集,包括6个样本的子集(在2种条件下观察到3个个体)和从Kang18_8vs8 ()对象的muscData包中。

library(singlecel实验)data(" kang_子集",package = "distinct") kang_子集
##类:singlecel实验## dim: 100 9517 ##元数据(1):experiment_info ## assays(2): logcounts cpmrownames (100): ISG15 SYF2…MX2 PDXK ## rowData names(0): ## colnames: NULL ## colData names(3): stim cell sample_id ## reducedDimNames(0): ## mainExpName: NULL ## altExpNames(0):

印第安纳州而且机枪兵colData列示每个单元的个体id和实验状态(控制或被刺激)sample_id显示差分分析所需的样本id。列细胞表示单元格类型,该类型定义单元格的聚类结构:对每个单元格集群分别执行条件之间的差异测试。注意,如果细胞聚类标签未知,我们需要通过一些聚类算法将细胞聚成组。

colData (Kang_subset)
##数据框架与9517行和3列## stim细胞sample_id ## <因子> <因子> <因子> ## 1 ctrl CD4 T细胞ctrl_107 ## 2 ctrl CD14+单核细胞ctrl_1015 ## 3 ctrl NK细胞ctrl_1015 ## 4 ctrl CD4 T细胞ctrl_107 ## 5 ctrl CD14+单核细胞ctrl_1015 ## ... ... ... ...stim CD14+单核细胞stim CD4 T细胞stim CD14+单核细胞stim CD14+单核细胞stim CD4 T细胞stim

实验设计比较两组(stim vs ctrl),每组3个生物重复。

Kang_subset@metadata experiment_info美元
sample_id stim ## 1 ctrl_107 CTRL ## 2 ctrl_1015 CTRL ## 3 ctrl_101 CTRL ## 4 stim_101 stim ## 5 stim_1015 stim ## 6 stim_107 stim

2.2细胞亚群内的差异分析

负载截然不同的

库(不同的)

创建书房的设计:

samples = Kang_subset@metadata$experiment_info$sample_id group = Kang_subset@metadata$experiment_info$stim design = model.matrix(~group) #设计的rownames必须指明样本id: rownames(design) = samples design
##(拦截)groupstim ## ctrl_107 10 ## ctrl_1015 10 ## ctrl_101 10 ## stim_101 1 1 ## stim_1015 1 1 ## stim_107 1 1 ## attr(,“分配”)## [1]01 ## attr(,“对比”)## attr(,“对比”)$group ##[1]“对照。治疗”

执行不同条件之间的差异状态测试。参数name_assays_expression中的输入数据(日志计数)化验(x),而name_cluster而且name_sample的列名colData (x)包含单元格的聚类(cell)和单个样本的id (sample_id)。我们想要测试的组位于设计的第二列中,因此我们将指定:column_to_test = 2。

中的示例名称colData name_sample美元(x)必须和里面的一样吗rownames(设计)(尽管顺序不一定相同)。

rownames(设计)
##[1]“ctrl_107”“ctrl_1015”“ctrl_101”“stim_101”“stim_1015”“stim_107”
独特的(colData (Kang_subset) sample_id美元)
## [1] ctrl_107 ctrl_1015 ctrl_101 stim_101 stim_1015 stim_107

为了对最重要的基因获得更好的排名,如果计算资源可用,我们鼓励用户增加P_4(即,当原始p值< 0.001时的排列数),并设置P_4 = 20000(在默认情况下P_4 = 10,000).

我们强烈建议使用标准化数据,例如每百万计数(CPM)或log2-CPM(例如:logcounts通过嘘:logNormCounts).

set.seed(61217) res = distinct_test(x = kang_子集,name_assays_expression = "logcounts", name_cluster = "cell", name_sample = "sample_id", design = design, column_to_test = 2, min_non_zero_cells = 20, n_cores = 2)
2组样本提供
##数据加载,开始差异测试
差动测试完成,返回结果

2.2.1处理协变量和批处理效果

协变量(如批量效应),如果存在,可以添加到设计矩阵中。在每一簇细胞中,我们拟合一个线性模型,协变量作为预测因子,并通过对残差进行微分分析将它们回归。通过在每个聚类上分别拟合线性模型,我们允许协变量的影响因聚类而异。

在指定协变量时,我们强烈建议使用对数规范化数据,例如log2- cpm(例如,logcounts通过嘘:logNormCounts),因为一般假定协变量(特别是批效应)对计数的log或log2尺度有近似线性的影响。

假设样品与三个不同的批次相关联;我们修改了设计,也包括批量。

批=因子(c(“A”、“B”、“c”,“A”、“B”,“c”))=设计模型。矩阵(~group + batch) #设计的rownames必须指明样本id: rownames(design) =样本设计
##(拦截)groupstim batchB batchC ## ctrl_107 10 0 0 ## ctrl_1015 10 01 ## stim_101 1 10 01 ## stim_1015 1 1 1 101 ## stim_107 1 101 ## attr(,“分配”)## [1]01 2 2 ## attr(,“对比”)## attr(,“对比”)$group ##[1]“对照。治疗”## ## attr(,“对照”)$batch ##[1]“对照。治疗”

我们像以前一样进行差异测试。同样,我们指定要测试的设计的列Column_to_test = 2

set.seed(61217) res_batch = distinct_test(x = kang_子集,name_assays_expression = "logcounts", name_cluster = "cell", name_sample = "sample_id", design = design, column_to_test = 2, min_non_zero_cells = 20, n_cores = 2)
2组样本提供
检测到协变量
##数据加载,开始差异测试
差动测试完成,返回结果

2.3可视化的结果

结果报告为adata.frame,其中列基因而且cluster_id包含基因和细胞簇名称,而p_valp_adj.loc而且p_adj.glb通过Benjamini和Hochberg (BH)校正,报告原始p值,局部和全局调整p值。经局部调整的p值(p_adj.loc)在每个聚类中分别应用黑洞校正,而在全局调整的p值中(p_adj.glb)对所有聚类的结果进行BH校正。

我们可以进一步计算组间的折叠变化(FC)和log2-FC。为了计算fc,使用标准化数据,如cpm;不要使用对数转换的数据(例如,logcounts)。

res = log2_FC(res = res, x = kang_子集,name_assays_expression = "cpm", name_group = "stim", name_cluster = "cell")
## FC和log2_FC计算,返回结果

log2_FC计算组id的第一级和第二级之间的log-FC,在这种情况下,在控制(分子)和模拟样本(分母)之间。

水平(colData (Kang_subset)敌人美元)
##[1]“ctrl”“stim”
头(res [9:10], 3)
## FC_ctrl/stim log2FC_ctrl/stim ## 1 0.02309151 -5.4364934 ## 2 1.16891993 0.2251761 ## 3 1.26131602 0.3349298

要使用不同的关卡(即,stim/ctrl),我们可以在运行前重新排列关卡log2_FC2

#设置“stim”为一级:colData(kang_子集)$stim = relevel(colData(kang_子集)$stim,“stim”)levels(colData(kang_子集)$stim)
##[1]“stim”“ctrl”
res_2 = log2_FC(res = res, x = kang_子集,name_assays_expression = "cpm", name_group = "stim", name_cluster = "cell")
## 'res'已经包含列'FC'和/或'log2FC':它们将被覆盖
## FC和log2_FC计算,返回结果
头(res_2 [9:10] 3)
## FC_stim/ctrl log2FC_stim/ctrl ## 1 43.3059524 5.4364934 ## 2 0.8554906 -0.2251761 ## 3 0.7928227 -0.3349298

我们可以通过top_results函数。

头(top_results (res))
## cluster_id p_val p_adj。loc p_adj。glb过滤的mean_ctrl ## 1 ISG15 B cells 9.999e-05 0.00139986 0.0007650398假的198.0569 ## 49 RPL7 B cells 9.999e-05 0.00139986 0.0007650398假的159.7687 ## 58 CYB561A3 B cells 9.999e-05 0.00139986 0.0007650398假的85.5813 ## 61 PRDX5 B cells 9.999e-05 0.00139986 0.0007650398假的382.3718 ## 72 PSME2 B cells 9.999e-05 0.00139986 0.0007650398假的668.6966 ## 1 8577.043390.02309151 -5.4364934 ## 49 4537.11929 1.39524308 0.4805165 ## 57 21.60257 7.39582088 2.8867103 ## 58 22.10346 3.87185071 1.9530233 ## 61 136.40614 2.80318652 1.4870677 ## 72 1574.42658 0.42472389 -1.2354028

我们还可以将特定细胞群的显著结果可视化。

top_results(res, cluster = "树突细胞")
## cluster_id p_val p_adj。loc p_adj。glb过滤## 401 RPL7树突状细胞0.00009999 0.001549845 0.0007650398假## 472 PSME2树突状细胞0.00009999 0.001549845 0.0007650398假## 455 PPIF树突状细胞0.00059999 0.001549845 0.0007650398假## 417 ARID5A树突状细胞0.00149925 0.015492254 0.0083602267假## mean_ctrl mean_stim FC_ctrl/stim log2FC_ctrl/stim ## 401262.99661 21085.06297 0.01247312 -6.3250333 ## 449 3568.75526 2156.70504 0.34303968 -1.5435526 ## 499 41.46270 502.75503 0.08247097 -3.5999698 ## 455 219.95768 30.93333

默认情况下,' top_results '的结果按(全局)调整后的p-value排序;它们也可以按log2-FC排序。

top_results(res, cluster = "树突细胞",sort_by = "log2FC")
## cluster_id p_val p_adj。loc p_adj。glb过滤## 401 MX2树突状细胞0.00009999 0.001549845 0.0007650398假## 455 PPIF树突状细胞0.00059994 0.007439256 0.0036893507假## 417 ARID5A树突状细胞0.00149925 0.015492254 0.0083602267假## 472 PSME2树突状细胞0.00009999 0.001549845 0.0007650398假# 449 RPL7树突状细胞0.00009999 0.001549845 0.0007650398假## mean_ctrl mean_stim FC_ctrl/stim log2FC_ctrl/stim ## 401262.99661 21085.06297 0.01247312 -6.3250333 ## 499 41.46270 502.75503 0.08247097 -3.5999698 ## 455 219.95768 30.93333 7.11070267 2.8299921 ## 417 37.40927 181.37474 0.20625400 -2.2775060 ## 472 785.99389 2291.26229 0.34303968 -1.5435526 ## 449

我们可以进一步筛选结果,只显示显著的上调或下调结果。在这里,我们将下调的基因簇结果可视化;也就是说,与“stim”组相比,“ctlr”组的结果表达较低。

top_results(res, up_down = "down", cluster = "Dendritic cells")
## cluster_id p_val p_adj。loc p_adj。glb过滤## 401 PSME2树突状细胞0.00009999 0.001549845 0.0007650398假## 417 MX2树突状细胞0.00009999 0.001549845 0.0007650398假## 417 ARID5A树突状细胞0.00149925 0.015492254 0.0083602267假## 40262.99661 21085.0630 0.01247312 -6.325033 ## 472 785.99389 2291.3968 -1.543553 ## 41737.40927 181.3747 0.20625400 -2.277506

2.4绘制重要结果

其中一个显著基因(ISG15)的密度图树突细胞集群。

plot_density (x = kang_子集,基因= "ISG15", cluster = "树突状细胞",name_assays_expression = "logcounts", name_cluster = "cell", name_sample = "sample_id", name_group = "stim")

我们也可以通过设置来绘制聚合的组级曲线,而不是每个样本一条曲线group_level = TRUE

plot_density (x = kang_子集,基因= "ISG15", cluster = "树突状细胞",name_assays_expression = "logcounts", name_cluster = "cell", name_sample = "sample_id", name_group = "stim", group_level = TRUE)

其中一个显著基因(ISG15)的CDF图树突细胞集群。

plot_cdfs(x = kang_子集,基因= "ISG15", cluster = "树突状细胞",name_assays_expression = "logcounts", name_cluster = "cell", name_sample = "sample_id", name_group = "stim")

中显著基因的小提琴图树突细胞集群。

# select cluster = "Dendritic cells" sel_cluster = res$cluster_id == cluster sel_column = kang_子集$cell == cluster # select significant genes = res$p_adj. .GLB < 0.01基因= as。字符(res$gene[sel_cluster & sel_genes]) #创建小提琴图:
##装载所需的包:舷窗
##加载所需的包:ggplot2
plotExpression(kang_子集[,sel_column], features =基因,express_values = "logcounts", log2_values = FALSE, x = "sample_id", color_by = "stim", ncol = 3) + guides(填充= guide_legend(覆盖。Aes = list(size = 5, alpha = 1))) +主题(axis.text. text)。X = element_text(angle = 45, hjust = 1))

可视化细胞群之间差异结果的一致性。我们选择全局调整p值低于0.01的显著基因。

库(UpSetR) res_by_cluster = split(ifelse(res$p_adj.)GLB < 0.01, 1,0), res$cluster_id) upset(data.frame(do.call(cbind, res_by_cluster)), nsets = 10, nintersects = 20)

#会话信息

sessionInfo ()
## R版本4.2.1(2022-06-23)##平台:x86_64-pc-linux-gnu(64位)##运行在Ubuntu 20.04.5 LTS ## ##矩阵产品:默认## BLAS: /home/biocbuild/bbs-3.16-bioc/R/lib/libRblas。/home/biocbuild/bbs-3.16-bioc/R/lib/libRlapack。所以## ## locale: ## [1] LC_CTYPE=en_US。UTF-8 LC_NUMERIC= c# # [3] LC_TIME=en_GB LC_COLLATE= c# # [5] LC_MONETARY=en_US。utf - 8 LC_MESSAGES = en_US。UTF-8 ## [7] LC_PAPER=en_US。UTF-8 LC_NAME= c# # [9] LC_ADDRESS=C lc_phone = c# # [11] LC_MEASUREMENT=en_US。UTF-8 LC_IDENTIFICATION=C ## ##附加的基本包:## [1]stats4 stats graphics grDevices utils datasets methods ##[8]基础## ##其他附加包:[5] distinct_1.10.0 SingleCellExperiment_1.20.0 ## [7] SummarizedExperiment_1.28.0 Biobase_2.58.0 ## [11] IRanges_2.32.0 S4Vectors_0.36.0 ## [13] BiocGenerics_0.44.0 MatrixGenerics_1.10.0 ## [15] matrixStats_0.62.0 BiocStyle_2.26.0 ## ##通过命名空间加载(并且没有附加):## [1] bitops_1.0-7 doParallel_1.0.17 ## [3] tools_4.2.1 doRNG_1.8.2 ## [5] bslib_0.4.0 utf8_1.2.2 ## [9] vipor_0.4.5 DBI_1.1.3 ## [11] colorspace_2.0-3 withr_2.5.0 ## [13] tidyselect_1.2.0 gridextra_3 . 2.3 ## [15] compiler_4.2.1 cli_3.4.1 ## [17] BiocNeighbors_1.16.0 DelayedArray_0.24.0 ## [19] labeling_0.4.2 bookdown_0.29 ## [23] sass_0.4.2 scales_1.2.1 ## [25] rmarkdown_1 .4.1 digest_0.6.30 ## [27] pkgconfig_2.0.3 htmltools_0.5.3## [29] sparseMatrixStats_1.10.0 fastmap_1.1.0 ## b[31] limma_3.54.0 highr_0.9 ## bbbbrlang_1 .0.6 DelayedMatrixStats_1.20.0 ## [35] jquerylib_0.1.4 generics_0.1.3 ## [37] farver_2.1.1 jsonlite_1.8.3 ## [39] BiocParallel_1.32.0 dplyr_1.0.10 ## [41] rcurl_1 .14.0 GenomeInfoDbData_1.2.9 ## [45] Matrix_1.5-1 Rcpp_1.0.9 ## [47] ggbeeswarm_0.6.0 munsell_0.5.0 ## [49] fansi_1.0.3 viridis_0.6.2 ## b[53] yaml_2.3.6zlibbioc_1.44.0 ## [55] plyr_1.8.7 grid_4.2.1 ## [57] parallel_4.2.1 ggrepel_0.9.1 ## [59] lattice_0.20-45 cowplot_1.1.1 ## [61] beachmat_2.14.0 magick_2.7.3 ## [63] knitr_1.40 pillar_1.8.1 ## [65] rngtools_1.5.2 codetools_0.2-18 ## [67] ScaledMatrix_1.6.0 glue_1.6.2 ## [71] vctrs_0.5.0 foreach_1.5.2 ## [73] gtable_0.3.1 assertthat_0.2.1 ## [75] cachem_1.0.6 xfun_0.34 ## [77] rsvd_1.0.5 viridisLite_0.4.1 ## [79] tibble_3.1.8 iterators_1.0.14 ## [81]beeswarm_0.4.0