单细胞实战(4):STAR与cellranger结果比较

前言

本次主要使用Seurat比较STAR与Cellranger的输出结果,只会进行简单的聚类工作。

数据读入

> library(Seurat)
> library(dplyr)
> library(magrittr)
> library(gtools)
> library(stringr)
> library(Matrix)
> setwd("D://data/ScRNAcode")
##读入STAR数据
> matrix.dir="STAR/"
> barcode.path <- paste0(matrix.dir,"barcodes.tsv")
> features.path <- paste0(matrix.dir,"features.tsv")
> matrix.path <- paste0(matrix.dir, "matrix.mtx")
> STARmatrix <- readMM(file = matrix.path)
> feature.names = read.delim(features.path,
+                            header = FALSE,
+                            stringsAsFactors = FALSE)
> barcode.names = read.delim(barcode.path,
+                            header = FALSE,
+                            stringsAsFactors = FALSE)
> colnames(STARmatrix) = barcode.names$V1
> rownames(STARmatrix) = feature.names$V2
> STARmatrix<-as.matrix(STARmatrix)
> STARmatrix[1:6,1:6]
##创建seurat对象
##创建STAR的Seurat对象
> STAR <- CreateSeuratObject(STARmatrix,project = "zsz",
                           min.cells = 3, min.features = 200)
##创建Cellranger的Seurat对象
> dir="cellranger/"
> counts <- Read10X(data.dir = dir)
> RANGER <- CreateSeuratObject(counts, project = "zsz", 
                             min.cells=3, min.features = 200)

数据比较

> ##数据比较
> dim(STARmatrix)
[1] 33538  2048
> dim(counts)
[1] 33538  2112
> dim(STAR)
[1] 13350  2046
> dim(RANGER)
[1] 13314  2105
> fivenum(apply(STARmatrix,1,function(x) sum(x>0)))
MIR1302-2HG     IGFBPL1  AL008723.2       FXYD7      MT-CO1 
          0           0           0          29        2047 
> fivenum(apply(counts,1,function(x) sum(x>0)))
MIR1302-2HG     FAM221B   LINC01638        DGKE      MT-CO1 
          0           0           0          29        2108 
> pdf("box.pdf",height = 9,width = 9)
> boxplot(apply(STARmatrix,1,function(x) sum(x>0) ),main = "STAR",col = "lightgray")
> boxplot(apply(counts,1,function(x) sum(x>0) ),main = "Cellranger",col = "lightgray")
> dev.off()
RStudioGD 
        2 
> pdf("hist.pdf",height = 9,width = 9)
> hist(apply(STARmatrix,2,function(x) sum(x>0) ),col = "lightgray",
+      breaks=20,xlim=c(0,4000),ylim=c(0,800),
+      labels=F,main="STAR",
+      xlab="genes",ylab="cells")
> abline(v=median(apply(STARmatrix,2,function(x) sum(x>0))),col='red')
> hist(apply(counts,2,function(x) sum(x>0) ),col = "lightgray",
+      breaks=20,xlim=c(0,4000),ylim=c(0,800),
+      labels=F,main="Cellranger",
+      xlab="genes",ylab="cells")
> abline(v=median(apply(counts,2,function(x) sum(x>0))),col='red')
> dev.off()              

根据箱线图,直方图和矩阵的基本信息,可以看到STAR与cellranger的结果差距很小

质量控制与聚类比较

> pdf("qc.pdf",height = 9,width = 9)
> VlnPlot(STAR,
+         features = c("nFeature_RNA", "nCount_RNA"), 
+         pt.size = 0.1,
+         ncol = 2)
> VlnPlot(RANGER,
+         features = c("nFeature_RNA", "nCount_RNA"), 
+         pt.size = 0.1, 
+         ncol = 2)
> dev.off()
RStudioGD 
        2 
> STAR<-subset(STAR,subset=nFeature_RNA>500 & nFeature_RNA<2000)
> STAR <- NormalizeData(STAR, normalization.method = "LogNormalize", scale.factor = 10000)
Performing log-normalization
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
> table(STAR@meta.data$orig.ident)

 zsz 
1896 
> STAR <- FindVariableFeatures(STAR, selection.method = "vst", nfeatures = 2000)
Calculating gene variances
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating feature variances of standardized and clipped values
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
> top10 <- head(VariableFeatures(STAR), 10) 
> top10
 [1] "S100A9"  "S100A8"  "IGLC2"   "IGKC"    "LYZ"     "IGLC3"   "CCL3"    "NFKBIA"  "PTGDS"   "S100A12"
 
 > RANGER<-subset(RANGER,subset=nFeature_RNA>500 & nFeature_RNA<2000)
> RANGER<- NormalizeData(RANGER, normalization.method = "LogNormalize", scale.factor = 10000)
Performing log-normalization
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
> table(RANGER@meta.data$orig.ident)

 zsz 
1895 
> RANGER <- FindVariableFeatures(RANGER, selection.method = "vst", nfeatures = 2000)
Calculating gene variances
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating feature variances of standardized and clipped values
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
> top10 <- head(VariableFeatures(RANGER), 10) 
> top10
 [1] "S100A9"  "S100A8"  "IGLC2"   "IGKC"    "LYZ"     "CCL3"    "NFKBIA"  "IGLC3"   "PTGDS"   "S100A12"
 
> scale.genes <-  rownames(STAR)
> STAR <- ScaleData(STAR, features = scale.genes)
> STAR <- RunPCA(STAR, features = VariableFeatures(STAR)) 
> plot1 <- ElbowPlot(STAR, ndims=30, reduction="pca") 
> scale.genes <-  rownames(RANGER)
> RANGER <- ScaleData(RANGER, features = scale.genes)
> RANGER <- RunPCA(RANGER, features = VariableFeatures(RANGER)) 
> plot2 <- ElbowPlot(RANGER, ndims=30, reduction="pca") 
> plotc <- plot1+plot2
> ggsave("pca.pdf", plot = plotc, width = 8, height = 4)
> STAR <- FindNeighbors(STAR, dims = 1:10) 
> STAR <- FindClusters(STAR, resolution = 0.8)
> table(STAR@meta.data$seurat_clusters)
  0   1   2   3   4   5   6   7   8   9 
368 310 290 217 184 129 119 112  92  75
> metadata <- STAR@meta.data
> cell_cluster <-data.frame(cell_ID=rownames(metadata),
cluster_ID=metadata$seurat_clusters)
> STAR <- RunUMAP(STAR, dims = 1:20)
> embed_tsne <- Embeddings(STAR, 'umap')
> plot1 = DimPlot(STAR, reduction = "umap" ,label = "T", pt.size = 1,label.size = 4)
> RANGER <- FindNeighbors(RANGER, dims = 1:10) 
> RANGER <- FindClusters(RANGER, resolution = 0.8)
> table(RANGER@meta.data$seurat_clusters)
  0   1   2   3   4   5   6   7   8   9 
375 300 290 212 195 128 122 108  91  74 
> metadata <- RANGER@meta.data
> cell_cluster <- data.frame(cell_ID=rownames(metadata), cluster_ID=metadata$seurat_clusters)
> RANGER <- RunUMAP(RANGER,n.neighbors = 30,dims = 1:20)
> embed_umap <- Embeddings(RANGER, 'umap')
> plot2 = DimPlot(RANGER, reduction = "umap" ,label = "T", pt.size = 1,label.size = 4)
> plotc <- plot1+plot2
> ggsave("umap.pdf", plot = plotc, width = 8, height = 4)

可以看到两种分析方法umap与tsne聚类效果不太相同,但是基本的聚类与分群是一致的

结语

就结果而言,两种分析方法的结果不完全相同,但也基本一致,本次笔记中用到的数据和代码已上传github,在ScRNAseq_code/compare文件夹下,大家需要的可以下载试试


转载请注明:周小钊的博客>>>单细胞实战(4):STAR与cellranger结果比较

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,837评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,551评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,417评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,448评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,524评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,554评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,569评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,316评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,766评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,077评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,240评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,912评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,560评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,176评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,425评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,114评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,114评论 2 352