前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >sc-DRS: 连接疾病GWAS与单细胞数据的分析方式

sc-DRS: 连接疾病GWAS与单细胞数据的分析方式

原创
作者头像
凑齐六个字吧
发布于 2025-04-05 02:08:48
发布于 2025-04-05 02:08:48
13400
代码可运行
举报
文章被收录于专栏:基因组基因组单细胞
运行总次数:0
代码可运行

前言

近几年,孟德尔随机化(Mendelian Randomization, MR) 方法在疾病因果推断研究中备受关注。MR利用基因变异作为工具变量,推断暴露因子与疾病之间的因果关系,避免传统观察性研究中的混杂因素影响。然而,MR通常在群体水平上进行分析,难以解析疾病在不同细胞类型中的作用机制。

为此,将疾病GWAS数据与单细胞RNA测序(scRNA-seq)数据相结合,可以帮助我们更精细地探究疾病的细胞类型特异性关联,揭示潜在的致病细胞群及分子机制。sc-DRS(Single-cell Disease Relevance Score) 正是这样一个强大的分析工具,能够基于GWAS基因集计算单细胞的疾病相关性评分(DRS),为探索疾病的细胞生物学基础提供新的思路。

scDRS的计算原理

图片来源:Zhang MJ, Hou K, Dey KK, et al. Polygenic enrichment distinguishes disease associations of individual cells in single-cell RNA-seq data. Nat Genet. 2022;54(10):1572-1580. doi:10.1038/s41588-022-01167-z

sc-DRS分析能得到什么结果?

识别与特定疾病相关的细胞群,揭示疾病的潜在细胞靶点

解析细胞亚型与疾病的相关性,探索特定细胞亚型在疾病进程中的作用

如何使用scDRS

1.下载scDRS包并进行安装

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git clone https://github.com/martinjzhang/scDRS.git
cd scDRS
pip install -e .

快速测试是否安装成功

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
python -m pytest tests/test_CLI.py -p no:warnings

2.下载使用测试数据

2.1 我们使用开发者提供的数据进行测试分析

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
wget https://figshare.com/ndownloader/files/34300925 -O data.zip
unzip data.zip && \
mkdir -p data/ && \
mv single_cell_data/test/* data/ && \
rm data.zip && rm -r single_cell_data/test/

加载需要的组件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import scdrs
import scanpy as sc
sc.set_figure_params(dpi=125)
from anndata import AnnData
from scipy import stats
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
import os
import warnings

warnings.filterwarnings("ignore")

3.数据加载和展示

使用sc-DRS进行分析需要三个文件:单细胞数据(h5ad);GWAS统计数据;协变量文件(.h5ad 单细胞数据的scDRS协变量文件)。具体文件格式和内容参考:https://martinjzhang.github.io/scDRS/file_format.html

3.1 这里,我们使用作者提供的单细胞数据(小鼠来源的单细胞测序数据)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
adata =  sc.read_h5ad("scDRS/data/expr.h5ad")

#改成自己下载的.h5ad文件所在路径

3.2 使用以下3个基因组数据作为GWAS统计数据

SCZ:从 GWAS 汇总统计数据中获得的精神分裂症 (SCZ) 基因集,这是本演示中感兴趣的疾病。

Dorsal:从 Cembrowski et al.2016 等人获得的背侧 CA1 锥体中的差异表达基因,我们将用它来构建背部评分,表明与背侧 CA1 的接近度,我们发现这有助于了解 SCZ 疾病富集的空间分布

Height:从 GWAS 汇总统计数据中获得的身高基因集,我们将其用作负控制特征。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
df_gs = pd.read_csv("single_cell_data/test/geneset.gs", sep="\t", index_col=0)`#改成自己下载的geneset.gs文件所在路径

df_gs = df_gs.loc[
    [
        "PASS_Schizophrenia_Pardinas2018",
        "spatial_dorsal",
        "UKB_460K.body_HEIGHTz",
    ],
    :,
].rename(
    {
        "PASS_Schizophrenia_Pardinas2018": "SCZ",
        "spatial_dorsal": "Dorsal",
        "UKB_460K.body_HEIGHTz": "Height",
    }
)
display(df_gs)

df_gs.to_csv("data/processed_geneset.gs", sep="\t")

作者在geneset.gs中提供了29个GWAS数据集,有兴趣的也可以选择其他数据集进行分析(只需要根据数据集中TRAIT的名字对 "PASS_Schizophrenia_Pardinas2018", "spatial_dorsal", "UKB_460K.body_HEIGHTz", 进行修改即可)。

此外,我们也可以根据自己想要研究的疾病准备GWAS数据集,我们会在下一篇章中进行讲解。

4.使用scdrs计算分数并评估疾病对不同细胞的富集程度

4.1 进行评分

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
scdrs compute-score \
    --h5ad-file /Users/han/scDRS/data/expr.h5ad \
    --h5ad-species mouse \
    --gs-file /Users/han/single_cell_data/test/processed_geneset_capitalized.gs \
    --gs-species mouse \
    --cov-file /Users/han/scDRS/data/cov.tsv \
    --flag-filter-data True \
    --flag-raw-count True \
    --flag-return-ctrl-raw-score False \
    --flag-return-ctrl-norm-score True \
    --out-folder /Users/han/single_cell_data/test/

#h5ad-file;gs-file;cov-file 需要更改相关文件所在路径。此外作者所使用的单细胞数据为小鼠来源的,因此h5ad-species为mouse,相关gs-species也需要相对应的改为mouse。大家需要根据自己所使用的数据样本来源进行更改。

4.2 可视化scDRS结果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    trait: pd.read_csv(f"single_cell_data/test/{trait}.full_score.gz", sep="\t", index_col=0)
    for trait in df_gs.index
}

for trait in dict_score:
    adata.obs[trait] = dict_score[trait]["norm_score"]

sc.set_figure_params(figsize=[3, 3], dpi=300)
sc.pl.umap(
    adata,
    color="level1class",
    ncols=1,
    color_map="RdBu_r",
    vmin=-5,
    vmax=5,
)

sc.pl.umap(
    adata,
    color=dict_score.keys(),
    color_map="RdBu_r",
    ncols=3,
    vmin=-5,
    vmax=5,
    s=20,
)

我们可以看到SCZ疾病主要富集在Pyramidal CA1细胞

如果需要直接保存图片可以在sc.pl.umap命令的最后一行中加上save="***.png"

5.分析疾病在不同细胞类型中的表达情况

5.1 对SCZ和Height在不同细胞间的表达进行评分

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
for trait in ["SCZ", "Height"]:
    !scdrs perform-downstream \
        --h5ad-file scDRS/data/expr.h5ad \
        --score-file single_cell_data/test/{trait}.full_score.gz \
        --out-folder single_cell_data/test/ \
        --group-analysis level1class \
        --flag-filter-data True \
        --flag-raw-count True

*同样的,需要更改数据所在的位置

5.2 查看SCZ在不同细胞中的表达情况:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
!cat single_cell_data/test/SCZ.scdrs_group.level1class | column -t -s $'\t'

5.3可视化疾病在不同细胞类型中的表达情况:

1.每种细胞类型-疾病对的热图颜色表示显著相关细胞的比例。

2.方块表示显著的细胞类型-疾病关联(FDR所有细胞类型和疾病/特征对中均为 0.05。

3.十字符号表示特定细胞类型内单个细胞之间与疾病相关的显著异质性。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
dict_df_stats = {
    trait: pd.read_csv(f"/Users/han/single_cell_data/test/{trait}.scdrs_group.level1class", sep="\t", index_col=0)
    for trait in ["SCZ", "Height"]
}

dict_celltype_display_name = {
    "pyramidal_CA1": "Pyramidal CA1",
    "oligodendrocytes": "Oligodendrocyte",
    "pyramidal_SS": "Pyramidal SS",
    "interneurons": "Interneuron",
    "endothelial-mural": "Endothelial",
    "astrocytes_ependymal": "Astrocyte",
    "microglia": "Microglia",
}

fig, ax = scdrs.util.plot_group_stats(
    dict_df_stats={
        trait: df_stats.rename(index=dict_celltype_display_name)
        for trait, df_stats in dict_df_stats.items()
    },
    plot_kws={
        "vmax": 0.2,
        "cb_fraction":0.12
    }
)


ax.grid(False) 

plt.show()

可以看到SCZ和Height在 CA1 pyramidal中的差异是最明显的。接下来,可以提取CA1 pyramidal细胞进行重新聚类,并进一步探究异质性的来源。

6.探索不同疾病或表型与某种细胞亚型的关系

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#提取 CA1 pyramidal并进行重新聚类
adata_ca1 = adata[adata.obs["level2class"].isin(["CA1Pyr1", "CA1Pyr2"])].copy()
sc.pp.filter_cells(adata_ca1, min_genes=0)
sc.pp.filter_genes(adata_ca1, min_cells=1)
sc.pp.normalize_total(adata_ca1, target_sum=1e4)
sc.pp.log1p(adata_ca1)

sc.pp.highly_variable_genes(adata_ca1, min_mean=0.0125, max_mean=3, min_disp=0.5)
adata_ca1 = adata_ca1[:, adata_ca1.var.highly_variable]
sc.pp.scale(adata_ca1, max_value=10)
sc.tl.pca(adata_ca1, svd_solver="arpack")

sc.pp.neighbors(adata_ca1, n_neighbors=10, n_pcs=40)
sc.tl.umap(adata_ca1, n_components=2)

# 匹配 scDRS 分数
for trait in dict_score:
    adata_ca1.obs[trait] = dict_score[trait]["norm_score"]
sc.pl.umap(
    adata_ca1,
    color=dict_score.keys(),
    color_map="RdBu_r",
    vmin=-5,
    vmax=5,
    ncols=3,
    s=20,
    save="Subgroup-Disease.png"
)

7.评估疾病与某种细胞之间的相关性

与之前的观察一致,SCZ 似乎在 CA1 的背侧部分富集。 当我们绘制 SCZ 疾病平均评分与背部五分位数的关系图时,这一点更加明显。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
df_plot = adata_ca1.obs[["Dorsal", "SCZ", "Height"]].copy()
df_plot["Dorsal quintile"] = pd.qcut(df_plot["Dorsal"], 5, labels=np.arange(5))

fig, ax = plt.subplots(figsize=(3.5, 3.5))
for trait in ["SCZ", "Height"]:
    sns.lineplot(
        data=df_plot,
        x="Dorsal quintile",
        y=trait,
        label=trait,
        err_style="bars",
        marker="o",
        ax=ax,
    )
ax.set_xticks(np.arange(5))
ax.set_xlabel("Dorsal quintile")
ax.set_ylabel("Mean scDRS disease score")
fig.show()

此外,我们可以将疾病评分和对照评分与背部评分进行相关性分析(Pearson)。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
spatial_col = "Dorsal"
for trait in ["SCZ", "Height"]:
    df_score = dict_score[trait].reindex(adata_ca1.obs.index)
    ctrl_cols = [col for col in df_score.columns if col.startswith("ctrl_norm_score")]
    n_ctrl = len(ctrl_cols)

    # Pearson's r between trait score and spatial score
    data_r = stats.pearsonr(df_score["norm_score"], adata_ca1.obs[spatial_col])[0]

    # Regression: control score ~ spatial score
    ctrl_r = np.zeros(len(ctrl_cols))
    for ctrl_i, ctrl_col in enumerate(ctrl_cols):
        ctrl_r[ctrl_i] = stats.pearsonr(df_score[ctrl_col], adata_ca1.obs[spatial_col])[
            0
        ]
    pval = (np.sum(data_r <= ctrl_r) + 1) / (n_ctrl + 1)

    print(f"{trait} v.s. {spatial_col}, Pearson's r={data_r:.2g} (p={pval:.2g})")

SCZ v.s. Dorsal, Pearson's r=0.43 (p=0.001) Height v.s. Dorsal, Pearson's r=0.04 (p=0.37)

总结

sc-DRS 提供了一种系统化的方法,将GWAS结果与单细胞转录组数据相结合,评估细胞与疾病的相关性。其主要功能包括:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
•	基于GWAS导出的基因集,为每个单细胞计算疾病相关性评分(Disease Relevance Score, DRS);
•	鉴定疾病富集的细胞亚群,揭示特定细胞在疾病发生发展中的作用;
•	支持不同疾病、多种组织、复杂细胞群体之间的系统性比较;
•	辅助发现潜在治疗靶点或生物标志物,加速疾病机制研究。

通过 sc-DRS,研究者能够更深入地理解复杂疾病的细胞类型特异性机制,为后续的功能验证、干预设计提供精准方向。这不仅拓展了GWAS研究的解释力,也推动了从遗传关联到细胞机制的研究转化。

*在使用教程的时候,我们注意到作者使用的单细胞数据是小鼠来源的,因此,使用的GWAS数据也被定义为小鼠来源,但实际上作者使用的GWAS数据是人类来源的,这样分析是否会对结果产生影响?

作者在文章的补充说明中对这个问题进行了答复: 我们主要使用小鼠 RNA 测序数据 (TMS FACS) 研究人类疾病和复杂性状,但人类和小鼠之间存在生物学差异。支持使用小鼠 RNA 测序数据研究人类疾病和复杂性状的论据包括

(1) 从小鼠获得高质量图谱级 scRNA 测序数据更容易,

(2) 我们的主要发现在人类数据中得到了复制,

(3) 我们仅评估了小鼠和人类之间具有 1:1 直系同源物的蛋白质编码基因,这些基因高度保守,

(4) 我们使用大量基因将细胞与疾病关联起来(1,000 个 MAGMA 推定疾病基因),最大限度地减少了由于单个基因在不同物种间表达差异而导致的潜在偏差(有关更多讨论,请参阅 Bryois 等人 30 和其他研究 26、28、29、38)。

然而,某些细胞类型可能在物种间保守性较低30,76(例如,我们对沿长轴和径向轴的 CA1 锥体神经元的研究结果(扩展数据图 8)似乎表明人类和小鼠之间的疾病关联模式不同), 从而促使进行涉及人类 scRNA-seq 数据的后续分析(包括我们在此处进行的分析)。

:若对内容有疑惑或者有发现明确错误的朋友,请联系后台(欢迎交流)。更多内容可关注公众号:生信方舟

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
方法分享--Spotiphy获取单细胞精度的空间数据(visium)
追风少年i
2025/03/14
530
方法分享--Spotiphy获取单细胞精度的空间数据(visium)
单细胞数据分析|差异表达分析
在对单细胞数据进行差异表达分析的时候,可以从全细胞和元细胞两个角度去考虑。基于全细胞目前常见的单细胞转录组计算差异表达基因方法有DESeq2、edgeR、limma、MAST、SCDE (Single Cell Differential Expression)、Seurat (FindMarkers)、Monocle ( differentialGeneTest)、t-SNE/PCA-based methods。其中Seurat和DESeq2是医学研究中最常用的两种方法。基于元细胞的方法有SC3 (Single-Cell Consensus Clustering)、MetaCell。
天意生信云
2025/01/22
1870
单细胞数据分析|差异表达分析
单细胞测序数据分析|手动注释
之前我们分享过单细胞自动注释包GPTtypecell的使用方法。今天我们详细介绍一下细胞类型注释的内容,并且学习手动注释是如何实现的。
天意生信云
2025/01/22
3000
单细胞测序数据分析|手动注释
整合单细胞和空转数据多种方法之Cell2location
除了我们上期介绍过的CellTrek算法【整合单细胞和空转数据多种方法之CellTrek】,还有非常多的算法用于整合单细胞和空转数据,如何快速系统的了解更多的主流整合算法呢?这么多种算法我们又应该选择哪种呢?答案是查阅综述+大量实践!
生信菜鸟团
2024/01/04
7.1K0
整合单细胞和空转数据多种方法之Cell2location
顶刊分享---单细胞RNA测序数据差异表达分析的moments framework方法
追风少年i
2024/10/28
3990
顶刊分享---单细胞RNA测序数据差异表达分析的moments framework方法
单细胞空间联合分析之SpatialScope
追风少年i
2024/04/15
1760
单细胞空间联合分析之SpatialScope
单细胞测序最好的教程(六):细胞类型注释
作者按 本教程将是本系列教程中最重要的一章,我们后续所有的单细胞分析,都要基于准确的细胞类型注释。本系列教程首发于“[单细胞最好的中文教程](single_cell_tutorial Readthedocs[1])”,未经授权许可,禁止转载。 全文字数|预计阅读时间: 4500|5min ——Starlitnightly
生信菜鸟团
2023/08/23
1.6K0
单细胞测序最好的教程(六):细胞类型注释
基于python的scanpy模块的乳腺癌单细胞数据分析
这次我们来复现一篇单细胞的文章。这篇我们只来复现细胞图谱和拟时序分析 像细胞通讯,还有富集分析还是很简单的。大家可以继续走下去,然后我们来交流讨论! 这篇全篇基于python复现。
生信技能树
2021/10/12
3.9K1
单细胞转录组实战04: infercnvpy识别恶性细胞
Infercnv is a scalable python library to infer copy number variation (CNV) events from single cell transcriptomics data.
生信探索
2023/02/12
2K1
python单细胞学习笔记-day7
今天继续学习视频:python_day6剩余部分和python_day7视频 !一口气学完吧!
生信技能树
2025/03/17
1100
python单细胞学习笔记-day7
空间单细胞转录组cell2location分析流程学习
Cell2location 是一个用于空间转录组学数据分析的工具。它是一个基于贝叶斯统计模型的Python包,旨在利用空间转录组数据和单细胞转录组数据来进行细胞类型的空间解构。通过将单细胞转录组数据中的细胞类型信息投射到空间转录组数据中,Cell2location 可以估算不同细胞类型在空间位置中的丰度分布。
凑齐六个字吧
2024/10/21
2250
空间单细胞转录组cell2location分析流程学习
单细胞测序最好的教程(十):万能的Transformer与细胞注释
迁移注释实际上是自动注释的一类,与我们在3-4中介绍的自动注释不同,迁移注释需要我们有一个已经注释好的单细胞测序数据文件,而不是训练好的模型或者marker。我们需要使用这个已经注释好的单细胞测序数据文件来训练一个新的模型,例如Cell-Blast或者是Tosica等。
生信技能树jimmy
2023/09/09
1.6K0
单细胞测序最好的教程(十):万能的Transformer与细胞注释
单细胞转录组实战06: pySCENIC转录因子分析(可视化)
![生信交流与合作请关注公众号@生信探索](https://files.mdnice.com/user/38387/a8e0a2ed-ea22-4f3f-924e-881260dd9a2e.png)
生信探索
2023/02/22
3K0
单细胞测序最好的教程(十三):你真的做对过干预后细胞分析吗?
在前面的分析教程中,我们详细研究了“不同处理下细胞的差异表达基因”,“不同处理下细胞的组成变化”。实际上,我们还会关心一个很直接的问题,那就是不同处理下,究竟什么细胞受到的影响最大。可能你会说,观察差异表达基因的数量,或者观察哪一类细胞变多了,又或者是对差异表达基因进行通路富集分析去评价通路变化。这两个思路是都是间接去反映细胞的状态,但我们希望有一个直接的评价指标,去评估不同处理后细胞的影响大小。
生信技能树
2024/01/11
1.8K0
单细胞测序最好的教程(十三):你真的做对过干预后细胞分析吗?
Nat Genetics|单细胞、单核、VDJ、空间构建肺全图谱和免疫生态位
肺脏除了拥有气体交换功能外,还具有重要的屏障功能,对人体健康至关重要。肺脏功能异常可引起肺部疾病。目前,肺部疾病在全球死亡原因中排名第三,全面了解界定肺功能的细胞和微环境对于治疗肺部疾病十分重要。
追风少年i
2023/07/10
4010
Nat Genetics|单细胞、单核、VDJ、空间构建肺全图谱和免疫生态位
Cell2location分析:the human lymph node数据探索
cell2location的原理图:cell2location是一个分层贝叶斯模型,需要使用单细胞数据作为参考,对空间转录组数据进行解卷积。
生信菜鸟团
2024/05/30
6620
Cell2location分析:the human lymph node数据探索
内容复习----visium分析hotspot与空间密度图
追风少年i
2025/04/08
1090
内容复习----visium分析hotspot与空间密度图
单细胞测序最好的教程(十一):差异表达基因分析|或许比pseudobulk更优
我们在前面注释的章节中,研究了不同细胞的特异性marker(标记)基因,但很多时候,我们更关心在某一类细胞中,两种不同状态下的组别差异,例如药物治疗与未经药物治疗,肿瘤细胞与正常细胞(癌旁)细胞等。因此,我们希望能在单细胞水平上,进行差异表达分析。
生信技能树jimmy
2024/01/05
13.3K0
单细胞测序最好的教程(十一):差异表达基因分析|或许比pseudobulk更优
空间转录组数据注释分析:Cell2location反卷积(Nature Biotechnology IF: 33.1)
这个方法需要性能比较高的计算资源配置,如果有GPU显卡会大大的缩短运行建模的时间,如果你没有,可以考虑生信技能树的共享服务器,只要800一年,内存2T,配置20G显卡,购买详情可看:满足你生信分析计算需求的低价解决方案
生信技能树
2025/04/02
1590
空间转录组数据注释分析:Cell2location反卷积(Nature Biotechnology IF: 33.1)
课前准备---HD数据结合图像识别获取真实的空间单细胞级数据
追风少年i
2024/07/03
1930
课前准备---HD数据结合图像识别获取真实的空间单细胞级数据
推荐阅读
相关推荐
方法分享--Spotiphy获取单细胞精度的空间数据(visium)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验