当前位置: 首页 > article >正文

Nature Communications 单细胞算法 scDist,教你怎么找到重要的细胞亚群与基因!

生信碱移

scDist: 寻找关键细胞亚群与基因的方法

单细胞RNA测序(scRNA-seq)使我们能够研究受药物治疗、感染以及癌症等疾病中关键的细胞亚群。为了找到可能影响疾病的细胞亚群乃至基因,我们常常去比较两个或多个组之间显著差异的细胞类型。这里"显著差异"的定义可以是不同方面的,总结成两种

  • 细胞比例差异,如 DA-seq、Milo和Meld,侧重于识别在不同条件下比例变化的细胞类型;

  • 细胞状态差异,与细胞比例相反,旨在检测在不同条件下具有不同转录组特征的细胞类型。常见的做法是使用不同条件下差异表达基因的数量来评估某种细胞亚群状态的转录状态变化,当然也有一些相关算法被开发出来比如 Augur

直觉上看,基于转录表达状态的细胞状态方法似乎更合理。之前比较有名的算法Augur,通过训练一个分类器,从表达数据中预测条件标签,然后使用ROC曲线下面积作为指标对细胞类型进行排名。尽管如此,Augur并未考虑个体间的变异性,这可能会混淆扰动细胞类型的排名。来自美国新墨西哥大学的研究者使用六个健康对照者的血液scRNA-seq数据演示了这个现象。通过将六个健康对照者的样本随机分为两组,生成一个假的对照数据集,逻辑上讲算法不应该检测到任何细胞类型的差异。但他们的实验结果表明,在20次随机重复中,93%的细胞类型AUC均大于0.5,红细胞(RBCs)在所有20次试验中均被识别有意义的细胞。

图片

▲ 模拟实验结果:理论上讲每种细胞AUC应该都在0.5附近,因为分组是假的。但是实际上,RBC的平均AUC甚至可以超过0.7.

图片

▲ DOI:10.1038/s41467-024-51649-3

为此,他们开发了一种基于混合效应模型算法scDist,于今年9月1号发表于Nature Communications[IF:14.7]杂志。简单来讲,scDist估计每种细胞类型在高维基因表达空间(如PCA降维空间)中条件均值之间的距离,并采用线性混合效应模型来考虑不同样本和其他技术潜在的变异性。除了找到不同条件下变化最大的细胞亚群,作者还根据主成分回归的beta值与基因在主成分的载荷乘积定义了特定细胞中的基因重要性(基因-->主成分-->条件差异)。

图片

▲ scDist的原理。

小编将在下文简单介绍一下scDist的使用,感兴趣的铁子可以阅读原文或者在下方链接进一步查看:

  • https://github.com/phillipnicol/scDist

0.R包的安装与引用

可以使用下方注释代码安装该包,当然本文还使用了其它包(自行安装):

#devtools::install_github("phillipnicol/scDist")

library(dplyr)
library(Seurat) # v4版本
library(scDist)
library(ggplot2)
library(ggpubr)

1.数据的加载

先读取以下数据,走一下标准的seurat流程。需要注意的是,尽管该方法scDist与任何归一化方法兼容,但作者建议使用scTransform进行归一化

af <- readRDS("af.rds")
af <- SCTransform(af, vars.to.regress = "percent.mt", verbose = FALSE)
af <- RunPCA(af, verbose = FALSE)
af <- RunUMAP(af, dims = 1:30, verbose = FALSE)
af <- FindNeighbors(af, dims = 1:30, verbose = FALSE)
af <- FindClusters(af, verbose = FALSE, resolution = 0.05)
DimPlot(af, label = TRUE)

图片

▲ 示例数据的初步分群。

2.执行scDist分析

① 首先从seurat对象af中提取数据构建一个列表sim

sim <- list(Y=af@assays$SCT@scale.data %>% as.data.frame(),
            meta.data=af@meta.data %>% as.data.frame())
            
# 看一下数据的长相
dim(sim$Y) #Normalized counts
#[1]  3000 18497

head(sim$meta.data)
#                           orig.ident nCount_RNA nFeature_RNA  Type percent.mt percent.rb nCount_SCT nFeature_SCT SCT_snn_res.0.05 seurat_clusters
#AAACATCGAACGCTTACGAACTTA_1      cABMR       1965          789 cABMR   2.340967  1.1195929       1328          757                1               1
#AAACATCGAATCCGTCCCTAATCC_1      cABMR       4828         1558 cABMR   8.243579  5.1367026       1334          681                4               4
#AAACATCGAATGTTGCGATGAATC_1      cABMR       1029          489 cABMR   1.068999  1.1661808       1028          489                1               1
#AAACATCGACACGACCCCGACAAC_1      cABMR       1448          680 cABMR   1.933702  2.4861878       1237          680                1               1
#AAACATCGACAGCAGATGGTGGTA_1      cABMR       7451         2137 cABMR   9.126292 13.7699638       1273          575                4               4
#AAACATCGACCACTGTGTCTGTCA_1      cABMR       1059          457 cABMR   3.493862  0.7554297       1049          457                1               1

② 执行scDist分析,需要根据自己数据设置的参数有d, fixed.effects, random.effects, clusters(仔细看我的注释):

out <- scDist(normalized_counts = sim$Y, # 标准化的数据矩阵
              meta.data = sim$meta.data, # metadata表格
              d = 20, # 指定用于PCA分析的维度数量为前20
              fixed.effects = "orig.ident", # 你感兴趣的分组条件,对应metadata表格中的列名称
              random.effects = c(),  # 需要去除的潜在的影响因素,比如不同的样本、年龄、批次等等,对应metadata表格中的列名称
              clusters="seurat_clusters" # 待分析的细胞类型,对应metadata表格中的列名称
              )

③ 可视化分析结果,首先是看看不同细胞类型的在分组间的距离得分:

p <- DistPlot(out, return.plot = TRUE)
p + theme_bw()

图片

▲ 细胞类型的分组距离得分。

随后可以评估一下基因的重要性,通过out$vals对象中的载荷以及beta值相乘计算。这个计算过程包装在distGenes函数,需要使用cluster参数指定要分析的细胞:

distGenes(out, cluster = "4") # 指定4这一群细胞
df <- data.frame(value = out$vals[[cluster]]$beta.hat, 
                 label = out$gene.names) %>% top_n(20, abs(value)) # 可视化前20个
df$color <- ifelse(df$value>0, "Positive", "Negative")
ggbarplot(df,
          x="label", 
          y="value", 
          fill = "color",
          color = "white",
          palette = "npg",
          sort.val = "asc",
          sort.by.groups = FALSE,
          xlab = "",
          legend.title = "")+ theme_bw() + ylab("Condition difference") + coord_flip()

图片

▲ 指定亚群4中的基因重要性得分。

简单分享到这各位老哥老姐

欢迎关注


http://www.kler.cn/a/289981.html

相关文章:

  • INQUIRE:一个包含五百万张自然世界图像,涵盖10,000个不同物种的专为专家级文本到图像检索任务设计的新型基准数据集。
  • JS 实现SSE通讯和了解SSE通讯
  • 【ChatGPT】 如何让ChatGPT分析数据并得出结论
  • Unity3D学习FPS游戏(12)敌人检测和攻击玩家
  • Unity3D学习FPS游戏(11)敌人AI巡逻(NavMesh)
  • 翼鸥教育:从OceanBase V3.1.4 到 V4.2.1,8套核心集群升级实践
  • 代码分支合并 rebase merge区别
  • OpenCV绘图函数(13)绘制多边形函数函数polylines()的使用
  • QT+OSG+osg-earth显示一个球
  • 智能电网中巡检机器人的信息安全技术应用
  • VMware Workstation 17.6 Pro 发布下载,新增功能概览
  • AI学习记录 - 对抗性神经网络
  • 企业架构的概念及发展历程简述(附TOGAF架构理论学习资料下载链接)
  • macos安装ArgoCD
  • linux nc
  • 【Altium Designer脚本开发】——PCB平面绕组线圈 V1.4
  • 河南建筑智能化设计专项资质延期流程说明
  • 力扣2503.矩阵查询可获得的最大分数
  • 超声波清洗机有没有平价又好用的推荐?高性价比的眼镜清洗机推荐
  • 百度飞将 paddle ,实现贝叶斯神经网络 bayesue neure network bnn,aistudio公开项目 复现效果不好
  • 语言质量评估对欧洲游戏推广的重要性
  • 阿凡达2.0直播模式来了,数字人直播行业迎来浴火重生!
  • django企业开发实战-学习小结
  • 活动系统开发之采用设计模式与非设计模式的区别-数据库设计及代码设计
  • LeetCode37 解数独
  • 【Steam游戏星露谷物语添加Mod步骤】