手把手教你用sc-DRS分析单细胞数据:从GWAS到细胞类型特异性疾病关联
手把手教你用sc-DRS分析单细胞数据从GWAS到细胞类型特异性疾病关联你是否曾对着一堆全基因组关联研究GWAS的基因列表和一张张单细胞转录组图谱感到困惑我们知道了哪些基因与疾病相关但这些关联究竟发生在哪个具体的细胞群体里是神经元在“捣乱”还是免疫细胞在“煽风点火”传统的群体水平分析像是一张模糊的卫星地图而sc-DRSSingle-cell Disease Relevance Score则像是一台高精度显微镜它能将GWAS的遗传信号精准地投射到单细胞分辨率的图谱上告诉你疾病风险的“热点”具体藏在哪些细胞里。对于生物信息学的研究者和临床科学家来说掌握这套分析流程意味着能从海量的组学数据中挖掘出更具生物学意义和转化潜力的洞见。这篇文章我将以一个实践者的视角带你从零开始一步步走通sc-DRS的完整分析流程并分享我在实战中遇到的那些“坑”和解决技巧。1. 理解核心为什么需要sc-DRS以及它解决了什么问题在深入代码之前我们得先搞清楚手里的“武器”是用来对付什么“敌人”的。GWAS研究已经成功鉴定了成千上万个与复杂疾病如精神分裂症、阿尔茨海默病、自身免疫疾病相关的遗传位点。但这些位点大多位于非编码区其功能机制晦涩不明。一个核心问题是这些遗传风险是如何通过影响特定细胞类型的功能最终导致疾病表型的sc-DRS的出现正是为了弥合群体遗传学与单细胞生物学之间的鸿沟。它的核心思想非常直观如果一个细胞高表达与某种疾病强相关的基因集合来自GWAS那么这个细胞本身就更可能与这种疾病的病理过程相关。sc-DRS算法会为数据集中的每一个细胞计算一个疾病相关性评分DRS分数越高表明该细胞携带的疾病遗传风险信号越强。注意sc-DRS计算的不是基因的表达量而是基于疾病相关基因集的“富集”程度。它依赖于预先从GWAS数据中通过MAGMA等工具推断出的疾病相关基因列表。与简单的基因集富集分析GSEA不同sc-DRS在设计上巧妙地规避了细胞周期、批次效应等混杂因素的影响。它通过构建随机背景基因集对照评分来对原始评分进行标准化使得结果更加稳健可靠。理解这一点对于后续解读结果至关重要。2. 实战准备环境、数据与工具链的搭建工欲善其事必先利其器。sc-DRS的运行依赖于一个完整的Python生物信息学分析环境。我强烈建议使用conda或mamba来管理环境以避免令人头疼的依赖冲突。2.1 创建并激活专用环境首先我们创建一个名为scdrs_env的独立Python环境并安装核心依赖。# 使用conda创建环境指定Python版本为3.9与sc-DRS兼容性较好 conda create -n scdrs_env python3.9 -y conda activate scdrs_env # 安装生物信息学分析常用基础包 conda install -c conda-forge -c bioconda scanpy numpy pandas scipy matplotlib seaborn jupyter -y2.2 安装sc-DRS包官方推荐通过pip从GitHub仓库直接安装开发版本以确保获得最新功能和修复。# 克隆仓库并安装 git clone https://github.com/martinjzhang/scDRS.git cd scDRS pip install -e .安装完成后运行一个简单的测试命令来验证安装是否成功python -m pytest tests/test_CLI.py -p no:warnings -v如果看到所有测试用例都通过PASSED恭喜你环境搭建成功。如果遇到报错最常见的问题是某些C依赖编译失败。此时可以尝试先升级pip和setuptools或者查阅仓库的Issue页面寻找解决方案。2.3 准备分析所需的三类关键数据一次完整的sc-DRS分析需要三类输入文件缺一不可。下面这个表格清晰地概括了它们的用途和格式要求文件类型描述典型格式获取/准备方式单细胞表达矩阵包含所有细胞基因表达量的核心数据需经过基本预处理质控、归一化、降维。.h5ad(AnnData对象)由scanpy生成或转换。必须包含X矩阵和obs、var注释。疾病基因集文件从GWAS汇总统计中推断出的、与目标疾病显著相关的基因列表。.gs文本文件使用MAGMA等工具处理GWAS数据生成或从官方资源如PASCAL、FUMA下载。协变量文件用于校正技术噪音和生物混杂因素的变量如测序深度、细胞周期评分、线粒体基因占比等。.tsv文本文件从单细胞数据adata.obs中提取相关列生成。对于初学者我强烈建议先从官方提供的示例数据开始。这能帮你快速熟悉流程并验证你的环境配置是否正确。# 下载并解压示例数据 wget https://figshare.com/ndownloader/files/34300925 -O data.zip unzip data.zip mkdir -p scdrs_data mv single_cell_data/test/* scdrs_data/ rm -r single_cell_data/ data.zip示例数据包中已经包含了处理好的小鼠大脑单细胞数据expr.h5ad、精神分裂症SCZ等基因集文件geneset.gs以及协变量文件cov.tsv。我们可以直接用它来跑通第一个流程。3. 核心流程详解计算疾病相关性评分与可视化现在让我们进入最激动人心的环节运行sc-DRS并亲眼看看疾病信号在细胞图谱上是如何分布的。3.1 加载数据与基因集首先在Jupyter Notebook或Python脚本中我们加载必要的库和数据。import scdrs import scanpy as sc import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns sc.set_figure_params(dpi150, frameonFalse) # 忽略警告信息让输出更清晰调试时可关闭 import warnings warnings.filterwarnings(ignore) # 加载单细胞数据 adata sc.read_h5ad(scdrs_data/expr.h5ad) print(f数据集形状: {adata.shape}) # 查看细胞和基因数 print(f观察到的细胞类型: {adata.obs[level1class].unique()})接下来加载并查看基因集文件。示例文件中包含了多个性状的基因集我们需要选择自己关心的疾病。# 加载基因集文件 df_gs pd.read_csv(scdrs_data/geneset.gs, sep\t, index_col0) print(可用的基因集列表:) print(df_gs.index.tolist()[:10]) # 打印前10个 # 选择我们想分析的疾病例如精神分裂症(SCZ)和作为对照的身高(Height) selected_traits [PASS_Schizophrenia_Pardinas2018, UKB_460K.body_HEIGHTz] df_gs_selected df_gs.loc[selected_traits].rename( {PASS_Schizophrenia_Pardinas2018: SCZ, UKB_460K.body_HEIGHTz: Height} ) df_gs_selected.to_csv(scdrs_data/my_geneset.gs, sep\t)3.2 运行scdrs compute-score命令这是计算DRS的核心步骤。我们将使用命令行接口CLI来调用因为它更清晰也便于嵌入到工作流脚本中。请务必将文件路径替换为你自己的实际路径。scdrs compute-score \ --h5ad-file ./scdrs_data/expr.h5ad \ --h5ad-species mouse \ --gs-file ./scdrs_data/my_geneset.gs \ --gs-species mouse \ --cov-file ./scdrs_data/cov.tsv \ --flag-filter-data True \ --flag-raw-count True \ --flag-return-ctrl-norm-score True \ --out-folder ./scdrs_results/关键参数解析--h5ad-species/--gs-species: 指定物种。这是新手最容易出错的地方必须根据你的数据来源正确设置human或mouse。物种信息用于基因名匹配如人类基因符号是TP53小鼠是Trp53。--flag-raw-count: 如果你的adata.X存储的是原始UMI计数设为True如果是log转换后的值设为False。--flag-return-ctrl-norm-score: 强烈建议设为True它会输出经过对照标准化后的分数结果更可靠。--out-folder: 指定结果输出目录。运行成功后你会在输出目录下看到每个性状如SCZ.full_score.gz的结果文件里面包含了每个细胞的原始评分、对照评分和标准化评分。3.3 将评分整合回单细胞对象并可视化现在我们把计算好的疾病评分添加回AnnData对象的obs中以便用scanpy进行可视化。# 将评分加载到adata中 traits [SCZ, Height] for trait in traits: score_df pd.read_csv(f./scdrs_results/{trait}.full_score.gz, sep\t, index_col0) # 将标准化评分作为新的一列加入obs adata.obs[trait _norm_score] score_df[norm_score] # 使用UMAP可视化细胞类型和疾病评分 fig, axes plt.subplots(1, 3, figsize(15, 4)) sc.pl.umap(adata, colorlevel1class, axaxes[0], showFalse, titleCell Type) sc.pl.umap(adata, colorSCZ_norm_score, axaxes[1], showFalse, titleSCZ Score, cmapRdBu_r, vcenter0) sc.pl.umap(adata, colorHeight_norm_score, axaxes[2], showFalse, titleHeight Score, cmapRdBu_r, vcenter0) plt.tight_layout() plt.show()在生成的UMAP图上你应该能看到细胞按类型聚类。重点关注疾病评分SCZ的图暖色红色代表高疾病相关性评分的细胞冷色蓝色代表低评分细胞。如果疾病信号具有细胞类型特异性你会看到颜色在某些细胞簇中明显富集。而作为阴性对照的“身高”性状其评分通常应该呈现随机或均匀分布没有明显的簇状富集模式。4. 进阶分析与结果解读从评分到生物学洞见拿到漂亮的染色UMAP图只是第一步更重要的是如何从这些评分中提取出有统计意义和生物学意义的结论。sc-DRS提供了下游分析工具来帮助我们。4.1 评估疾病在不同细胞类型中的富集程度我们需要回答SCZ的评分在哪种细胞类型中显著高于其他类型这可以通过scdrs perform-downstream命令来实现。# 对SCZ进行下游群体水平分析 scdrs perform-downstream \ --h5ad-file ./scdrs_data/expr.h5ad \ --score-file ./scdrs_results/SCZ.full_score.gz \ --out-folder ./scdrs_downstream/ \ --group-analysis level1class \ --flag-filter-data True \ --flag-raw-count True运行后查看生成的结果文件# 查看SCZ在不同细胞类型中的统计结果 column -t -s $\t ./scdrs_downstream/SCZ.scdrs_group.level1class输出表格会包含每个细胞类型的平均评分、p值、错误发现率FDR等关键统计量。重点关注FDR 0.05的细胞类型它们被认为是疾病显著富集的细胞群。4.2 可视化群体水平统计结果我们可以用更直观的热图来展示多个疾病/性状在不同细胞类型中的富集情况。# 加载SCZ和Height的下游分析结果 dict_df_stats {} for trait in [SCZ, Height]: df pd.read_csv(f./scdrs_downstream/{trait}.scdrs_group.level1class, sep\t, index_col0) dict_df_stats[trait] df # 绘制统计热图 fig, ax scdrs.util.plot_group_stats( dict_df_statsdict_df_stats, plot_kws{vmax: 0.25, cb_fraction: 0.1} ) ax.set_title(Disease Enrichment Across Cell Types) plt.show()在这张热图中每个方格的颜色深度代表该细胞类型-疾病对的富集显著性如 -log10(p-value)。实心方块表示经过多重检验校正后依然显著的关联例如FDR 0.05。十字标记表示在该细胞类型内部细胞间的疾病评分存在显著的异质性。这提示我们即使在同一类细胞中也可能存在功能状态不同的亚群与疾病关联。4.3 深入挖掘在疾病富集细胞亚群内进行再分析假设我们发现“Pyramidal CA1”神经元与SCZ强烈相关下一步自然是想知道是所有的CA1锥体神经元都相关还是其中特定的某个亚群这需要我们将该细胞亚群提取出来重新进行聚类和评分可视化。# 1. 提取CA1锥体神经元亚群 ca1_mask adata.obs[level2class].str.contains(CA1Pyr) # 根据你的注释列名调整 adata_ca1 adata[ca1_mask].copy() # 2. 对该亚群进行标准化的单细胞分析流程重新聚类 sc.pp.normalize_total(adata_ca1, target_sum1e4) sc.pp.log1p(adata_ca1) sc.pp.highly_variable_genes(adata_ca1) adata_ca1 adata_ca1[:, adata_ca1.var.highly_variable] sc.pp.scale(adata_ca1, max_value10) sc.tl.pca(adata_ca1) sc.pp.neighbors(adata_ca1) sc.tl.umap(adata_ca1) sc.tl.leiden(adata_ca1, resolution0.5) # 聚类得到新的亚群标签 # 3. 将之前计算的疾病评分映射到这个新的adata_ca1对象上 # 因为细胞ID没变可以直接赋值 for trait in traits: adata_ca1.obs[trait _norm_score] adata.obs.loc[adata_ca1.obs.index, trait _norm_score] # 4. 可视化亚群内的疾病评分分布 sc.pl.umap(adata_ca1, color[leiden, SCZ_norm_score, Height_norm_score], cmapRdBu_r, vcenter0, ncols3, frameonFalse, size30)通过这个“放大镜”式的分析你可能会发现疾病信号只富集在CA1神经元中的某一个或几个转录组亚簇中。这为进一步的实验验证例如利用空间转录组或免疫荧光染色定位这些亚簇提供了极其精确的假设。5. 处理自己的数据从原始GWAS到定制基因集教程数据跑通了但我们的目标是分析自己关注的疾病。这需要你从头开始准备疾病基因集文件.gs文件。整个过程可以概括为以下几个关键步骤获取GWAS汇总统计数据从公开数据库如GWAS Catalog、UK Biobank或你所在领域的特定联盟获取。文件通常是.tsv或.txt格式包含SNP位点、p值、效应值等信息。使用MAGMA进行基因水平分析这是最常用且被sc-DRS官方推荐的方法。MAGMA会将SNP水平的p值聚合到基因水平并考虑基因的连锁不平衡结构和基因长度。# 这是一个简化的MAGMA命令示例实际使用时需要参考MAGMA文档准备注释文件和参考面板 magma --bfile [参考基因型数据] --pval [GWAS文件] gene-annot --out [输出前缀] magma --gene-results [上一步输出] --gene-covar [基因协变量文件] --model directionpositive --out [最终结果前缀]生成sc-DRS格式的基因集文件MAGMA输出的结果文件中会有一个包含基因名和p值的列表。你需要将其转换为sc-DRS要求的格式一个制表符分隔的文件第一列是性状名称第二列是基因名列表用逗号分隔。# 假设magma_df是MAGMA结果DataFrame包含GENE和P列 # 选择p值最显著的N个基因例如Top 1000 top_genes magma_df.nsmallest(1000, P)[GENE].tolist() # 创建.gs文件格式的DataFrame gs_data {TRAIT: [MY_DISEASE], GENESET: [,.join(top_genes)]} gs_df pd.DataFrame(gs_data) gs_df.to_csv(my_disease.gs, sep\t, indexFalse)提示基因集的大小基因数量会影响结果的敏感性和特异性。通常使用Top 1000个基因是一个合理的起点但你可以尝试不同的阈值如Top 500, Top 2000观察结果的稳健性。同时准备一个已知与你的疾病无关的性状如身高作为阴性对照对于评估分析的特异性至关重要。6. 避坑指南与最佳实践结合我多次运行sc-DRS的经验这里总结几个常见的“坑”和应对策略物种不匹配错误这是最高频的错误。确保--h5ad-species和--gs-species参数与你数据的真实物种一致。如果你的单细胞数据是小鼠的但GWAS基因集是人类基因名你需要一个可靠的同源基因映射表进行转换。sc-DRS内部会尝试自动映射但手动检查映射率是很好的习惯。内存不足处理大型单细胞数据集10万个细胞时compute-score步骤可能消耗大量内存。如果遇到内存错误可以尝试以下方法在计算前对细胞进行下采样。增加服务器的物理内存或使用云计算资源。检查是否有其他进程占用内存。协变量选择协变量文件cov.tsv用于校正不感兴趣的变异源。常见的协变量包括每个细胞的总计数n_counts检测到的基因数n_genes线粒体基因百分比percent_mito细胞周期评分S_score,G2M_score实验批次如果有的话 合适的协变量可以消除技术噪音突出生物学信号。但过度校正例如加入与疾病高度相关的生物协变量也可能抹掉真实的信号。需要根据你的科学问题谨慎选择。结果解读的误区sc-DRS的高评分并不直接等同于该细胞“导致”了疾病。它只表明该细胞的基因表达模式与疾病遗传风险信号有更高的相关性。这种相关性可能源于病因也可能是疾病的结果即反应性变化。解读时必须结合先验生物学知识并需要通过后续的功能实验进行验证。最后别忘了可视化是你的得力助手。除了UMAP还可以将疾病评分投射到细胞注释的箱线图、小提琴图上直观比较不同细胞类型间的评分差异。也可以将评分与细胞的关键基因表达量进行相关性分析寻找驱动高评分的关键分子。整个流程走下来你会发现sc-DRS更像是一个强大的“探针”它将宏大的遗传学发现与精细的细胞生物学图像连接了起来。我最初在分析一个自身免疫疾病数据集时sc-DRS清晰地指出了一个稀有的免疫细胞亚群是遗传风险的主要承载者这个发现后来被我们团队的流式细胞术实验所证实。这种从计算预测到实验验证的闭环正是生物信息学分析最令人着迷的地方。开始动手吧你的数据里可能也藏着等待被发现的秘密。

相关新闻

实测才敢推!专科生专属降AIGC平台 —— 千笔·专业降AIGC智能体

实测才敢推!专科生专属降AIGC平台 —— 千笔·专业降AIGC智能体

在AI技术迅速渗透学术写作领域的当下,越来越多的专科生开始借助AI工具提升论文撰写效率。然而,随着知网、维普等查重系统对AI生成内容的识别能力不断增强,论文中的“AI痕迹”也成了影响成绩的关键因素。许多学生在使用各类降AI率和降重复率工…

2026/7/4 0:21:54 阅读更多 →
深度测评!自考必备的AI论文写作神器 —— 千笔AI

深度测评!自考必备的AI论文写作神器 —— 千笔AI

你是否曾为论文选题而烦恼?是否在写到一半时突然卡壳,毫无头绪?又或者反复修改却总感觉表达不够专业?对于自考学生来说,论文写作不仅是学业的挑战,更是时间与精力的考验。面对查重率、格式规范、文献检索等…

2026/7/4 9:28:02 阅读更多 →
Qwen3-VL:30B模型应用:智能客服知识库构建

Qwen3-VL:30B模型应用:智能客服知识库构建

Qwen3-VL:30B模型应用:智能客服知识库构建 1. 引言 想象一下这样的场景:一位客户上传了一张产品故障图片,客服系统不仅能准确识别图片中的问题,还能结合历史对话记录,给出专业的解决方案。这不是科幻电影中的情节&am…

2026/5/17 12:02:06 阅读更多 →

最新新闻

贝叶斯决策实战:从最小错误到最小风险,如何为你的AI模型选择最优策略?

贝叶斯决策实战:从最小错误到最小风险,如何为你的AI模型选择最优策略?

1. 贝叶斯决策:从直觉到数学公式第一次听说贝叶斯决策时,我正坐在工位上调试一个图像分类模型。当时遇到一个奇怪的现象:模型在测试集上准确率很高,但实际部署时总把一些重要客户照片误分类。主管走过来看了一眼说:&qu…

2026/7/5 12:07:44 阅读更多 →
SVM 核技巧实战:3步验证自定义核函数正定性(附Gram矩阵代码)

SVM 核技巧实战:3步验证自定义核函数正定性(附Gram矩阵代码)

SVM核函数实战:从零验证自定义核的正定性(附Python代码)引言在机器学习领域,支持向量机(SVM)因其出色的分类性能而广受青睐。但当面对非线性可分数据时,传统的线性SVM就显得力不从心。核技巧&am…

2026/7/5 12:07:44 阅读更多 →
Simulink RL Agent 模块实战:5步连接物理模型与DDPG智能体

Simulink RL Agent 模块实战:5步连接物理模型与DDPG智能体

Simulink RL Agent 模块实战:5步连接物理模型与DDPG智能体在工业控制和机器人领域,将物理系统模型与强化学习算法相结合已成为实现智能控制的重要途径。MATLAB/Simulink平台凭借其强大的建模能力和与强化学习工具箱的无缝集成,为工程师提供了…

2026/7/5 12:07:44 阅读更多 →
大模型训练实战:从入门到部署的完整指南

大模型训练实战:从入门到部署的完整指南

1. 大模型训练入门:为什么每个程序员都应该掌握这项技能 2026年的技术圈,不会训练大模型就像2010年不会写网页一样尴尬。我花了三个月从零开始啃下这块硬骨头,现在可以负责任地告诉你:训练自己的大模型没有想象中那么难&#xff0…

2026/7/5 12:05:44 阅读更多 →
TensorFlow模型优化:量化感知训练与剪枝实战指南

TensorFlow模型优化:量化感知训练与剪枝实战指南

1. 为什么需要量化感知训练和剪枝在移动端和嵌入式设备上部署深度学习模型时,我们常常面临两个核心挑战:模型体积过大和计算资源受限。一个典型的ResNet-50模型参数规模超过90MB,在树莓派这类设备上运行需要数秒的推理时间。这直接催生了模型…

2026/7/5 12:05:44 阅读更多 →
7个核心功能解析:WindowsCleaner如何彻底解决C盘空间不足问题

7个核心功能解析:WindowsCleaner如何彻底解决C盘空间不足问题

7个核心功能解析:WindowsCleaner如何彻底解决C盘空间不足问题 【免费下载链接】WindowsCleaner Windows Cleaner——专治C盘爆红及各种不服! 项目地址: https://gitcode.com/gh_mirrors/wi/WindowsCleaner WindowsCleaner是一款专为Windows系统设…

2026/7/5 12:03:43 阅读更多 →

日新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻