单细胞分析(20)——inferCNV分析

InferCNV分析笔记

1. 分析目标

InferCNV(Inference of Copy Number Variations)是一种基于单细胞转录组数据推断**拷贝数变异(CNV)**的方法,推测其基因组变异情况。


2. 数据准备

2.1 载入数据

library(Seurat)
setwd(here::here())  # 设置工作目录
scRNA1 = readRDS('./scRNA_harmony_EP.rds')
  • 载入单细胞RNA测序数据(已经过 Harmony 校正)。
  • scRNA1Seurat 对象,包含元数据和表达矩阵。

2.2 选择分析细胞

2.2.1 细胞类型定义
library(dplyr)meta_data <- scRNA1@meta.data %>%mutate(cell_type = case_when(RNA_snn_res.0.6 %in% c("8", "18") ~ "Normal",  # 参考细胞(正常/免疫)TRUE ~ "Tumor"  # 观测细胞(肿瘤)))
  • 正常细胞:RNA_snn_res.0.6 细胞亚群 8、18(参考细胞)。
  • 肿瘤细胞:其余亚群。
2.2.2 仅对肿瘤细胞进行采样,保留所有参考细胞
# 提取细胞名称
tumor_cells <- meta_data %>% filter(cell_type == "Tumor") %>% pull(rownames)
normal_cells <- meta_data %>% filter(cell_type == "Normal") %>% pull(rownames)# 对肿瘤细胞进行随机采样(最多3000个)
set.seed(123)
tumor_sample <- sample(tumor_cells, min(3000, length(tumor_cells)), replace = FALSE)# 合并所有参考细胞(不采样)与采样后的肿瘤细胞
selected_cells <- c(tumor_sample, normal_cells)# 构建新的 Seurat 对象
new.scRNA <- subset(scRNA1, cells = selected_cells)
  • 保留所有参考细胞(用于 CNV 归一化)。
  • 对肿瘤细胞进行采样(最多3000个),避免计算负担过大。

3. 构建 InferCNV 对象

3.1 提取表达矩阵和细胞注释

exprMatrix <- as.matrix(GetAssayData(new.scRNA, slot='counts'))
cellAnnota <- subset(new.scRNA@meta.data, select='RNA_snn_res.0.6')
  • exprMatrix基因表达矩阵(raw counts)
  • cellAnnota细胞分类信息(用于 InferCNV 分组)。

3.2 创建 InferCNV 对象

library(infercnv)infercnv_obj = CreateInfercnvObject(raw_counts_matrix=exprMatrix,annotations_file=cellAnnota,delim="\t",gene_order_file= "/home/jianpeng/yard/BC_TLLZ/TLLZ02_LB/BC-TLLZ02-LB-process/data/gencode_v19_gene_pos.txt",ref_group_names=c("8", "18"))  
  • gene_order_file:基因的染色体位置信息(gencode_v19)。
  • ref_group_names=c("8", "18")
    • 参考组(非恶性细胞)。
    • 仅使用 Normal 细胞 作为参照,提高CNV推断精度。

4. 运行 InferCNV

infercnv_obj = infercnv::run(infercnv_obj,cutoff=0.1,  # 10X数据推荐0.1,Smart-seq推荐1out_dir=  './output/cnv_epithelial/',cluster_by_groups=F,   # 是否按照组分类再聚类hclust_method="ward.D2", plot_steps=F, HMM = F, denoise=T,  # 去噪write_expr_matrix = T)
  • cutoff=0.1:基因表达阈值,适用于10X数据。
  • denoise=T:启用去噪处理,提高信噪比。
  • hclust_method="ward.D2":层次聚类方法,适合CNV分析。


5. CNV评分计算

library(tidyverse)# 读取InferCNV结果
obs <- read.table("./output/cnv_epithelial/infercnv.observations.txt", header=T)
ref <- read.table("./output/cnv_epithelial/infercnv.references.txt", header=T)# 合并参考与观测细胞
expr <- cbind(obs, ref)
expr.scale <- scale(t(expr))# 归一化 CNV 评分计算
tmp1 <- sweep(expr.scale, 2, apply(expr.scale, 2, min),'-')
tmp2 <- apply(expr.scale, 2, max) - apply(expr.scale,2,min)
expr_1 <- t(2*sweep(tmp1, 2, tmp2, "/")-1)cnv_score <- as.data.frame(colSums(expr_1 * expr_1))
colnames(cnv_score) = "cnv_score"
cnv_score <- rownames_to_column(cnv_score, var='cell')
cnv_score$cell <- gsub("\\.", "-", cnv_score$cell)
  • 计算 CNV评分(变异程度越高,评分越高)。
  • 标准化后计算平方和 以量化CNV程度。

6. 结果可视化

6.1 关联 Seurat Meta 数据

scRNA_sample = subset(scRNA1, cells = cnv_score$cell)meta <- scRNA_sample@meta.data %>%rownames_to_column(var='cell') %>%inner_join(cnv_score, by='cell') %>%column_to_rownames(var='cell')
  • 将CNV评分合并到元数据,用于可视化分析。

6.2 可视化 CNV 评分

library(ggpubr)
p = ggboxplot(meta, "RNA_snn_res.0.6", "cnv_score", fill = "RNA_snn_res.0.6") + scale_y_continuous(limits = c(0, 3000)) +  xlab("Cluster") +  ylab("CNV Score") +theme(panel.border = element_rect(colour = "black", fill = NA, size = 0.5)) +theme(legend.position = "none")ggsave(p, filename = './output/epithelial_cell/CNV/CNV_cluster_RNA_snn_res.0.6.pdf', width = 7, height = 4)
  • 箱线图展示CNV评分与细胞群体的关系
  • 可用于对比不同细胞群体的CNV变异趋势


7. 结果解读

  • CNV评分较高的细胞群体可能包含恶性肿瘤细胞
  • 参考细胞(如免疫细胞)应具有较低CNV评分,用于区分正常/肿瘤细胞。
  • 可结合其他单细胞分析方法(NicheNet, SCENIC)深入解析CNV相关的基因调控网络

8. 总结

  • 优化采样策略
    • 仅对肿瘤细胞进行采样(最大 3000 个),避免数据量过大。
    • 保留所有参考细胞(Normal 细胞),确保 InferCNV 计算的准确性。
  • InferCNV 主要流程
    1. 数据筛选与预处理(分层采样,选择参考细胞)。
    2. 创建InferCNV对象(设定参考组,载入基因位置信息)。
    3. 运行 InferCNV 分析(聚类,去噪,计算CNV)。
    4. 计算 CNV 评分(标准化,平方和计算)。
    5. 可视化分析(展示 CNV 评分的分布)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/71215.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++:多态与虚函数

1.虚函数&#xff0c;在函数前加virtual即可。有虚函数时&#xff0c;父类指针指向父类对象时就会使用父类的成员&#xff0c;指向子类对象时就可以使用子类成员&#xff0c;进而我们引入了多态的概念。 2.多态&#xff1a;父类指针指向子类的对象&#xff0c;通过父类指针调用…

WSL下使用git克隆失败解决

WSL默认nat模式&#xff0c;别动了防火墙放行&#xff0c;见图1git导入[bash1]&#xff0c;ip为你wsl上linxu通过ifconfig获取的本机ip&#xff0c;端口对好某alcsh软件开启tun模式【经过测试&#xff0c;不开也行】应该成了&#xff0c;如果不行&#xff0c;修改.wslconfig为下…

开放鸿蒙OpenHarmony 5.0.0 Release 兼容性测试实战经验分享

OpenHarmony 5.0版本的发布时间是2024年12月20日至21日。这个版本带来了许多新特性和改进。现在5.0出了两个release 版本&#xff0c;分别是5.0.0和5.0.1。 就在5.0版本发布不到2周的时间内&#xff0c;2025年01月01日起&#xff0c;不支持新产品基于老分支&#xff08;OpenHar…

C++中explicit关键字的含义以及用法

在C中&#xff0c;explicit关键字用于修饰构造函数和转换运算符&#xff08;C11起&#xff09;&#xff0c;防止编译器进行隐式类型转换&#xff0c;要求必须显式调用构造函数或转换操作。以下是其核心用法和示例&#xff1a; 1. 修饰构造函数 用途 禁止隐式构造对象&#xf…

Oracle OCP认证考试考点详解083系列01

题记&#xff1a; 本系列主要讲解Oracle OCP认证考试考点&#xff08;题目&#xff09;&#xff0c;适用于19C/21C,跟着学OCP考试必过。 1. 第1题&#xff1a; 题目 解析及答案&#xff1a; 关于自动工作量存储库&#xff08;AWR&#xff09;快照&#xff0c;以下哪三个选项…

从DNS到TCP:DNS解析流程和浏览器输入域名访问流程

1 DNS 解析流程 1.1 什么是DNS域名解析 在生活中我们会经常遇到域名&#xff0c;比如说CSDN的域名www.csdn.net&#xff0c;百度的域名www.baidu.com,我们也会碰到IP&#xff0c;现在目前有的是IPV4&#xff0c;IPV6。那这两个有什么区别呢&#xff1f;IP地址是互联网上计算机…

《2025软件测试工程师面试》接口测试篇

基础概念 什么是接口测试? 接口测试是测试系统组件间接口的一种测试,主要用于检测外部系统和内部系统之间以及各个子系统之间的交互点。测试的重点是检查数据的交换、传递和控制管理的过程,以及系统间的相互逻辑依赖关系等。 接口测试的优势是什么? 接口测试具有规范性与扩…

【PHP脚本语言详解】为什么直接访问PHP文件会显示空白?从错误示例到正确执行!

前言 作为一名开发者&#xff0c;你是否曾经遇到过这样的问题&#xff1a;写了一个PHP脚本&#xff0c;放到服务器根目录后&#xff0c;直接通过file:///路径访问却显示空白页面&#xff1f;而换成http://localhost却能正常显示&#xff1f;这篇文章将带你深入理解PHP脚本语言…

word转换为pdf后图片失真解决办法、高质量PDF转换方法

1、安装Adobe Acrobat Pro DC 自行安装 2、配置Acrobat PDFMaker &#xff08;1&#xff09;点击word选项卡上的Acrobat插件&#xff0c;&#xff08;2&#xff09;点击“首选项”按钮&#xff0c;&#xff08;3&#xff09;点击“高级配置”按钮&#xff08;4&#xff09;点…

基于PyTorch的深度学习2——逐元素操作,归并,比较,矩阵

以下为部分逐元素操作代码实例。 import torcht torch.randn(1, 3) t1 torch.randn(3, 1) t2 torch.randn(1, 3)#t0.1*(t1/t2) torch.addcdiv(t, 0.1, t1, t2)#计算sigmoid torch.sigmoid(t)#将t限制在[0,1]之间 torch.clamp(t,0,1)#t2进行就地运算 t.add_(2) 归并操作一般…

线程池的工作流程

线程池的工作流程主要包括任务提交、线程分配、任务执行和线程回收等环节&#xff0c;以下是对其详细的描述&#xff1a; 任务提交 当有任务需要执行时&#xff0c;用户通过线程池提供的提交方法&#xff0c;如execute()或submit()方法&#xff0c;将任务&#xff08;通常是实现…

C++20 标准化有符号整数:迈向更可预测的整数运算

文章目录 一、背景&#xff1a;为什么需要标准化&#xff1f;二、2 的补码&#xff1a;原理与优势&#xff08;一&#xff09;2 的补码原理&#xff08;二&#xff09;2 的补码的优势 三、C20 的变化&#xff1a;明确 2 的补码四、如何利用这一特性优化代码&#xff08;一&…

Libgdx游戏开发系列教程(1)——环境配置及demo运行

目录 环境 JDK环境 项目创建 1.下载gdx-setup.jar文件 2.填写信息,创建项目 demo运行步骤 1.修改gradle.properties 2.安装Build-Tool 3.运行 Libgdx游戏是基于Java的一款游戏引擎,可以发布Android,桌面端,Html,IOS等游戏,出名的《杀戮尖塔》也是用了此引擎制作的 本…

【jenkins配置记录】

全局工具配置&#xff1a; D:\Program Files\Java\jdk1.8.0_281 D:\Program Files\Git\bin\git.exe E:\allure-2.13.2 2. GIT 3. 定时任务 H 8 * * 1-5 4. 构建触发器 5. 构建后操作 Allure Report 吐血记录&#xff1a;报告路径可以为 workspace 相对路径 6. 系统配置 em…

C++:内联函数

内联函数可以用来降低运行时间&#xff0c;当内联函数收到编译器的指示时&#xff0c;即可发生内联&#xff1a;编译器会使用函数的定义体来替代函数调用语句&#xff0c;此行为发生在编译阶段。 定义内联函数涉及的关键字为inline&#xff0c;例如&#xff1a; inline void …

Linux网络相关概念和重要知识(1)(网络协议、网络通信)

目录 1.网络协议 &#xff08;1&#xff09;网络的起源 &#xff08;2&#xff09;为什么需要协议 &#xff08;3&#xff09;协议分层及其设计的解耦 &#xff08;4&#xff09;OSI定义的七层网络模型 ①分层及其功能 ②TCP/IP协议 ③传输层协议&#xff08;TCP和UDP&a…

【入门Web安全之前端学习的侧重点和针对性的建议】

入门Web安全之前端学习的侧重点和针对性的建议 一、HTML&#xff1a;理解攻击载荷的载体二、CSS&#xff1a;次要但需警惕点击劫持三、JavaScript&#xff1a;渗透测试的核心重点四、浏览器工具&#xff1a;渗透测试的实战武器五、学习建议与资源六、总结&#xff1a;渗透测试者…

QILSTE H6-C210TCG高亮翠绿光LED灯珠 发光二极管LED

# H6-C210TCG&#xff1a;高亮翠绿光LED的复杂特性解析 在现代电子设备的复杂设计中&#xff0c;H6-C210TCG型号的高亮翠绿光LED以其独特的光学和电气特性脱颖而出。这款LED不仅具备紧凑的尺寸&#xff0c;还融合了复杂的参数设计&#xff0c;使其在众多应用场景中表现出色。然…

Linux操作系统5-进程信号2(信号的4种产生方式,signal系统调用)

上篇文章&#xff1a;Linux操作系统5-进程信号1&#xff08;信号基础&#xff09;-CSDN博客 本篇Gitee仓库&#xff1a;myLerningCode/l25 橘子真甜/Linux操作系统与网络编程学习 - 码云 - 开源中国 (gitee.com) 本篇重点&#xff1a;信号的4种产生 目录 一. signal系统调用 …

如何在docker中的mysql容器内执行命令与执行SQL文件

通过 docker ps -a 查询当前运行的容器&#xff0c;找到想执行命令的容器名称。 docker ps -a若想执行sql文件&#xff0c;则将sql文件放入当前文件夹下后将项目内的 SQL 文件拷贝到 mysql 容器内部的 root下。 sudo docker cp /root/enterprise.sql mysql:/root/然后进入 my…