Visium HD 空间转录组分析探索之--基础分析

    上节我们完成了Space Ranger分析,在输出结果binned_outputs文件夹内默认生成了2um,8um,16um bin的结果,这节我们使用10x文章中推荐的8x8um bin结果进行后续分析。为了演示,我们取P1_CRC样本数据进行后续分析(多样本合并一般都需要进行去批次处理,如果有需要,后续我们会继续分享多样本合并分析步骤)。

主要步骤:

        1.读取8um bin结果;

        2.数据质控;

        3.细胞过滤;

        4.降维聚类;

        5.特征基因筛选

环境加载
import os
import numpy as np
import pandas as pd
import scanpy as sc
import seaborn as sns
import omicverse as ov
import matplotlib.pyplot as plt
from matplotlib.pyplot import rc_context

import warnings
warnings.filterwarnings('ignore')

plt.style.use('default')
plt.rcParams['figure.facecolor'] = 'white'
sc.settings.set_figure_params(dpi=100, dpi_save=200, figsize=(5, 5), facecolor='white')
1. 8um bin数据读取

    数据读取使用scanpy的read_visium函数即可,要注意一点,Visium HD使用的Space Ranger v3.0为了节省输出文件空间,将之前的spatial文件夹下的tissue_positions_list.csv文件格式变成了tissue_positions.parquet,为了使用read_visium函数正确读取数据,首先要将tissue_positions.parquet文件转成tissue_positions_list.csv文件。

data_dir = './CRC/P1_CRC/'
tissue_position_df = pd.read_parquet(f'{data_dir}/binned_outputs/square_008um/spatial/tissue_positions.parquet')
tissue_position_df.to_csv(f'{data_dir}/binned_outputs/square_008um/spatial/tissue_positions_list.csv', index=False, header=None)
adata = sc.read_visium(f'{data_dir}/binned_outputs/square_008um', library_id='P1')
adata.obs['sample'] = 'P1'
adata.var_names_make_unique()
2. 数据质控

   空间转录组学实验中不可避免会引入一些技术噪音,比如由于实验处理或数据测序中的技术误差,导致部分细胞的测序数据异常(例如某些细胞可能由于实验处理不当或实际转录活性低,表现为转录本数量非常少)。细胞QC的目的是识别和过滤掉这些异常细胞,以避免它们对下游分析(如差异表达分析、聚类或功能分析)产生负面影响。通过去除低质量的细胞,我们可以确保保留下来的细胞是转录活性正常、具有代表性的细胞。这样不仅可以提高分析结果的生物学意义,还能减少假阳性结果。

# Data QC
adata.var['mt'] = adata.var_names.str.upper().str.startswith('MT-') 
adata.var['ribo'] = adata.var_names.str.upper().str.startswith(("RPS","RPL"))
sc.pp.calculate_qc_metrics(adata, qc_vars=['mt', 'ribo'], percent_top=None, log1p=False, inplace=True)
adata.obs['log10GenesPerUMI'] = np.log10(adata.obs['n_genes_by_counts']) / np.log10(adata.obs['total_counts'])
sc.pl.violin(
    adata,
    ['n_genes_by_counts', 'total_counts', 'pct_counts_mt', 'log10GenesPerUMI'], 
    groupby='sample', 
    jitter=False, 
    rotation=90, 
    multi_panel=True, 
    show=False
)

3. 细胞过滤

    低质量细胞会影响后续分析结果,这里我们和单细胞数据分析一样,首先将低质量细胞进行去除(当然也有些人不进行过滤,直接后续分析),这里我们将8um bin内鉴定到UMI counts数小于50个的细胞、线粒体基因占比大于30%的细胞、以及log10GenesPerUMI(主要反映的是细胞中鉴定到基因文库的复杂性)值小于0.8的细胞认为是低质量细胞,进行去除。

## Cell filter
sc.pp.filter_cells(adata, min_counts=50)
adata = adata[(adata.obs['pct_counts_mt'] < 30) & (adata.obs['log10GenesPerUMI'] > 0.8) & (adata.obs['log10GenesPerUMI'] < 0.99)]
sc.pl.violin(
    adata,
    ['n_genes_by_counts', 'total_counts', 'pct_counts_mt', 'log10GenesPerUMI'], 
    groupby='sample', 
    jitter=False, 
    rotation=90, 
    multi_panel=True, 
    show=False
)

with rc_context({'figure.figsize': (8, 8)}):
    sc.pl.spatial(
        adata, 
        color=['n_genes_by_counts', 'total_counts', 'log10GenesPerUMI'],
        library_id='P1',
        alpha_img=0.6
    )

细胞过滤后,空间上展示展示基因数、counts数等

4. 降维聚类

经过过滤之后的表达矩阵,使用Scanpy 进行降维聚类分析:

1)首先进行数据的表达量均一化,对测序深度进行校正,消除技术噪音;

2)选取高可变基因(细胞间高特征基因),用于提高细胞分群准确度(默认值为2000);

3)进一步对表达量值均一化处理后,利用PCA分析对数据进行降维,PCA降维是一种线性降维方法,运用方差分解,将高维的数据映射到低维的空间中;然后基于SNN聚类算法对细胞进行聚类和分群,构建细胞间的聚类关系;

4)最后将降维后的数据传递到UMAP进行可视化展示,细胞之间的基因表达模式越相似,在UMAP图中的距离也越接近。

## data normalization and log10 transform
adata.layers["counts"] = adata.X.copy()
sc.pp.normalize_total(adata)
sc.pp.log1p(adata)
adata.raw = adata

## select highly variable gene and data scale 
sc.pp.highly_variable_genes(adata, min_mean=0.0125, max_mean=3, min_disp=0.5, n_top_genes=2000)
sc.pl.highly_variable_genes(adata, show=False)
adata = adata[:, adata.var['highly_variable']]
sc.pp.regress_out(adata, ['total_counts', 'pct_counts_mt'])
sc.pp.scale(adata, max_value=10)

## PCA
sc.tl.pca(adata, svd_solver='arpack')
sc.pl.pca(adata, color='sample', show=False)
sc.pl.pca_variance_ratio(adata, log=True, show=False)

## UMAP
sc.pp.neighbors(adata, n_neighbors=15, n_pcs=15)
sc.tl.umap(adata)
sc.tl.leiden(adata, resolution=0.6, key_added='res_0.6')
sc.tl.leiden(adata, resolution=0.8, key_added='res_0.8')

降维聚类结果UMAP及空间展示

from matplotlib import patheffects
import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize=(6,6))

ov.pl.embedding(adata,
                basis='X_umap',
                color=['res_0.6'],
                size=4,
                show=False, 
                legend_loc=None, 
                add_outline=False, 
                frameon='small',
                legend_fontoutline=2,
                ax=ax
                )

ov.utils.gen_mpl_labels(
    adata,
    'res_0.6',
    exclude=("None",),  
    basis='X_umap',
    ax=ax,
    adjust_kwargs=dict(arrowprops=dict(arrowstyle='-', color='black')),
    text_kwargs=dict(fontsize= 12 ,weight='bold', path_effects=[patheffects.withStroke(linewidth=2, foreground='w')] ),
)

单细胞降维聚类结果展示

降维聚类结果空间展示

特征基因筛选


sc.tl.rank_genes_groups(
    adata, 
    groupby='res_0.6', 
    use_raw=True, 
    method="wilcoxon",
    pts=True
)

sc.pl.rank_genes_groups_dotplot(
    adata, 
    groupby='res_0.6',
    standard_scale="var", 
    n_genes=5,
    cmap='bwr',
    show=False,
)

result = adata.uns['rank_genes_groups']
groups = result['names'].dtype.names
all_diff = []
for c in groups:
    tmp = sc.get.rank_genes_groups_df(adata, group=c)
    tmp = tmp[(tmp['logfoldchanges']>0) & (tmp['pvals_adj']<0.05)]
    tmp['cluster'] = c
    all_diff.append(tmp)

all_diff = pd.concat(all_diff, axis=0)

各细胞Cluster Marker基因Dotplot, 结合上一步各Cluster特征基因,进行细胞类型定义

微信公众号:生信大杂烩

### 空间转录组数据分析中的拟时序分析空间转录组数据的背景下,拟时序分析旨在揭示细胞随时间演变的过程。这种类型的分析特别适用于追踪发育过程、分化路径或其他动态变化。然而,在进行此类分析之前,需先理解并处理好空间位置信息。 #### 数据预处理与特征提取 对于10X Genomics平台产生的空间转录组数据,通常会涉及到多个步骤的数据预处理工作。这包括但不限于质量控制(QC),去除低表达水平或背景噪音较高的spot区域;接着是对每个spot内检测到的所有mRNA分子计数矩阵标准化处理[^1]。这些操作确保了下游分析的有效性和准确性。 #### 构建时空模型 一旦完成了初步的数据清理和转换之后,则需要考虑如何将时间和空间维度结合起来建立合适的数学/统计框架用于描述细胞状态转变模式。一种常见做法是在二维平面上定义邻居关系(即所谓的“社区”),并通过计算同型分数(反映相同类型之间的联系紧密程度) 和异型分数 (衡量不同类型间的交互情况) 来量化不同cell type之间相互作用强度。这种方法有助于识别潜在的功能模块或者信号传导途径。 #### 应用单细胞拟时序工具扩展至空间领域 尽管传统上单细胞测序技术更常用来做拟时序重建,但现在也有不少尝试将其应用于ST-seq数据集的研究案例。例如Monocle3就是一个流行的选择之一,它支持多种输入格式,并允许用户指定额外的空间坐标作为辅助变量参与排序流程设计中去[^2]。除此之外还有其他一些新兴算法如Slingshot, PAGA等也可以考虑纳入考量范围之内。 ```python import scanpy as sc from monocle import recipe_velocity adata = sc.read_10x_h5('filtered_feature_bc_matrix.h5') sc.pp.filter_cells(adata, min_genes=200) sc.pp.normalize_total(adata, target_sum=1e4) sc.pp.log1p(adata) # Add spatial coordinates to adata.obs or .obsm field before running this command. recipe_velocity(adata, experiment_type='spatial', reduction_method='umap') sc.pl.embedding(adata, basis='X_umap', color=['cluster_labels']) ``` 上述代码片段展示了使用Scanpy库加载经过过滤后的10X Visium数据文件,并对其进行基本的质量控制措施后调用了来自`monocle`包里的函数来进行基于UMAP降维的结果可视化展示。注意这里假设已经预先设置了样本点的位置属性以便于后续分析能够充分利用空间结构特性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值