infercnv

news2024/11/18 18:23:40

文章目录

  • brief
  • 安装
  • 使用体验
      • 输入文件制作
      • 运行试试吧
      • 结果部分
      • others

brief

InferCNV is used to explore tumor single cell RNA-Seq data to identify evidence for somatic large-scale chromosomal copy number alterations, such as gains or deletions of entire chromosomes or large segments of chromosomes. This is done by exploring expression intensity of genes across positions of tumor genome in comparison to a set of reference ‘normal’ cells.

通过和‘normal’ cell的基因组位置相比,识别癌细胞基因组对应位置上发生的变化。

染色体畸变的 类型很多的,有结构上的(片段插入,片段缺失,重组,染色体断裂等等),有数量上的(染色体加倍,非整倍体,基因片段gain or lost)等等。

infercnv利用单细胞数据识别这些畸变,让我觉得很不可思议(测序深度,以及3‘或者5’端建库方法,可变剪接等等都会导致结果不可信)。不过很多的文章都在用它解析单细胞数据,我也不能仅仅停留在diss它的位置上,开学吧。

在这里插入图片描述

安装

# ubuntu 20
# https://sourceforge.net/projects/mcmc-jags/files/JAGS/4.x/Source/
wget https://sourceforge.net/projects/mcmc-jags/files/JAGS/4.x/Source/JAGS-4.3.2.tar.gz
tar -zxvf JAGS-4.3.2.tar.gz
cd JAGS-4.3.0
./configure --libdir=/usr/local/lib64
make
make install
if (!requireNamespace("BiocManager", quietly = TRUE))
     install.packages("BiocManager")
BiocManager::install("infercnv")

安装成功的验证

R
library(infercnv)

infercnv_obj = CreateInfercnvObject(raw_counts_matrix=system.file("extdata", "oligodendroglioma_expression_downsampled.counts.matrix.gz", package = "infercnv"),
                                    annotations_file=system.file("extdata", "oligodendroglioma_annotations_downsampled.txt", package = "infercnv"),
                                    delim="\t",
                                    gene_order_file=system.file("extdata", "gencode_downsampled.EXAMPLE_ONLY_DONT_REUSE.txt", package = "infercnv"),
                                    ref_group_names=c("Microglia/Macrophage","Oligodendrocytes (non-malignant)")) 

infercnv_obj = infercnv::run(infercnv_obj,
                             cutoff=1, # cutoff=1 works well for Smart-seq2, and cutoff=0.1 works well for 10x Genomics
                             out_dir=tempfile(), 
                             cluster_by_groups=TRUE, 
                             denoise=TRUE,
                             HMM=TRUE)

使用体验

输入文件制作

# 内置的raw counts文件
rwa_counts <- read.table(gzfile("/public/home/djs/miniconda3/envs/R4/lib/R/library/infercnv/extdata/oligodendroglioma_expression_downsampled.counts.matrix.gz","r"),sep="\t",header=T)

行是基因,列是细胞
在这里插入图片描述

# 内置的 cell annotation file
annotation_file <- read.table("/public/home/djs/miniconda3/envs/R4/lib/R/library/infercnv/extdata/oligodendroglioma_annotations_downsampled.txt",sep="\t",header=T)

文件分为两列,第一列记录细胞名称,第二列记录细胞注释类型,比如normal,malignant。
在这里插入图片描述

# 内置的基因坐标文件
gene_order <- read.table("/public/home/djs/miniconda3/envs/R4/lib/R/library/infercnv/extdata/gencode_downsampled.EXAMPLE_ONLY_DONT_REUSE.txt",sep="\t",header=T)

文件分为四列,第一列记录基因名称,第二列记录基因在哪条染色体上,以及第三四列记录染色体上的起始终止位点。
在这里插入图片描述


开始制作输入文件…

# 得到最容易得到的表达矩阵
sce <- readRDS("immune.integrated.annotation.rds") # seurat对象
dim(sce@meta.data)
# [1] 57970    13
raw_counts <- as.matrix(sce@assays$RNA@data) # 得到全部细胞的表达矩阵 
# 我这个数据集大约58000个细胞,软件运行的很慢而且再服务器上出图会报错,我打算取一些子集演示一下
# 只取上皮细胞
sce1 <- subset(sce,subset = singleR == "Epithelial_cells")
dim(sce1@meta.data)
# [1] 14938    13
raw_counts <- as.matrix(sce1@assays$RNA@data)
raw_counts[1:5,1:5] # 此时行是基因,列是细胞

# 现在 需要得到细胞的注释信息,一列是细胞名称,一列是细胞类型注释。
head(sce1@meta.data)
celltype <- sce1@meta.data[,"singleR"]
cellname <- rownames(sce1@meta.data)
annotation_file <- as.data.frame(cbind(cellname,celltype))

write.table(annotation_file,file="annotation_file.txt",sep="\t",row.names=F,col.names=F)
# 最后是基因在染色体上的坐标文件,这个因为不同的基因组注释文件以及版本可能有些不一样,应该是bug最多的一个文件了
# 归根揭底其实就是解析GTF/GFF文件
# https://www.gencodegenes.org/pages/data_format.html 这是gencode官网提供的信息,最后还贴心的附上了提取信息的code
cat ~/software/STAR-2.7.7a/genome_gtf/gencode.v40.annotation.gtf |  \
 awk '{if($3=="gene" && $0~"level (1|2);") {print $10,$14,$12,$1,$4,$5,$7}}'  | \
 sed 's/[";]//g' |sed 's/ /\t/g' | \
 sed  '1i ENSG_id \t gene_symbl \t gene_type \t chr\t start \t end'  > infercnv_gene_order.file.tsv

# 拿到这个这个文件后,再去R里面抓取表达矩阵出现的那些基因
gene_order <- read.table("/public/home/djs/reference/infercnv_gene_order.file.tsv",header=T,sep="\t")
gene_order <- gene_order[!duplicated(gene_order$ENSG_id),]
gene_order[1:5,]

# 很烦人,有些基因的名字不在注释文件中,看了一下大部分基因名字都是因为有后缀
length(rownames(raw_counts))
# [1] 25870
table(rownames(raw_counts) %in% gene_order$ENSG_id)
# FALSE  TRUE
# 6308 19562

# 算了,还是修改表达矩阵吧,也就是把那些没在gene_order中的基因丢了
raw_counts <- raw_counts[which(rownames(raw_counts) %in% gene_order$ENSG_id),]
dim(raw_counts)
# [1] 19562 14938

gene_order_file <- gene_order[which(gene_order$ENSG_id %in% rownames(raw_counts)),c(1,3,4,5)]
write.table(raw_counts,file="raw_counts_file.txt",sep="\t",row.names=T)  # 需要把基因作为行名写入文件
write.table(gene_order_file,file="gene_order_file.txt",sep="\t",row.names=F,col.names=F) # 行列名不需要写入

运行试试吧

# create the infercnv object
infercnv_obj = CreateInfercnvObject(raw_counts_matrix="raw_counts_file.txt",
                                    annotations_file="annotation_file.txt",
                                    delim="\t",
                                    gene_order_file="gene_order_file.txt",
                                    ref_group_names=NULL)
                                    
# perform infercnv operations to reveal cnv signal
infercnv_obj = infercnv::run(infercnv_obj,
                             cutoff=0.1,  # use 1 for smart-seq, 0.1 for 10x-genomics
                             out_dir="output_dir",  # dir is auto-created for storing outputs
                             cluster_by_groups=T,   # cluster
                             denoise=T,
                             HMM=T
                             )
  • ref_group_names参数的使用:
    Note, if you do not have reference cells, you can set ref_group_names=NULL, in which case the average signal across all cells will be used to define the baseline. This can work well when there are sufficient differences among the cells included
    也可以设置为 ref_group_names=c("NK_cell"))

  • 需要注意的是cutoff 值,这是噪音过滤参数:
    The cutoff value determines which genes will be used for the infercnv analysis. Genes with a mean number of counts across cells will be excluded. For smart-seq (full-length transcript sequencing, typically using cell plate assays rather than droplets), a value of 1 works well. For 10x (and potentially other 3’-end sequencing and droplet assays, where the count matrix tends to be more sparse), a value of 0.1 is found to generally work well.

  • inferCNV de-noising filters是为了干什么?还有其他方法吗?
    These de-noising filter options are available for manipulating the residual expression intensities with the goal of reducing the noise (residual signal in the normal cells) while retaining the signal in tumor cells that could be interpreted as supporting CNV.

    把normal 细胞的表达信号当作背景信号,其他细胞的表达信号减去背景信号,也就是获取偏离normal 的信号,认为他们是gain or loss CNV。

# 手动指定背景信号值
# A specific threshold deviation from the mean can be set using the 'noise_filter' attribute
 infercnv_obj = infercnv::run(infercnv_obj,
                             cutoff=1, # cutoff=1 works well for Smart-seq2, and cutoff=0.1 works well for 10x Genomics
                             out_dir=out_dir, 
                             cluster_by_groups=T, 
                             plot_steps=F,
                             denoise=T,
                             noise_filter=0.1   ## hard thresholds
                             )

# 更具偏离标准差的距离设定阈值
By default, the hard cutoffs for denoising are computed based on the standard deviation of the residual normal expression values. This thresholding can be adjusted using the 'sd_amplifier' setting.
infercnv_obj = infercnv::run(infercnv_obj,
                             cutoff=1, # cutoff=1 works well for Smart-seq2, and cutoff=0.1 works well for 10x Genomics
                             out_dir=out_dir, 
                             cluster_by_groups=T, 
                             plot_steps=F,
                             denoise=T,
                             sd_amplifier=1.5  ## set dynamic thresholding based on the standard deviation value.
                             )
  • 预测CNV的方法以及结果
    在这里插入图片描述

  • 另一个参数细节:
    By setting infercnv::run(analysis_mode=‘subclusters’), inferCNV will attempt to partition cells into groups having consistent patterns of CNV. CNV prediction (via HMM) would then be performed at the level of the subclusters rather than whole samples.
    (The methods available for defining tumor subclusters will continue to be expanded. We’ve currently had best success with using hierarchical clustering based methods.)

结果部分

出现最后的 making the final infercnv heatmap才是正常结束,运行时间大应该是14938个细胞13:00-19:00
在这里插入图片描述
在这里插入图片描述

  • 了解一下都是些什么结果然后如何结合seurat对象作图
    在这里插入图片描述

  • 判定恶性细胞
    参考文章:
    https://cloud.tencent.com/developer/inventory/7049/article/1737138
    https://cloud.tencent.com/developer/inventory/7049/article/1737241

# 读取infercnv.observations.txt文件来计算CNV score

cnv_table <- read.table("plot_out/inferCNV_output2/infercnv.observations.txt", header=T)
# Score cells based on their CNV scores 
# Replicate the table 
cnv_score_table <- as.matrix(cnv_table)
cnv_score_mat <- as.matrix(cnv_table)
# Scoring
# CNV的5分类系统
cnv_score_table[cnv_score_mat > 0 & cnv_score_mat < 0.3] <- "A" #complete loss. 2pts
cnv_score_table[cnv_score_mat >= 0.3 & cnv_score_mat < 0.7] <- "B" #loss of one copy. 1pts
cnv_score_table[cnv_score_mat >= 0.7 & cnv_score_mat < 1.3] <- "C" #Neutral. 0pts
cnv_score_table[cnv_score_mat >= 1.3 & cnv_score_mat <= 1.5] <- "D" #addition of one copy. 1pts
cnv_score_table[cnv_score_mat > 1.5 & cnv_score_mat <= 2] <- "E" #addition of two copies. 2pts
cnv_score_table[cnv_score_mat > 2] <- "F" #addition of more than two copies. 2pts

# Check
table(cnv_score_table[,1])
# Replace with score 
cnv_score_table_pts <- cnv_table
rm(cnv_score_mat)
#  把5分类调整为 3分类系统
cnv_score_table_pts[cnv_score_table == "A"] <- 2
cnv_score_table_pts[cnv_score_table == "B"] <- 1
cnv_score_table_pts[cnv_score_table == "C"] <- 0
cnv_score_table_pts[cnv_score_table == "D"] <- 1
cnv_score_table_pts[cnv_score_table == "E"] <- 2
cnv_score_table_pts[cnv_score_table == "F"] <- 2

# Scores are stored in “cnv_score_table_pts”. Use colSums to add up scores for each cell and store as vector 
cell_scores_CNV <- as.data.frame(colSums(cnv_score_table_pts))
colnames(cell_scores_CNV) <- "cnv_score"
head(cell_scores_CNV)
write.csv(x = cell_scores_CNV, file = "cnv_scores.csv") # 根据这个文件给每个细胞打分或者划高低中等分类然后比较或者可视化

我自己的数据集中每个基因的 CNV score都“适中”,大概是因为我没有提供“reference normal cell”,所以上述代码就不搞了。
(打完分就可以得到cell barcode,这些cell barcode 结合 seurat object 就可以可视化到UMAP等图中了)
在这里插入图片描述


算法思想细节
The detailed steps of the inferCNV algorithm involve the following:

  • filtering genes: those genes found expressed in fewer than ‘min_cells_per_gene’ are removed from the counts matrix.
    把低表达基因基因去除

  • normalization for sequencing depth (total sum normalization): read counts per cell are scaled to sum to the median total read count across cells. Instead of a metric such as counts per million (cpm), values are counts per median sum.
    这里的normalization方法就很特殊 = (reads / total reads)* median of all sum reads from all cells

  • log transformation: individual matrix values (x) are transformed to log(x+1)
    normalization 后 再log transformation

  • center by normal gene expression: the mean value for each gene across normal (reference) cells is subtracted from all cells for corresponding genes. Since this subtraction is performed in log space, this is effectively resulting in log-fold-change values relative to the mean of the normal cells.
    每个基因的scale

  • thresholding dynamic range for log-fold-change values. Any values with abs(log(x+1)) exceeding ‘max_centered_threshold’ (default=3) are capped at that value.

  • chromosome-level smoothing: for each cell, genes ordered along each chromosome have expression intensities smoothed using a weighted running average. By default, this is a window of 101 genes with a pyramidinal weighting scheme.

  • centering cells: each cell is centered with its median expression intensity at zero under the assumption that most genes are not in CNV regions.

  • adjustment relative to normal cells: The mean of the normals is once again subtracted from the tumor cells. This further compensates for differences that accrued after the smoothing process.

  • the log transformation is reverted. This makes the evidence for amplification or deletion more symmetrical around the mean. (note, with loss or gain of one copy, corresponding values 0.5 and 1.5 are not symmetrical in log space. Instead, 0.5 and 2 are symmetrical in log space. Hence, we invert the log transformation to better reflect symmetry in gains and losses).

others

在这里插入图片描述

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

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

相关文章

程序员的护城河:技术深度与软实力的并重

程序员的护城河&#xff1a;技术深度与软实力的并重 作为一名资深的IT行业从业者&#xff0c;我一直在思考一个问题&#xff1a;在我们这个以数据驱动和技术创新为核心的时代&#xff0c;程序员的价值究竟体现在哪里&#xff1f;毫无疑问&#xff0c;程序员在维护系统安全、数…

易基因:综合全基因组DNA甲基化和转录组学分析鉴定调控骨骼肌发育潜在基因 | 研究进展

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。 DNA甲基化是骨骼肌发育中关键的表观遗传调控机制。但胚胎鸭骨骼肌发育中负责DNA甲基化的调控因子仍然未知。 2023年10月23日&#xff0c;南京农业大学动物科技学院于敏莉副教授团队在《…

PP-YOLOv2: A Practical Object Detector(2021.4)

文章目录 Abstract1. Introduction2. Revisit PP-YOLOPre-ProcessingBaseline ModelTraining Schedule 3. Selection of RefinementsPath Aggregation Network Mish Activation FunctionLarger Input SizeIoU Aware Branch 4. Experiments6. Conclusions 原文地址 源代码 Abstr…

Flink(五)【DataStream 转换算子(上)】

前言 这节注定是一个大的章节&#xff0c;我预估一下得两三天&#xff0c;涉及到的一些东西不懂就重新学&#xff0c;比如 Lambda 表达式&#xff0c;我只知道 Scala 中很方便&#xff0c;但在 Java 中有点发怵了&#xff1b;一个接口能不能 new 来构造对象? 答案是可以的&…

解决 requests 库下载文件问题的技术解析

在一个使用requests库的conda食谱构建过程中&#xff0c;我们注意到存在一个文件下载问题。该文件是从https://dakota.sandia.gov/sites/default/files/distributions/public/dakota-6.5-public.src.tar.gz下载的。使用curl和urllib2库可以正确下载文件&#xff0c;但使用reque…

Find My平衡车|苹果Find My技术与平衡车结合,智能防丢,全球定位

随着人们环保意识的加强&#xff0c;电动车的数量与日俱增。与此同时&#xff0c;科学家经过潜心的研究&#xff0c;终于开发出新款两轮电动平衡车。两轮电动平衡车是一种新型的交通工具&#xff0c;它与电动自行车和摩托车车轮前后排列方式不同&#xff0c;而是采用两轮并排固…

「Verilog学习笔记」优先编码器Ⅰ

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点&#xff0c;刷题网站用的是牛客网 分析 分析编码器的功能表&#xff1a; 当使能El1时&#xff0c;编码器工作&#xff1a;而当E10时&#xff0c;禁止编码器工作&#xff0c;此时不论8个输入端为何种状态&…

锐捷网络NBR700G 信息泄露漏洞复现 [附POC]

文章目录 锐捷网络NBR700G 信息泄露漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 0x06 修复建议 锐捷网络NBR700G 信息泄露漏洞复现 [附POC] 0x01 前言 免责声明&#xff1a;请勿利用文章内的相关技术从事非…

CNVD-2021-27648:锐捷RG-UAC统一上网行为管理与审计系统信息泄露漏洞复现

文章目录 锐捷RG-UAC统一上网行为管理与审计系统信息泄露&#xff08;CNVD-2021-27648&#xff09;漏洞复现0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.复现 0x06 修复建议 锐捷RG-UAC统一上网行为管理与审计系统信息泄露&#xff08;CNVD…

在Ubuntu系统上部署Inis博客,并使用内网穿透将博客网站发布到公共互联网上

文章目录 前言1. Inis博客网站搭建1.1. Inis博客网站下载和安装1.2 Inis博客网站测试1.3 cpolar的安装和注册 2. 本地网页发布2.1 Cpolar临时数据隧道2.2 Cpolar稳定隧道&#xff08;云端设置&#xff09;2.3.Cpolar稳定隧道&#xff08;本地设置&#xff09; 3. 公网访问测试总…

vue实现类似c#一样,鼠标指到方法或者变量上,能显示自己备注的信息

之前从c#转vue的时候&#xff0c;就问同事&#xff0c;为啥我给刚写的方法备注&#xff0c;在其他地方调用的时候看不到备注信息&#xff0c;同事说不知道怎么才能做到。今天无意间看前端知识的时候发现了还有如下的方法&#xff1a; 如下&#xff0c;在变量之前增加多一个星号…

AMEYA360分析:蔡司工业CT中的自动缺陷检测

蔡司自动缺陷检测&#xff1a;适用于您的应用领域的AI软件 蔡司自动化缺陷检测机器学习软件将人工智能应用于3D CT和2D X射线系统&#xff0c;树立了新的标杆&#xff0c;可对缺陷或异常(不规则)进行检测、定位与分类&#xff0c;同时通过读取CT扫描和X射线结果对其进行详细分析…

2023美亚杯个人赛复盘(一)火眼+取证大师

第一次参加美亚杯&#xff0c;手忙脚乱&#xff0c;不过也学到了很多东西&#xff0c;接下来会分篇介绍writeup&#xff0c;感兴趣的小伙伴可以持续关注。 案件基本情况&#xff1a; &#xff08;一&#xff09;案情 2023月8月的一天&#xff0c;香港警方在调查一起网络诈骗案…

爆款元服务!教你如何设计高使用率卡片

元服务的概念相信大家已经在 HDC 2023 上有了很详细的了解&#xff0c;更轻便的开发方式&#xff0c;让开发者跃跃欲试。目前也已经有很多开发者开发出了一些爆款元服务&#xff0c;那么如何让你的元服务拥有更高的传播范围、更高的用户使用率和更多的用户触点呢&#xff1f;设…

java,springboot钉钉开发连接器,自定义连接器配合流程使用,流程加入连接器,连接器发送参数,然后你本地处理修改值,返回给流程

1.绘制连接器&#xff0c;注意出餐入参的格式&#xff0c; 2.绘制流程&#xff0c;绑定连接器&#xff0c;是提交后出发还是表单值变化后 3.编写本地接口&#xff08;内网穿透&#xff09;&#xff0c;绑定连接器 钉钉开发连接器&#xff0c;自定义连接器配合流程使用&#x…

高防IP是什么?如何隐藏源站IP?如何进行防护?

高防IP是针对互联网服务器遭受大流量的DDoS攻击后导致服务不可用的情况下,推出的付费增值服务。用户在数据不转移的情况下,就可以通过配置高防IP , 将攻击流量引流到高防|P,确保源站的稳定可靠。高防IP采用的技术手段包括DDoS防护、WAF ( Web应用程序防火墙)等,它能够有效抵御来…

建筑楼宇智慧能源管理系统,轻松解决能源管理问题

随着科技的进步与人们节能减排意识的不断增强&#xff0c;建筑楼宇是当下节能减排的重要工具。通过能源管理平台解决能效管理、降低用能成本、一体化管控、精细化管理和服务提供有力支撑。 建筑楼宇智慧能源管理系统是一种利用先进手段&#xff0c;采用微服务架构&#xff0c;…

Python小白之环境安装

一、安装包 1、Python开发环境&#xff0c;下载地址&#xff1a; Welcome to Python.org 2、Python工具 Python是强依赖缩进的语言&#xff0c;Node pad等容易有缩进问题&#xff0c;还是使用IDE比较合适&#xff0c;推荐使用PythonCharm。 PythonCharm下载地址&#xff1a…

2023年好用的远程协同运维工具当属行云管家!

对于IT小伙伴而言&#xff0c;一款好用的远程协同运维工具是非常重要的&#xff0c;不仅可以提高工作效率&#xff0c;还能第一时间解决运维难题&#xff0c;所以好用的远程协同工具是非常必要的。这里就给大家推荐一款哦&#xff01; 2023年好用的远程协同运维工具当属行云管…