forked from duty-machine/duty-machine
-
Notifications
You must be signed in to change notification settings - Fork 32
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Spateo-空间转录组的瑞士军刀-教程3:重构3D组织——切片对齐:基础使用
- Loading branch information
Showing
1 changed file
with
15 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
--- | ||
title: "Spateo-空间转录组的瑞士军刀-教程3:重构3D组织——切片对齐:基础使用" | ||
date: 2024-12-12T23:38:37Z | ||
draft: ["false"] | ||
tags: [ | ||
"fetched", | ||
"生信钱同学" | ||
] | ||
categories: ["Acdemic"] | ||
--- | ||
Spateo-空间转录组的瑞士军刀-教程3:重构3D组织——切片对齐:基础使用 by 生信钱同学 | ||
------ | ||
<div><p><strong>之前关于Spateo的介绍已经分享两期了</strong></p><p><a target="_blank" href="https://mp.weixin.qq.com/s?__biz=MzkwMzY2NjkwNg==&mid=2247490276&idx=1&sn=c8a76e544ab305f23b85840a84aead73&scene=21#wechat_redirect" textvalue="Spateo-空间转录组的瑞士军刀-教程1:细胞分割" linktype="text" imgurl="" imgdata="null" data-itemshowtype="0" tab="innerlink" data-linktype="2">Spateo-空间转录组的瑞士军刀-教程1:细胞分割</a></p><p><a target="_blank" href="https://mp.weixin.qq.com/s?__biz=MzkwMzY2NjkwNg==&mid=2247490321&idx=1&sn=0986ab4f3cfba40fb9d1ec7c65e7dc59&scene=21#wechat_redirect" textvalue="Spateo-空间转录组分析流程2:空间可变基因" linktype="text" imgurl="" imgdata="null" data-itemshowtype="0" tab="innerlink" data-linktype="2">Spateo-空间转录组分析流程2:空间可变基因</a><br></p><p>空间转录组通过对组织切片进行 mRNA 的原位标记,使研究人员能够在二维水平上解析基因的位置特征及其生物学意义。然而,组织通常是三维结构,由多个细胞层堆叠形成。通过对样本进行连续切片采样,并对切片数据进行对齐,空间转录组技术能够将这些数据堆叠重构为组织的三维结构,从而在真正的空间维度上深入理解基因的位置特征及其功能意义。</p><p><span>准确对齐空间转录组切片,从而<strong>重构三维结构</strong>,为后续的三维甚至四维分析奠定了基础。Spateo 开发了能够进行非刚性和部分对齐的数学模型。在 GPU 加速、随机变分推断(SVI)、引导变量和稀疏计算的帮助下,Spateo 实现了非常高的效率和可扩展性。在这里,我们介绍下Spateo 如何执行基本的切片对齐,并学习如何在 Spateo 中利用非刚性和部分对齐。</span></p><p><span><strong><span>Spateo 2D 切片对齐的基本使用方法</span></strong></span></p><p>简要介绍 Spateo 对 2D 切片对齐的基本使用方法。这一步需要两张连续的空间转录组切片,每张切片包含基因表达数据和空间坐标。在切片、文库准备和测序之后,细胞/spot在各切片之间的相对坐标通常会丢失。我们的目标是将这两个样本进行对齐,使得它们之间对应的<span>细胞/spot</span>具有相似的表达数据,同时保留样本中spot的空间分布。</p><section><ul><li><li><li><li><li><li><li><li><li><li><li><li><li><li><li><li><li><li><li></ul><pre data-lang="python"><code><span><span>import</span> os</span></code><code><span>os.environ[<span>'CUDA_VISIBLE_DEVICES'</span>] = <span>'0'</span></span></code><code><span><br></span></code><code><span><span>import</span> torch</span></code><code><span>device = <span>'cuda'</span> <span>if</span> torch.cuda.is_available() <span>else</span> <span>'cpu'</span></span></code><code><span>print(<span>"Running this notebook on: "</span>, device)</span></code><code><span><br></span></code><code><span><span>import</span> spateo <span>as</span> st</span></code><code><span>print(<span>"Last run with spateo version:"</span>, st.__version__)</span></code><code><span><br></span></code><code><span><span># Other imports</span></span></code><code><span><span>import</span> warnings</span></code><code><span>warnings.filterwarnings(<span>'ignore'</span>)</span></code><code><span><span>import</span> matplotlib.pyplot <span>as</span> plt</span></code><code><span><span>import</span> scanpy <span>as</span> sc</span></code><code><span><span>import</span> anndata <span>as</span> ad</span></code><code><span><br></span></code><code><span>%config InlineBackend.print_figure_kwargs={<span>'facecolor'</span> : <span>"w"</span>}</span></code><code><span>%config InlineBackend.figure_format=<span>'retina'</span></span></code></pre></section><p>教程中,使用来自小鼠胚胎 E9.5 发育阶段的数据,这些数据是通过 Stereo-Seq 技术获得的。具体来说,我们将使用切片 #32 和 #33 作为示例数据。这些切片分别包含 17,425 个和 19,939 个细胞。</p><p><strong>下载数据</strong></p><section><ul><li><li></ul><pre data-lang="nginx"><code><span><span>wget</span> https://drive.google.com/file/d/16gh_vApgzlvrplzbxYe-eODjZhvdNM4Z/view?usp=drive_link</span></code><code><span>wget https://drive.google.com/file/d/1n49YCLeqjTlYyHHBzJKmIisbIau8N9Fp/view?usp=drive_link</span></code></pre></section><p>加载数据</p><section><ul><li><li><li><li><li></ul><pre data-lang="makefile"><code><span><span># Load the slices</span></span></code><code><span>slice1 = st.read('./data/basic_usage_demo_1.h5ad')</span></code><code><span>slice2 = st.read('./data/basic_usage_demo_2.h5ad')</span></code><code><span><br></span></code><code><span>slice1, slice2</span></code></pre></section><p>(可选且推荐)数据预处理<br>在进行下一步之前,建议进行一些基本的质量控制、归一化和特征选择。这些预处理步骤可以增强下游应用程序的稳定性和性能,包括 Spateo 包中的 3D 对齐。参考 Scanpy 中针对 scRNA-seq 数据的标准预处理工作流程,并分别处理这两张切片。<strong><span></span></strong></p><section><ul><li><li><li><li><li><li><li><li><li><li><li><li><li><li><li><li><li><li><li><li><li><li><li></ul><pre data-lang="bash"><code><span><span># preprocess slice1</span></span></code><code><span>sc.pp.filter_cells(slice1, min_genes=10) <span># we use min_genes=10 as 100 is too large for ST data</span></span></code><code><span>sc.pp.filter_genes(slice1, min_cells=3)</span></code><code><span><span># Saving count data</span></span></code><code><span>slice1.layers[<span>"counts"</span>] = slice1.X.copy()</span></code><code><span><span># Normalizing to median total counts</span></span></code><code><span>sc.pp.normalize_total(slice1)</span></code><code><span><span># Logarithmize the data</span></span></code><code><span>sc.pp.log1p(slice1)</span></code><code><span><span># annotates highly variable genes</span></span></code><code><span>sc.pp.highly_variable_genes(slice1, n_top_genes=2000)</span></code><code><span><br></span></code><code><span><span># preprocess slice1</span></span></code><code><span>sc.pp.filter_cells(slice2, min_genes=10)</span></code><code><span>sc.pp.filter_genes(slice2, min_cells=3)</span></code><code><span><span># Saving count data</span></span></code><code><span>slice2.layers[<span>"counts"</span>] = slice2.X.copy()</span></code><code><span><span># Normalizing to median total counts</span></span></code><code><span>sc.pp.normalize_total(slice2)</span></code><code><span><span># Logarithmize the data</span></span></code><code><span>sc.pp.log1p(slice2)</span></code><code><span><span># annotates highly variable genes</span></span></code><code><span>sc.pp.highly_variable_genes(slice2, n_top_genes=2000)</span></code></pre></section><p>在对齐前可视化切片<br>使用 Spateo 的绘图功能可视化这两张切片的空间分布。这两张切片没有对齐,这为后续的 3D 分析带来了挑战。</p><section><ul><li><li><li><li><li><li><li><li><li><li><li><li></ul><pre data-lang="php"><code><span>spatial_key = <span>'spatial'</span></span></code><code><span>cluster_key = <span>'cellbin_SpatialDomain'</span></span></code><code><span><br></span></code><code><span>st.pl.slices_2d(</span></code><code><span> slices = [slice1, slice2],</span></code><code><span> label_key = cluster_key,</span></code><code><span> spatial_key = spatial_key,</span></code><code><span> height=<span>4</span>,</span></code><code><span> center_coordinate=<span>True</span>,</span></code><code><span> show_legend=<span>True</span>,</span></code><code><span> legend_kwargs={<span>'loc'</span>: <span>'upper center'</span>, <span>'bbox_to_anchor'</span>: (<span>0.5</span>, <span>0</span>) ,<span>'ncol'</span>: <span>5</span>, <span>'borderaxespad'</span>: <span>-4</span>, <span>'frameon'</span>: <span>False</span>},</span></code><code><span>)</span></code></pre></section><p><img data-imgfileid="100006424" data-ratio="0.7074074074074074" data-src="https://mmbiz.qpic.cn/mmbiz_png/7At0Eia3NQFuZvau9Ksyt9IcibBEoiame8Do2yc5sj90WaEjrsnFJDMlMPTEZj2VodUS9sRqEw4QWasRbVnxn5d0g/640?wx_fmt=png&from=appmsg" data-type="png" data-w="1080" src="https://mmbiz.qpic.cn/mmbiz_png/7At0Eia3NQFuZvau9Ksyt9IcibBEoiame8Do2yc5sj90WaEjrsnFJDMlMPTEZj2VodUS9sRqEw4QWasRbVnxn5d0g/640?wx_fmt=png&from=appmsg"></p><p>(可选且推荐)在两张切片之间进行 PCA<br>主成分分析(PCA)是一种经典的线性降维算法,可以从数据中提取主要特征,同时去噪。与直接使用原始的高维基因表达矩阵相比,利用 PCA 特征生成映射概率通常能获得更好的性能。此外,使用较少维度的特征可以显著减少计算相似度矩阵时的计算开销。</p><p>需要注意的是,PCA 应该在两张切片之间进行,而不是分别在每张切片上独立执行,以确保特征表示在 PCA 空间中的对齐。因此,在接下来的步骤中,我们首先将两张切片合并为一个数据集,然后使用 Scanpy 提供的函数执行 PCA。最后,我们使用“batch”键提取相应的 PCA 特征。</p><section><ul><li><li><li></ul><pre data-lang="javascript"><code><span>st.align.group_pca([slice1,slice2], pca_key=<span>'X_pca'</span>)</span></code><code><span><br></span></code><code><span>slice1, slice2</span></code></pre></section><p><span></span><span>Spateo 对齐:</span><span>Spateo 对齐操作简单易用、可扩展且高效。</span><span>通过简单调用 </span><span>st.align.morpho_align</span><span>,您可以在几秒钟内获得对齐后的切片和对应的映射矩阵(如果支持 CUDA,速度更快)。</span><span>在本例中,我们将使用之前提取的高变基因及其 PCA 表示来进行对齐。</span><span>以下是对该函数输入参数的解释:</span></p><ul><li><p>models:需要对齐的切片,使用的是高变基因。</p></li><li><p>rep_layer:要使用的表示名称。</p></li><li><p>rep_field:在 AnnData 中存储表示的字段。</p></li><li><p>dissimilarity:计算相似度的方法。</p></li><li><p>spatial_key:AnnData 中 .obsm 对应空间坐标的键。</p></li><li><p>key_added:对齐后的空间坐标将添加到 .obsm 中的键。</p></li><li><p>device:用于计算的设备,可以是 "cpu" 或 "cuda"。</p></li></ul><section><ul><li><li><li><li><li><li><li><li><li><li><li><li><li><li><li></ul><pre data-lang="properties"><code><span><span>key_added</span> = <span>'align_spatial'</span></span></code><code><span><span># spateo return aligned slices as well as the mapping matrix</span></span></code><code><span><span>aligned_slices,</span> <span>pis = st.align.morpho_align(</span></span></code><code><span> <span>models</span>=<span>[slice1, slice2],</span></span></code><code><span><span> ## Uncomment this if use highly variable genes</span></span></code><code><span><span> # models=[slice1[:, slice1.var.highly_variable], slice2[:, slice2.var.highly_variable]],</span></span></code><code><span><span> ## Uncomment the following if use pca embeddings</span></span></code><code><span><span> # rep_layer='X_pca',</span></span></code><code><span><span> # rep_field='obsm',</span></span></code><code><span><span> # dissimilarity='cos',</span></span></code><code><span> <span>verbose</span>=<span>False,</span></span></code><code><span> <span>spatial_key</span>=<span>spatial_key,</span></span></code><code><span> <span>key_added</span>=<span>key_added,</span></span></code><code><span> <span>device</span>=<span>device,</span></span></code><code><span><span>)</span></span></code></pre></section><p>可视化对齐完成后,我们可以通过可视化两张切片的叠加结果来检查对齐效果。这可以通过调用 st.pl.overlay_slices_2d 来轻松实现。在接下来的步骤中,我们将可视化刚性对齐和非刚性对齐的结果。刚性对齐解决了旋转和平移的问题,而非刚性对齐则更好地拟合局部结构。</p><section><ul><li></ul><pre data-lang="javascript"><code><span>st.pl.overlay_slices_2d(slices = aligned_slices, spatial_key = key_added, height=<span>5</span>, overlay_type=<span>'backward'</span>)</span></code></pre></section><p><img data-imgfileid="100006425" data-ratio="1.0481927710843373" data-src="https://mmbiz.qpic.cn/mmbiz_png/7At0Eia3NQFuZvau9Ksyt9IcibBEoiame8DkpeVC6uzibzfGdMNlaDhH9UmgFiaYhGWf8E9jbQUV3lqnPjPEJO5fU2g/640?wx_fmt=png&from=appmsg" data-type="png" data-w="830" src="https://mmbiz.qpic.cn/mmbiz_png/7At0Eia3NQFuZvau9Ksyt9IcibBEoiame8DkpeVC6uzibzfGdMNlaDhH9UmgFiaYhGWf8E9jbQUV3lqnPjPEJO5fU2g/640?wx_fmt=png&from=appmsg"></p><section><ul><li></ul><pre data-lang="javascript"><code><span>st.pl.overlay_slices_2d(slices = aligned_slices, spatial_key = key_added+<span>'_nonrigid'</span>, height=<span>5</span>, overlay_type=<span>'backward'</span>)</span></code></pre></section><p><img data-imgfileid="100006426" data-ratio="1.0469314079422383" data-src="https://mmbiz.qpic.cn/mmbiz_png/7At0Eia3NQFuZvau9Ksyt9IcibBEoiame8D7agZ096SNV0BRYyPkpmYS1BdvQjuSfDtIKzM1N0HBdYN81icnRQsyMw/640?wx_fmt=png&from=appmsg" data-type="png" data-w="831" src="https://mmbiz.qpic.cn/mmbiz_png/7At0Eia3NQFuZvau9Ksyt9IcibBEoiame8D7agZ096SNV0BRYyPkpmYS1BdvQjuSfDtIKzM1N0HBdYN81icnRQsyMw/640?wx_fmt=png&from=appmsg"><span>Spateo 对齐功能</span><span>简单易用,又精确高效。</span><span>Spateo 提供了许多其他强大的功能,包括 2D 切片对齐、3D 空间转录组重构、3D 感知数字化/细胞间相互作用以及 4D 时空映射。</span></p><p><span><strong><span>这次生信的大纲内容进行全面的调整,想了解生信的,跟班的,可以看下面</span><strong>👇这个文章</strong></strong></span></p><p><a target="_blank" href="http://mp.weixin.qq.com/s?__biz=MzkwMzY2NjkwNg==&mid=2247489898&idx=1&sn=36e03c6c81e651b9c81eaf558e07aa24&chksm=c09394dff7e41dc94b801cad43f802037589975b4c01de6659d39027f3efa91c5989d88f5cca&scene=21#wechat_redirect" textvalue="这次可不是只学单细胞,基本上从基础到多组学、空间、机器学习一条龙全打通了" linktype="text" imgurl="" imgdata="null" data-itemshowtype="11" tab="innerlink" data-linktype="2" hasload="1"><span><strong>这次可不是只学单细胞,基本上从基础到多组学、空间、机器学习一条龙全打通了</strong></span></a></p><p><span><strong><span>单细胞数据分析需求的可以看<strong><strong>👇这个文章</strong></strong></span></strong></span></p><p><span><strong><span><strong><strong><a target="_blank" href="https://mp.weixin.qq.com/s?__biz=MzkwMzY2NjkwNg==&mid=2247490275&idx=1&sn=200ccc0a415860f9d73b9068657096ff&scene=21#wechat_redirect" textvalue="没有服务器,单细胞数据搞不定?我们目前做好了这些pipeline,可以帮你做" linktype="text" imgurl="" imgdata="null" data-itemshowtype="0" tab="innerlink" data-linktype="2" hasload="1">没有服务器,单细胞数据搞不定?我们目前做好了这些pipeline,可以帮你做</a>(近期又添加了21 年发表在了 Cell上面的单细胞转录组分析代谢的分析——compass<a target="_blank" href="https://mp.weixin.qq.com/s?__biz=MzkwMzY2NjkwNg==&mid=2247484892&idx=1&sn=16ad7a7bc2f1000c8fd71c4ad84a4841&scene=21#wechat_redirect" textvalue="从前天的Nature中,我学到了21 年 Cell开发的单细胞代谢状态的计算——一起学代码" linktype="text" imgurl="" imgdata="null" data-itemshowtype="0" tab="innerlink" data-linktype="2">从前天的Nature中,我学到了21 年 Cell开发的单细胞代谢状态的计算——一起学代码</a>)</strong></strong></span></strong></span></p><p><mp-style-type data-value="3"></mp-style-type></p></div> | ||
<hr> | ||
<a href="https://mp.weixin.qq.com/s/06dfWM37MR7BH2WY4ReFsA",target="_blank" rel="noopener noreferrer">原文链接</a> |