1简介

mistyR的使用是通过四类函数构建空间组学数据分析工作流的概念:

要构造一个工作流mistyR设计时使用了管道操作符(例如操作符% > %magrittr),以便将功能连接起来。

当加载mistyR请考虑配置未来::多重区段()并行执行计划。mistyR然后将使用所有可用的核心来执行计算要求高的功能。建议用户修改未来::计划()根据他们的需要。

# MISTy library(mistyR) library(future) # data manipulation library(dplyr) library(purrr) library(distance) # plot library(ggplot2) plan(multisession)

下面的示例使用合成生成的基准测试数据合成这是一揽子计划中包含的。该数据集是一个包含10个tibbles的列表,每个tibbles表示由四种单元格类型的随机布局和100 * 100网格上的空白空间生成的数据。

数据是通过模拟关注信号事件的二维元胞自动机模型生成的。该模型模拟了11种分子的产生、扩散、降解和相互作用。请注意,数据集仅包含非空空间的模拟测量值。

Data ("synthetic") ggplot(synthetic[[1]], aes(x = col, y = row, color = type)) + geom_point(shape = 15, size = 0.7) + scale_color_manual(values = c("#e9eed3", "#dcc38d", "#c9e2ad", "#a6bab6")) + theme_void()

str(合成([1])。attr = FALSE) #> spc_tbl_ [4,205 × 14] (S3: spec_tbl_df/tbl_df/tbl/data.frame) #> $ row: num[1:4205] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1…#> $ col: num[1:4205] 100 11 13 14 15 20 23 24 26 32…#> $ ECM: num[1:4205] 0.0385 0.0327 0.1444 0.387 0.1635…#> $ ligA: num[1:4205] 0.834 0.119 0.525 0.269 0.195…#> $ ligB: num[1:4205] 0.0157 0.0104 0.014 0.0367 0.1176…#> $ ligC: num[1:4205] 0.236 0.804 0.334 0.502 0.232…#> $ ligD: num[1:4205] 1.183 0.101 0.434 0.241 0.203…#> $ protE: num[1:4205] 1.18 0 1.67 0 0…#> $ protF: num[1:4205] 2.547 0.386 1.614 0.913 0.162… #> $ prodA: num [1:4205] 0.382 0 0.472 0 0 ... #> $ prodB: num [1:4205] 0 0 0 0 0.16 ... #> $ prodC: num [1:4205] 0 0.536 0 0.418 0 ... #> $ prodD: num [1:4205] 0.588 0 0.379 0 0 ... #> $ type : chr [1:4205] "CT1" "CT2" "CT1" "CT2" ...

有关底层模型和数据生成的更多信息,请参见帮助(合成)或者是出版

2视图组成

mistyR工作流总是从定义一个内视图(create_initial_view ()),包含感兴趣的每个单元建模目标的标记的测量。对于第一个样本合成数据集我们选择除所有可用细胞的配体之外的所有标记。

expr <- synthetic[[1]] %>% select(-c(row, col, type, starts_with("lig"))) mist .intra <- create_initial_view(expr) summary(mist .intra) #> Length Class Mode #> intraview 2 -none- list #> misty.intra。uniqueid 1 -none- character summary(fog .intra$intraview) #>长度类模式#> abbrev 1 -none- character #> data 7 spec_tbl_df list

从内在的角度来看(intraview)1你会注意到misty.intra包含一个名为misty.uniqueid用于缓存。如果没有提供,则自动生成该id。mistyR将每个标记的表达建模为细胞内其他标记的表达的函数。我们感兴趣的是探索来自互补的不同空间环境的标记表达,即,它们是可区分的,并有助于解释标记的整体表达。

mistyR包含两个默认的helper函数,用于计算和添加考虑数据空间上下文的视图:add_juxtaview ()而且add_paraview ()。的juxtaview表示局部空间视图,并捕获每个单元的邻近区域内视图中所有可用标记的表达。的paraview捕获边缘组织结构内视图中所有可用标记的表达,其中影响的重要性与两个细胞之间距离的倒数成正比。要添加paraview在视图组合中,我们首先需要关于内视图中每个单元格位置的信息。利用这些信息,我们可以创建和添加一个paraview重要性半径为10的视图组成。

Pos <- synthetic[[1]] %>% select(row, col)视图<-模糊。intra %>% add_paraview(pos, l = 10) #> #> Generating paraview summary(misty.views) #> Length Class Mode #> intraview 2 -none- list #> misty.uniqueid 1 -none- character #> paraview.10 2 -none- list

a的计算juxtaview和一个paraview当样本中有大量的细胞时,可以是计算密集型的。因此计算是与集合并行进行的未来::计划()。的计算所需的计算时间paraview也可以通过近似显著降低。请参阅此函数的文档(帮助(add_paraview))浏览详情。

可以创建其他相关和自定义视图(create_view ())从外部资源(data.frame宠物猫)并添加到视图组合中。数据应该包含和内视图中一样的每个单元格一行。例如,我们可以创建一个视图,该视图捕获每个单元的10个最近邻居的平均表达式。

#查找10个最近邻居neighbors <- nearest_neighbor_search(距离(as.matrix(pos)), k = 11)[-1,] #计算所有标记的最近邻居的平均表达式#对于expr nnexpr中的每个cell <- seq_len(nrow(expr)) %>% map_dfr(~ expr %>% slice(neighbors[, .x]) %>% colMeans()) nn。View <- create_view("nearest", nnexpr, "nn") nn。查看#> $nearest #> $nearest$abbrev #> [1] "nn" #> #> $nearest$data #> # A tibble:4205×7 # > ECM protE来protF prodA prodB prodC prodD # > <双> <双> <双> <双> <双> <双> <双> # > 1 0.169 0.337 1.07 0.120 0.0138 0.146 0.165 # > 2 0.346 0.676 0.549 0.0969 0.0140 0.190 0.219 0.304 0.495 0.0496 0.0288 0.0766 # > 3 # > 4 0.238 0.607 0.651 0.236 - 0.0387 0.132 - 0.0288 0.0954 - 0.122 # > 5 0.313 0.688 0.835 0.166 0.0297 0.0837 0.173 # > 6 0.527 0.743 0.616 0.0722 0.0184 0.135 0.278 0.399 0.501 0.0413 0.0632 0.0964 # > 7 # > 8 0.266 0.537 0.624 0.160 - 0.0604 0.0738 - 0.0463 0.154 - 0.117 # > 90.356 0.564 0.565 0.0696 0.0415 0.208 0.106 #> 10 0.625 0.863 0.458 0.0350 0.0823 0.230 0.0576 #> #

创建的视图可以添加到(add_views ())到一个现有的视图组合,或者以列表的形式提供它们。中的资源中可以找到创建和添加自定义视图到组合的其他示例另请参阅

扩展。视图<-模糊。视图%> add_views(nn.view) summary(extended.views) #>长度类模式#> intraview 2 -none- list #>模糊。唯一标识1 -none-字符#> paraview。10 2 -none- list#> nearest 2 -none- list

还可以通过提供一个或多个视图名称来从组合中删除视图remove_views ()。的intraview而且misty.uniqueid不能使用此函数删除。

扩展。views %>% remove_views("nearest") %>% summary() #>长度类模式#> intraview 2 -none- list #>模糊。唯一标识1 -none-字符#> paraview。2 -none- list扩展。views %>% remove_views("intraview") %>% summary() #>长度类模式#> intraview 2 -none- list #>模糊。唯一标识1 -none-字符#> paraview。10 2 -none- list#> nearest 2 -none- list

3.模型训练

一旦创建了视图组合,模型训练就由函数管理run_misty ()。中的每个可用标记默认地训练模型intraview为每个视图独立。模型训练的结果将存储在一个名为results的文件夹中。

雾。views %>% run_misty() #> #>训练模型#> [1]"/tmp/RtmptlcZd4/Rbuild1fb0dd4c754431/mistyR/vignettes/results"

的第一个示例所使用的工作流合成数据集可以很容易地扩展到所有10个样本,以完全再现在报告中的结果之一出版。每个样本的结果将存储在文件夹“results”的子文件夹中。

结果。文件夹<-合成%>% imap_chr(函数(样本,名称){样本。Expr <- sample %>% select(-c(row, col, type, starts_with("lig")))Pos <- sample %>% select(row, col) create_initial_view(sample.expr) %>% add_paraview(sample. expr)Pos, l = 10) %>% run_misty(结果。folder = paste0("results", . platform $file. "9月,的名字 )) }) #> #> 生成paraview # > # # > # > >培训模型生成paraview # > # # > # > >培训模型生成paraview # > # # > # > >培训模型生成paraview # > # # > # > >培训模型生成paraview # > # # > # > >培训模型生成paraview # > # # > # > >培训模型生成paraview # > # # > # > >培训模型生成paraview # > # # > # > >培训模型生成paraview # > # # > # > >培训模型生成paraview # > # >训练模型的结果。"/tmp/RtmptlcZd4/Rbuild1fb0dd4c754431/ RtmptlcZd4/Rbuild1fb0dd4c754431/mistyR/vignettes/results/ syntic10 " #> syntic2 #> "/tmp/RtmptlcZd4/Rbuild1fb0dd4c754431/mistyR/vignettes/results/ syntic2 " #> syntic3 #> "/tmp/RtmptlcZd4/Rbuild1fb0dd4c754431/mistyR/vignettes/results/ syntic3 " #> syntic4 #> "/tmp/RtmptlcZd4/Rbuild1fb0dd4c754431/mistyR/vignettes/results/ syntic4 " #> syntic5 #>"/tmp/RtmptlcZd4/Rbuild1fb0dd4c754431/ RtmptlcZd4/Rbuild1fb0dd4c754431/mistyR/vignettes/results/ syntic6 " #> syntic7 # b> "/tmp/RtmptlcZd4/Rbuild1fb0dd4c754431/mistyR/vignettes/results/ syntic7 " #> syntic8 #> "/tmp/RtmptlcZd4/Rbuild1fb0dd4c754431/mistyR/vignettes/results/ syntic8 " #> syntic9 #> "/tmp/RtmptlcZd4/Rbuild1fb0dd4c754431/mistyR/vignettes/results/ syntic9 "/tmp/RtmptlcZd4/Rbuild1fb0dd4c754431/mistyR/vignettes/results/ syntic9 "

注意,默认情况下,mistyR缓存计算视图2juxtaview而且paraview计算和添加add_juxtaview ()而且add_paraview ()分别以及训练过的模型,这样在重复运行工作流的情况下,它们将被检索而不是重新计算,从而节省了大量的计算时间。但是,生成的缓存文件的大小可能很大。因此,可以使用缓存文件的函数,例如run_misty (),参数命名为缓存可以设置为。另外,函数clear_cache ()提供删除缓存文件的方法。

4结果处理

原始的mistyR结果存储在每个分析样本的输出文件夹中的几个文本文件中。可以使用该函数收集一个或多个样本的结果,聚合并转换到R对象collect_results (),通过提供包含由run_misty ()

misty.results<- collect_results(result.folders) #> #> Collecting improvements #> #> Collecting contributions #> #> Collecting importances #> #> Aggregating summary(misty.results) #> Length Class Mode #> improvements 4 tbl_df list #> contributions 4 tbl_df list #> importances 5 tbl_df list #> improvements.stats 5 tbl_df list #> contributions.stats 6 tbl_df list #> importances.aggregated 5 tbl_df list

看到帮助(collect_results)的结构的更多信息misty.results

5策划

MISTy给出了三个一般性问题的解释性答案。每个问题都可以通过查看相应的情节来回答。

1.更广阔的空间背景能在多大程度上解释标记的表达(相对于内观)?

这可以从使用多视图模型与单一模型相比的R2(绝对百分比)(或RMSE下降的相对百分比)的增益中观察到intraview只有模型。

misty.results% > %plot_improvement_stats("gain.R2") %>% plot_improvement_stats("gain.RMSE")

我们可以通过基于交叉验证的改进的指定p值进一步检查解释方差增益的显著性。

misty.results$improvements %>% filter(measure == "p.R2") %>% group_by(target) %>% summarize(mean.p = mean(value)) %>% arrange(mean.p)
目标 mean.p
ECM 0.0184012
protF 0.0496408
protE来 0.4209367
prodA 0.4600104
prodB 0.4985316
prodC 0.5034351
prodD 0.5054532

一般来说,R2中的显著增益可以解释为:

“我们可以更好地解释标记X的表达,当我们考虑其他的观点,而不是内在的观点。”

2.不同的视图组件对解释表达式有多大作用?

misty.results% > %plot_view_contributions()

正如预期的那样,对预测标志物表达的大部分贡献来自于intraview。然而,对于我们观察到方差显著改善的标记,我们也可以观察到成比例的估计贡献paraview

3.哪些具体的关系可以解释这些贡献?

为了解释这些贡献,我们可以将来自每个视图的标记的重要性分别可视化为所有标记的表达式的预测器。

首先,intraview重要性。

misty.results% > %plot_interaction_heatmap(view = "intra", cutoff = 0.8)

这些重要性与同一细胞中标记之间的关系有关。由于我们在建模过程中没有以任何方式使用关于细胞类型的信息,我们在热图中看到的重要相互作用可能来自任何细胞类型。

第二,paraview重要性。

misty.results% > %plot_interaction_heatmap(view = "para.10", cutoff = 0.5)

这些重要性与细胞中的标记和更广泛结构中的标记之间的关系有关(由我们的参数l控制)。

我们可以观察到一些相互作用paraview可能是多余的,也就是说,它们也被发现是重要的intraview。来关注来自paraview只有我们能画出这些结果之间的对比。

misty.results% > %plot_contrast_heatmap("intra", "para.10", cutoff = 0.5)

此外,由于两个视图中的预测器和目标标记是相同的,我们可以绘制可以从估计的交互对中提取的交互社区intraview

misty.results% > %plot_interaction_communities("intra")

paraview

misty.results% > %plot_interaction_communities("para.10", cutoff = 0.5)

在解释结果和图表时,重要的是要注意,在重要性中捕获的关系不能假设或解释为线性或偶然的。此外,单个预测因子-标记对的估计重要性不应孤立地解释,而应在其他预测因子的背景下解释,因为训练MISTy模型是一项多元预测任务。


另请参阅

更多的例子

browseVignettes(“mistyR”)

网上的文章

出版

约万·塔内夫斯基,里卡多·奥马尔·拉米雷斯·弗洛雷斯,阿提拉·加博尔,丹尼斯·夏皮罗,胡里奥·萨伊兹-罗德里格斯。可解释的多视图框架,用于从高度复用的数据中剖析空间关系。基因组生物学23,97(2022)。https://doi.org/10.1186/s13059-022-02663-5

会话信息

这是的输出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。所以#> LAPACK: /home/biocbuild/bbs-3.16-bio /R/lib/libRlapack。so #> #> 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_TELEPHONE= c# > [11] LC_MEASUREMENT=en_US。UTF-8 LC_IDENTIFICATION= c# b> #>附加基础包:#> [1]stats graphics grDevices utils datasets methods base #> #>其他附加包:#> [1]ggplot2_3.3.6 distances_0.1.8 purrr_0.3.5 dplyr_1.0.10 #> [5] future_1.28.0 mistyR_1.6.0 BiocStyle_2.26.0 #> #>通过命名空间加载(且未附加):#> [1] tidyselect_1.2.0 xfun_0.34 bslib_0.4.0 #> [7] generics_0.1.3 htmltools_0.5.3 yamle_2.3.6 #> [10] utf8_1.2.2 rlang_1. 25.0 #> [13] jquerylib_0.1.4 pillar_1.8.1 glue_1.6.2 #> b[16] withr_2.5.0 DBI_1.1.3 R.utils_2.12.1 #> [19] RColorBrewer_1.1-3 lifecycle_1.0.3 string_1 .4.1 #> [22] munsell_0.5.0 gtable_0.3.1 R.methodsS3_1.8.2 #> [28] knitr_1.40 fastmap_1.1.0 parallel_4.2.1 #> [31]fansi_1.0.3 highr_0.9 furrr_0.3.1 #> [34] Rcpp_1.0.9 filelock_1.0.2 scales_1.2.1 #> [37] BiocManager_1.30.19 cachem_1.0.6 magick_2.7.3 #> [40] jsonlite_1.8.3 farver_2.1.1 parallelly_1.32.1 #> [43] digest_0.6.30 stringi_1.7.8 rlist_0.4.6.2 #> [46] bookdown_0.29 grid_4.2.1 cli_3.4.1 #> [49] tools_4.2.1 magrittr_2.0.3 sass_0.4.2 #> [52] tibble_3.1.8 tidyr_1.2.1 pkgconfig_2.0.3 #> [55] ellipsis_0.3.2 data.table_1.14.4 assertthat_0.2.1 #> [58] rmarkdown_2.17 R6_2.5.1 globals_0.16.1 #> [61] igraph_1.3.5 compiler_4.2.1