2021-06-16 PBMC入门与sctransform

参考:公众号:生信会客厅

library(Seurat)
library(tidyverse)
library(patchwork)
# 下载并解压数据
dir.create("Vignette01")
download.file("https://cf.10xgenomics.com/samples/cell/pbmc3k/pbmc3k_filtered_gene_bc_matrices.tar.gz",
              "Vignette01/pbmc.tar.gz")
untar("Vignette01/pbmc.tar.gz", exdir="Vignette01")
# 创建表达矩阵
pbmc.data <- Read10X(data.dir = "Vignette01/filtered_gene_bc_matrices/hg19/")
#查看基因数和细胞数
dim(pbmc.data)
#[1] 32738  2700
# 创建seurat对象,保留最少在3个细胞中表达的基因以及最少表达200个基因的细胞
pbmc <- CreateSeuratObject(counts = pbmc.data, project = "pbmc3k", min.cells = 3, min.features = 200)
#查看基因数和细胞数
dim(pbmc)
#[1] 13714  2700
#可以发现过滤了一大半的基因
head(pbmc@meta.data, 2)
#               orig.ident nCount_RNA nFeature_RNA
#AAACATACAACCAC     pbmc3k       2419          779
#AAACATTGAGCTAC     pbmc3k       4903         1352
#可以发现CreateSeuratObject函数中的project参数与orig.ident是对应关系
#细胞质控
pbmc[["percent.mt"]] <- PercentageFeatureSet(pbmc, pattern = "^MT-")  
p=VlnPlot(pbmc, features = c("nFeature_RNA", "nCount_RNA", "percent.mt"), pt.size=0.1, ncol = 3)
pbmc <- subset(pbmc, subset = nFeature_RNA > 200 & nFeature_RNA < 2500 & percent.mt < 5)
p=VlnPlot(pbmc, features = c("nFeature_RNA", "nCount_RNA", "percent.mt"), pt.size=0.1, ncol = 3)

pbmc.sc <- pbmc

数据标准化
pbmc <- NormalizeData(pbmc, normalization.method = "LogNormalize", scale.factor = 10000)
pbmc <- FindVariableFeatures(pbmc, selection.method = "vst", nfeatures = 3000)
pbmc <- ScaleData(pbmc, features = rownames(pbmc))            #对所有基因执行scale
pbmc <- ScaleData(pbmc, features = VariableFeatures(pbmc))     #只对高变基因执行scale
library(sctransform)
pbmc.sc <- SCTransform(pbmc.sc, verbose = FALSE)
##对比它们选择的高变基因
library(VennDiagram)
library(gplots)
v1 <- VariableFeatures(pbmc)
v2 <- VariableFeatures(pbmc.sc)
p <- venn.diagram(list(v1,v2), col=c("red","green"), alpha = c(0.5, 0.5),
                  category.names=c('pbmc','pbmc.sc'), filename=NULL, margin=0.15)    
png(file='Vignette01/compare_variablefeatures.png', width=300, height=300)
grid.draw(p)
dev.off()
##降维结果对比
#作者介绍三步法(Log-normalization)的后续分析选择的pc轴数量增加对结果影响不大,一步法则不同(sctransform)
#我们尝试三种不同的参数nPCs=10,nPCs=20,nPCs=30来验证一下
#先画出ElbowPlot
pbmc <- RunPCA(pbmc, features = VariableFeatures(pbmc)) 
pbmc.sc<- RunPCA(pbmc.sc, features = VariableFeatures(pbmc.sc)) 
p1 = ElbowPlot(pbmc, ndims=30,reduction = 'pca')
p2 = ElbowPlot(pbmc.sc, ndims=30,reduction = 'pca')
plotc = p1+p2
ggsave('Vignette01/compare_ElbowPlot.png', plotc, width=8, height=4)

#三个参数都分析看看
nPC.list=list(1:10,1:20,1:30)
set.seed(822)
for(nPCs in nPC.list){
  pbmc <- RunPCA(pbmc, verbose = FALSE) %>% RunUMAP(dims = nPCs) %>% FindNeighbors(dims = nPCs) %>% 
    FindClusters()
  pbmc.sc <- RunPCA(pbmc.sc, verbose = FALSE) %>% RunUMAP(dims = nPCs) %>% FindNeighbors(dims = nPCs) %>% 
    FindClusters()
  p1 <- DimPlot(object = pbmc, label = TRUE) + NoLegend() + ggtitle(paste0('Log-normalization_',max(nPCs)))
  p2 <- DimPlot(object = pbmc.sc, label = TRUE) + NoLegend() + ggtitle(paste0('sctransform_',max(nPCs)))
  plotc <- p1 + p2
  ggsave(paste0('Vignette01/compare_umap_',max(nPCs),'.png'), plotc, width=8, height=4)
}
plotc
#pc.num=1:30
#pbmc.sc <- RunPCA(pbmc.sc, verbose = FALSE) %>% RunUMAP(dims = pc.num) %>% FindNeighbors(dims = pc.num) %>% 
  FindClusters()


补充说明:官方介绍sctransform挑选出来的高变基因和标准化之后的数据,更能去除技术噪音并保留细微的生物学差异。三步法标准化之后的数据进行后续分析,选择的pc轴达到一定数量(拐点)之后再增加就没有意义了;但是一步法标准化之后的数据用于后续分析,选择的pc轴越多越有利于发现细微的生物学差异。实测聚类效果都没有明显的差异,详见上图!
sctransform函数运行之后的结果保存在pbmc@ASSAY@SCT,分析结果是@scale.data,@counts和@data都是用@scale.data反向计算回去的,@counts相当于细胞数据量相同情况下的值(也就是均一化了的)。差异表达分析和数据整合最好用@scale.data,但是seurat目前不支持,因此还得用@data的数据





##后续分析采用sctransform处理过的数据,log_normalization的结果备份
saveRDS(pbmc, 'pbmc_log_normalization.rds')
pbmc = pbmc.sc
pbmc.markers <- FindAllMarkers(pbmc, only.pos = TRUE, min.pct = 0.25, logfc.threshold = 0.25)
colnames(pbmc.markers)[2] <- 'avg_logFC'
top10markers <- subset(pbmc.markers, p_val<0.05&p_val_adj<0.05) %>% group_by(cluster) %>% top_n(n = 10, wt = avg_logFC)
write.csv(top10markers,'Vignette01/top10markers.scv', row.names=F)

##细胞类型的鉴定我综合了SingleR和cellmarker数据库,以及原教程的biomarker,过程就不赘述了

##将判断结果输入pbmc
celltype <- c('CD4+ T','CD14+ Mono','CD4+ T','B','CD8+ T','NK','FCGR3A+ Mono',
               'NK','CD8+ T','DC','CD4+ T','Platelet')

celltype <- as.data.frame(celltype)

pbmc@meta.data$celltype = "NA"
for(i in 1:nrow(celltype)){
  pbmc@meta.data[which(pbmc@meta.data$seurat_clusters == celltype$ClusterID[i]),'celltype'] <- celltype$celltype[i]}
table(pbmc@meta.data$celltype)


library(SingleR)
load("D:\\genetic_r\\singer-cell-learning\\SingleR_ref\\SingleR_ref\\ref_Human_all.RData")

refdata <- ref_Human_all
testdata <- GetAssayData(pbmc, slot="data")
###把scRNA数据中的seurat_clusters提取出来,注意这里是因子类型的
clusters <- pbmc@meta.data$seurat_clusters
###开始用singler分析
cellpred <- SingleR(test = testdata, ref = refdata, labels = refdata$label.main, 
                    method = "cluster", clusters = clusters, 
                    assay.type.test = "logcounts", assay.type.ref = "logcounts")
###制作细胞类型的注释文件
celltype = data.frame(ClusterID=rownames(cellpred), celltype=cellpred$labels, stringsAsFactors = FALSE)
celltype$celltype <- c('CD4+ T','CD4+ T','CD14+ Mono','CD4+ T','B','CD8+ T','NK','FCGR3A+ Mono',
                                   'NK','CD8+ T','DC','CD4+ T','Platelet')
names(cell.type) <- levels(pbmc)
pbmc <- RenameIdents(pbmc, cell.type)  #改变了Idents变量,没有改变meta.data
pbmc$celltype <- Idents(pbmc)          #将变量Idents赋值给了meta.data新的列
p1=DimPlot(pbmc, group.by="seurat_clusters", repel=T, label=T, 
           label.size=5, reduction='umap') + NoLegend()
p2=DimPlot(pbmc, group.by="celltype", repel=T, label=T, label.size=3, reduction='umap') + NoLegend()
p3=p1+p2
#ggsave("Vignette01/celltype_UMAP.png", p2, width=7 ,height=6)
ggsave("Vignette01/celltype.png", p3, width=10 ,height=5)
##保存pbmc
saveRDS(pbmc, 'pbmc_Vignette01.rds')
后面的代码有点问题 暂时还不知带怎么解决 菜狗哭泣。。。。


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

推荐阅读更多精彩内容

  • 1.简单,整齐2.一劳永逸3.做事分前,中,后4.有些事一次性解决避免出现变故5.人还是要看格局的关键时刻就差那么...
    莫忘小寒阅读 214评论 0 0
  • 明天上午有15个资源量,要提前安排好时间,合理分配,中午回来好好休息,做好劳逸结合,保量求质,尽量按照自己的安排和...
    365952205f16阅读 140评论 0 0
  • 京❤️达总店 杨顺永 2021年6月15日 落地真经严格就是爱,放纵既是害 6月总产值16万5 6月台词目标100...
    忠于我阅读 190评论 0 0
  • 我是黑夜里大雨纷飞的人啊 1 “又到一年六月,有人笑有人哭,有人欢乐有人忧愁,有人惊喜有人失落,有的觉得收获满满有...
    陌忘宇阅读 8,538评论 28 53
  • 信任包括信任自己和信任他人 很多时候,很多事情,失败、遗憾、错过,源于不自信,不信任他人 觉得自己做不成,别人做不...
    吴氵晃阅读 6,190评论 4 8