Seurat3 學(xué)習(xí)筆記

參考:

1.第六章 scRNA-seq數(shù)據(jù)分析
2.初生牛犢--模仿cell research (IF 17+) 文章的一張圖
3.Seurat包學(xué)習(xí)筆記(一):Guided Clustering Tutorial
4.2019-10-22 R語言Seurat包下游分析-1

image.png
目錄

1.數(shù)據(jù)下載
2.數(shù)據(jù)讀取
3.質(zhì)量控制
?3.1 載入注釋
?3.2 質(zhì)控及其細(xì)胞選取
4.標(biāo)準(zhǔn)化
5.高差異基因 (HVGs)
6. 二次標(biāo)準(zhǔn)化
?6.1 縮放的標(biāo)準(zhǔn)
?6.2 刪除不需要的數(shù)據(jù)
7. PCA 分析
8. 決定需要考慮的PC
9.細(xì)胞分集
10.降維后近迁,用聚類的類別可視化【UMAP/tSNE】
11.尋找分集標(biāo)記基因
12.對分集細(xì)胞進(jìn)行標(biāo)記


Seurat是一個常用的clustering的軟件包拴疤。它的最大貢獻(xiàn)在于將tSNE圖引入到scRNA-seq cluter的圖形化展示中來碍讨。tSNE是一種降維算法,它將多維的PCA分析降維到2維圖形中碱鳞,使用人們很方便的在二維圖形中區(qū)分不同類型的細(xì)胞。

安裝并加載所需的R包

  • 目前最新版的Seurat包都是基于3.0以上的踱蛀,可以直接通過install.packages命令進(jìn)行安裝窿给。
# 設(shè)置R包安裝鏡像
options(repos="https://mirrors.tuna.tsinghua.edu.cn/CRAN/")
install.packages('Seurat')
library(Seurat)
library(dplyr)
library(patchwork)
# 查看Seurat包的版本信息
packageVersion("Seurat")
  • 如果想安裝早期2.0版本的Seurat包可以通過devtools包進(jìn)行安裝
# 先安裝devtools包
install.packages('devtools')
# 使用devtools安裝指定版本的Seurat包
devtools::install_version(package = 'Seurat', version = package_version('2.3.4'))
library(Seurat)

Seurat的原教程

1.數(shù)據(jù)下載

  • 10X genomics 數(shù)據(jù)下載地址 : 可以在這里下載

  • 注釋文件: ensembl數(shù)據(jù)庫中下載 human gtf文件 。為下文計算每個細(xì)胞中不同類型的表達(dá)基因比例做裝備率拒。(如:編碼基因崩泡,線粒體基因,長鏈非編碼基因等等比例)

2.數(shù)據(jù)讀取

Seurat教程中就是10X Genomics數(shù)據(jù)猬膨。通過Read10X來讀取角撞。

image.png
library(Seurat)
library(dplyr)
library(ggplot2)
# 讀取Peripheral Blood Mononuclear Cells (PBMC)數(shù)據(jù)
# 解壓文件應(yīng)該是hg19文件夾,切換到這個目錄中:
setwd("C:/pbmc3k_filtered_gene_bc_matrices/filtered_gene_bc_matrices/hg19")
# 直接用Read10X 讀取文件。
pbmc.data <- Read10X(data.dir = "./")

pbmc是一個稀疏矩陣.用. 代替0,優(yōu)化內(nèi)存.

image.png

建立Seurat 對象

pbmc <- CreateSeuratObject(counts = pbmc.data, min.cells = 3, 
                           min.features = 200, project = "10X_PBMC")
  • counts = pbmc.data : 未標(biāo)準(zhǔn)化的數(shù)據(jù)寥掐,如原始計數(shù)或TPMs .
  • min.cells =3 : 基因過濾指標(biāo), 基因至少在3個細(xì)胞中表達(dá).
  • min.feature =200 : 細(xì)胞過濾指標(biāo)靴寂,一個細(xì)胞中表達(dá)基因至少有200.
  • project = "10X_PBMC" : 設(shè)置項(xiàng)目名稱,給每一個細(xì)胞打一個標(biāo)簽召耘,都是來自10X_PBMC 項(xiàng)目

獲得的pbmc 對象百炬,有13714個基因,2700個細(xì)胞用過了初始的質(zhì)控標(biāo)準(zhǔn)(min.cells =3;min.feature =200)

image.png

Tips: 對于拿到UMI計數(shù)表格的情況污它,我們只要能夠夠建好一個dgTMatrix就可以了剖踊。問題的關(guān)鍵是如何在有限的內(nèi)存下構(gòu)建dgTMatrix∩辣幔可以采取分段讀入的辦法德澈。

比如下面的方法:

library(Seurat)
library(Matrix)
nUMI.summary.file <- "data/umi_expression_matrix.tsv"
counts <- list()
con <- file(nUMI.summary.file, open="r")
## 讀取文件頭
header <- readLines(con, n=1, warn=FALSE)
header <- strsplit(header, "\\t")[[1]]
## 讀取計數(shù)
i <- 1
while(length(buf <- readLines(con, n=1e6, warn=FALSE))>0){
  buf <- as.matrix(read.delim(text=buf, header=FALSE, row.names=1))
  counts[[i]] <- Matrix(buf, sparse=TRUE)
  i <- i + 1
}
counts <- do.call(rbind, counts)
rownames(counts)[1:5]
colnames(counts) <- header
## 初始化一個Seurat對象
d <- CreateSeuratObject(counts = counts, min.cells = 10,
                        min.features = 200, project = "test_project")

3.質(zhì)量控制

質(zhì)量控制從一開始構(gòu)建Seurat對象的時候就已經(jīng)開始了。那個時候固惯, 我們依據(jù)的是基因表達(dá)的細(xì)胞數(shù)以及細(xì)胞內(nèi)被檢測到的基因數(shù)來進(jìn)行初步篩選的(min.cells =3;min.feature =200)梆造。 Seurat還提供了更多的篩選手段,比如線粒體DNA含量等葬毫。 所以需要gtf注釋文件镇辉,得到哪些基因是線粒體基因,哪些基因是編碼基因.

3.1 載入注釋

對于線粒體基因贴捡,通常為 MT-啟始的忽肛,所以人們常常用這一特點(diǎn)來標(biāo)定線粒體DNA。 但不是全部情形烂斋,下面是示例如何通過 ensembl GFF文件 進(jìn)行讀取文件屹逛。

library(rtracklayer)
# BiocManager::install("rtracklayer")
gtf <- import("Homo_sapiens.GRCh37.87.chr.gtf.gz")
gtf <- gtf[gtf$gene_name!=""]
gtf <- gtf[!is.na(gtf$gene_name)]

## protein coding
protein <- 
  gtf$gene_name[gtf$transcript_biotype %in% 
                  c("IG_C_gene", "IG_D_gene", "IG_J_gene", "IG_LV_gene", 
                    "IG_M_gene", "IG_V_gene", "IG_Z_gene", 
                    "nonsense_mediated_decay", "nontranslating_CDS", 
                    "non_stop_decay", "polymorphic_pseudogene", 
                    "protein_coding", "TR_C_gene", "TR_D_gene", "TR_gene", 
                    "TR_J_gene", "TR_V_gene")]


## mitochondrial genes
mito <- gtf$gene_name[as.character(seqnames(gtf)) %in% "MT"]


## long noncoding
lincRNA <- 
  gtf$gene_name[gtf$transcript_biotype %in% 
                  c("3prime_overlapping_ncrna", "ambiguous_orf", 
                    "antisense_RNA", "lincRNA", "ncrna_host", "non_coding", 
                    "processed_transcript", "retained_intron", 
                    "sense_intronic", "sense_overlapping")]

## short noncoding
sncRNA <- 
  gtf$gene_name[gtf$transcript_biotype %in% 
                  c("miRNA", "miRNA_pseudogene", "misc_RNA", 
                    "misc_RNA_pseudogene", "Mt_rRNA", "Mt_tRNA", 
                    "Mt_tRNA_pseudogene", "ncRNA", "pre_miRNA", 
                    "RNase_MRP_RNA", "RNase_P_RNA", "rRNA", "rRNA_pseudogene", 
                    "scRNA_pseudogene", "snlRNA", "snoRNA", 
                    "snRNA_pseudogene", "SRP_RNA", "tmRNA", "tRNA",
                    "tRNA_pseudogene", "ribozyme", "scaRNA", "sRNA")]

## pseudogene
pseudogene <- 
  gtf$gene_name[gtf$transcript_biotype %in% 
                  c("disrupted_domain", "IG_C_pseudogene", "IG_J_pseudogene", 
                    "IG_pseudogene", "IG_V_pseudogene", "processed_pseudogene", 
                    "pseudogene", "transcribed_processed_pseudogene",
                    "transcribed_unprocessed_pseudogene", 
                    "translated_processed_pseudogene", 
                    "translated_unprocessed_pseudogene", "TR_J_pseudogene", 
                    "TR_V_pseudogene", "unitary_pseudogene", 
                    "unprocessed_pseudogene")]

annotations <- list(protein=unique(protein), 
                    mito=unique(mito),
                    lincRNA=unique(lincRNA),
                    sncRNA=unique(sncRNA),
                    pseudogene=unique(pseudogene))


names(annotations )
annotations <- annotations[lengths(annotations)>0]

3.2 質(zhì)控及其細(xì)胞選取

# Seurat會計算基因數(shù)以及UMI數(shù) (nFeature and nCount).
# Seurat會將原始數(shù)據(jù)保存在RNA slot中础废,
# 每一行對應(yīng)一個基因,每一列對應(yīng)一個細(xì)胞.
slotNames(pbmc)
##  [1] "assays"       "meta.data"    "active.assay" "active.ident" "graphs"      
##  [6] "neighbors"    "reductions"   "project.name" "misc"         "version"     
## [11] "commands"     "tools"
names(pbmc@assays) ## Assays(pbmc)
## [1] "RNA"

head(Idents(pbmc)) ## 查看一下當(dāng)前的細(xì)胞分組
## AAACATACAACCAC AAACATTGAGCTAC AAACATTGATCAGC AAACCGTGCTTCCG AAACCGTGTATGCG 
##       10X_PBMC       10X_PBMC       10X_PBMC       10X_PBMC       10X_PBMC 
## AAACGCACTGGTAC 
##       10X_PBMC 
## Levels: 10X_PBMC

下面將運(yùn)用到注釋文件罕模,計算每一個細(xì)胞中各種類型基因评腺,占所有基因比例。比如說編碼基因比例0.85淑掌,線粒體基因比例0.10等等歇僧。

  • PercentageFeatureSet : 函數(shù)就是計算各種基因所占比例
# 在計算比例時,使用目標(biāo)基因中的數(shù)值除以總的數(shù)值锋拖。
# `[[`運(yùn)算符可以給metadata加column.
percent <- lapply(annotations, function(.ele){
  PercentageFeatureSet(pbmc, features = rownames(pbmc)[rownames(pbmc) %in% .ele])
})

# AddMetaData 會在object@meta.data中加一列诈悍。這些信息都會在QC中使用到。
for(i in seq_along(percent)){
  pbmc[[paste0("percent.", names(percent)[i])]] <- percent[[i]]
}
  • 也可以手動對meta.data進(jìn)行編輯. 添加一列對細(xì)胞進(jìn)行標(biāo)示(s_A,s_B)
id <- sample(c("s_A", "s_B"), nrow(pbmc@meta.data), replace = TRUE)
names(id) <- rownames(pbmc@meta.data) #必須有names
pbmc@meta.data$f1 <- id

注釋后結(jié)果如下:

head(pbmc@meta.data)

##                orig.ident nCount_RNA nFeature_RNA percent.protein percent.mito
## AAACATACAACCAC   10X_PBMC       2419          779        97.02356    3.0177759
## AAACATTGAGCTAC   10X_PBMC       4903         1352        96.45115    3.7935958
## AAACATTGATCAGC   10X_PBMC       3147         1129        93.83540    0.8897363
## AAACCGTGCTTCCG   10X_PBMC       2639          960        98.78742    1.7430845
## AAACCGTGTATGCG   10X_PBMC        980          521        96.53061    1.2244898
## AAACGCACTGGTAC   10X_PBMC       2163          781        91.77069    1.6643551
##                percent.lincRNA percent.sncRNA percent.pseudogene  f1
## AAACATACAACCAC        84.82844     0.20669698                  0 s_B
## AAACATTGAGCTAC        86.33490     0.12237406                  0 s_A
## AAACATTGATCAGC        84.30251     0.09532888                  0 s_A
## AAACCGTGCTTCCG        75.74839     0.07578628                  0 s_B
## AAACCGTGTATGCG        76.73469     0.30612245                  0 s_B
## AAACGCACTGGTAC        86.54646     0.04623209                  0 s_A

orig.ident 是細(xì)胞標(biāo)示.初始化seurat 時候兽埃,orig.ident 為10x_pbmc 侥钳, 當(dāng)我們需要改變orig.ident時,我們需要改變的是ident slot.

# 試著改變分組柄错。
olID <- Idents(pbmc)
Idents(pbmc) <- as.factor(id)

head(Idents(pbmc))
## AAACATACAACCAC AAACATTGAGCTAC AAACATTGATCAGC AAACCGTGCTTCCG AAACCGTGTATGCG 
##            s_B            s_A            s_A            s_B            s_B 
## AAACGCACTGGTAC 
##            s_A 
## Levels: s_A s_B

Idents(pbmc) <- olID ## 變回來

Tips : 上面是通過自己gtf中提取信息舷夺,進(jìn)行注釋,同時Seurat 里面也可以大體上按照特征進(jìn)行標(biāo)記.

pbmc[["percent.mt"]] <- PercentageFeatureSet(pbmc, pattern = "^MT-")

可視化開始啦~

  1. 【一維可視化】對上面pbmc 所有注釋的信息售貌,進(jìn)行可視化
VlnPlot(object = pbmc, 
        features = c("nFeature_RNA", "nCount_RNA",
                      paste0("percent.", names(percent))), 
        ncol = 4)

可以看到各種特征分布情況给猾,進(jìn)行設(shè)置特征的閾值,過濾細(xì)胞颂跨。

  • nFeature_RNA :每個細(xì)胞中檢測到的基因數(shù)目分布情況敢伸。
  • nCount_RNA : 每個細(xì)胞中檢測到的read 數(shù)目分布情況。
  • percent.protein : 每個細(xì)胞中編碼蛋白基因所占比例分布情況恒削。
  • percent.mito : 每個細(xì)胞中線粒體相關(guān)基因所占比例分布情況池颈。
  • ......
image.png
  1. 【二維可視化】選取兩個特征進(jìn)行畫圖 : FeatureScatter

    # FeatureScatter是一個用來畫點(diǎn)圖的工具,可以比較不同的metadata钓丰。
    plot1 <- FeatureScatter(pbmc, feature1 = "nCount_RNA", feature2 = "percent.mito")
    plot2 <- FeatureScatter(pbmc, feature1 = "nCount_RNA", feature2 = "nFeature_RNA")
    plot1 + plot2
    
    image.png

開始真正的細(xì)胞過濾啦~

從VlnPlot中躯砰,我們可以得到大多數(shù)細(xì)胞集中的范圍,通過這些信息携丁,可以設(shè)置過濾條件琢歇。
比如可以使用unique gene counts, percent.protein, percentage.mito來進(jìn)行過濾。
這里我們設(shè)置了200 < nGene < 2500, 0.90 < percent.protein < Inf, -Inf < percent.mito < 0.05.

## 查看維度信息
dim(pbmc)
## [1] 13714  2700

## 開始過濾
pbmc <- subset(x = pbmc, 
               subset = nFeature_RNA > 200 & nFeature_RNA < 2500 &
                 percent.protein > 95 &
                 percent.mito < 5) ## something wrong
## 查看維度信息
dim(pbmc)
## [1] 13714  2142

4.標(biāo)準(zhǔn)化

標(biāo)準(zhǔn)化是一個比較簡單的過程梦鉴,使用的是"logNormalize", 就是將每個基因的表達(dá)量對該細(xì)胞總表達(dá)量進(jìn)行平衡李茫,然后乘以一個因子(scale factor, 默認(rèn)值為10,000), 然后中進(jìn)行對數(shù)轉(zhuǎn)換。

pbmc <- NormalizeData(pbmc)
# 等同于
pbmc <-  NormalizeData(seurat.obj, 
                            normalization.method = "LogNormalize", scale.factor = 10000)
# 方法是LogNormalize
# scale.factor是它默認(rèn)的  

5.高差異基因 (HVGs)

在單細(xì)胞測序中尚揣,有些基因會在不同的細(xì)胞表現(xiàn)出高度的差異表達(dá)涌矢。Seurate可以對這些基因進(jìn)行標(biāo)記掖举。

? 如果手動計算快骗,相當(dāng)于計算變異系數(shù),而不是標(biāo)準(zhǔn)差。因?yàn)闃?biāo)準(zhǔn)差對于數(shù)據(jù)呈現(xiàn)對稱分布方篮,及單峰情況體現(xiàn)差異比較好名秀,但是對于雙峰情況,變異系數(shù)cv 可能更好藕溅。

  • Tips:

    使用FindVariableFeatures完成差異分析匕得,選擇數(shù)據(jù)集中差異較高的特征基因(默認(rèn)2000)并用于下游分析。 FindVariableFeatures 在2.0是FindVariablegene巾表。包更新的很快.

pbmc <- FindVariableFeatures(pbmc, selection.method = "vst", 
                             nfeatures = 2000)
# 找到變化最大的十個基因
top10 <- head(VariableFeatures(pbmc), 10)

top10
##  [1] "PPBP"   "GNLY"   "S100A9" "LYZ"    "IGLL5"  "PF4"    "FTL"    "FTH1" 
##  [9] "GNG11"  "FCER1A"
  • selection.method : 默認(rèn)是“vst” ,也可以選擇"roc"
  • nfeatures : 需要得到多少個高變異的基因汁掠。此處為2000個基因,下圖可視化中標(biāo)紅的基因集币。

對HVGs 進(jìn)行可視化

plot1 <- VariableFeaturePlot(pbmc)
LabelPoints(plot = plot1, points = top10, repel = TRUE)
  • 紅色的HVGs 有2000個考阱,從上面 FindVariableFeatures ,命令參數(shù)就可以知道.
image.png

6. 二次標(biāo)準(zhǔn)化

從上圖中鞠苟,我們可以看到很多基因都表現(xiàn)出很大的差異性乞榨,但是這些差異性并不一定都是事實(shí),有些可能是因?yàn)閷?shí)驗(yàn)当娱,或者數(shù)據(jù)采集的方式導(dǎo)入的吃既。因此人們想盡量的消除這些因素帶來的差異。這些差異有可能是因?yàn)閎atch-effect跨细, 或者cell alignment rate鹦倚,或者其它。這些因素都可以寫入metadata中冀惭,然后通過ScaleData函數(shù)來消除申鱼。 

? ScaleData 可以通過metadata信息,消除很多其他因素影響云头。

6.1 縮放的標(biāo)準(zhǔn)

? 應(yīng)用線性變換縮放數(shù)據(jù)捐友,這是一個標(biāo)準(zhǔn)的預(yù)處理步驟,比PCA等降維技術(shù)更重要溃槐。使用ScaleData函數(shù):
(1)使每個基因在所有細(xì)胞間的表達(dá)量均值為0
(2)使每個基因在所有細(xì)胞間的表達(dá)量方差為1

縮放操作給予下游分析同等的權(quán)重匣砖,這樣高表達(dá)基因就不會占主導(dǎo)地位,其結(jié)果存儲在pbmc[["RNA"]]@scale.data中昏滴,這里默認(rèn)ScaleData 進(jìn)行了中心化猴鲫,標(biāo)準(zhǔn)化.

## 全局縮放
all.genes <- rownames(pbmc)
pbmc <- ScaleData(object = pbmc, features = all.genes)
head(pbmc[["RNA"]]@scale.data[, 1:3])
##               AAACATACAACCAC AAACATTGAGCTAC AAACCGTGCTTCCG
## AL627309.1       -0.06452497    -0.06452497    -0.06452497
## AP006222.2       -0.03726409    -0.03726409    -0.03726409
## RP11-206L10.2    -0.04153370    -0.04153370    -0.04153370
## RP11-206L10.9    -0.03734170    -0.03734170    -0.03734170
## LINC00115        -0.08343360    -0.08343360    -0.08343360
## NOC2L            -0.32126699    -0.32126699    -0.32126699

6.2 刪除不需要的數(shù)據(jù)

使用ScaleData函數(shù)從單細(xì)胞數(shù)據(jù)集中刪除不需要的變量。例如谣殊,我們可以“regress out”與細(xì)胞周期階段或線粒體污染相關(guān)的異質(zhì)性(去除不需要的變量拂共,即校正協(xié)變量,校正線粒體基因比例的影響)姻几。如下:

# 刪除不需要的數(shù)據(jù)宜狐,校正線粒體基因引起的影響
# 這個步驟非常耗時
pbmc <- ScaleData(pbmc, vars.to.regress = "percent.mt")

Tips

我們對矩陣進(jìn)行了細(xì)胞水平質(zhì)控势告,但是如何對基因進(jìn)行質(zhì)控,當(dāng)然我們創(chuàng)建seurat 對象時候抚恒,已經(jīng)設(shè)定一個cutoff. 基因必須早多少個細(xì)胞中表達(dá). 但是如果直接用這些基因進(jìn)行聚類和降維(T-sne/UMAP 可視化 可能引起偏差咱台,所以需要先進(jìn)行一下PCA 初步選取主要的主成分,對應(yīng)著權(quán)重不同的基因俭驮,再用這些基因進(jìn)行聚類回溺,降維可視化效果更好)

7. PCA 分析

在PCA分析中,前文標(biāo)記的高差異基因object@var.genes會拿來做分析的數(shù)據(jù)混萝。當(dāng)然人們也可以指定自己希望的使用的基因遗遵。當(dāng)細(xì)胞數(shù)越多,使用標(biāo)記的高差異基因越接近考慮全基因組時得到的結(jié)論逸嘀。所以瓮恭,在這一步的時候我們可以看出,之前標(biāo)記的高差異基因如果數(shù)量過低的話厘熟,會對這一步的影響很大屯蹦。

pbmc <- RunPCA(object = pbmc, features = VariableFeatures(pbmc))

## PC_ 1 
## Positive:  CST3, TYROBP, AIF1, FTL, LST1, FTH1, LYZ, FCER1G, TYMP, FCN1 
##        S100A9, CFD, LGALS1, CTSS, SERPINA1, S100A8, LGALS2, COTL1, PSAP, IFITM3 
##        SPI1, SAT1, CFP, S100A11, NPC2, IFI30, LGALS3, GSTP1, S100A6, OAZ1 
## Negative:  LTB, IL32, IL7R, CD2, B2M, ACAP1, STK17A, CTSW, AQP3, GIMAP5 
##        RARRES3, CCL5, HOPX, GZMA, SELL, CST7, PPP2R5C, BEX2, CD8B, MYC 
##        TNFAIP8, ETS1, GZMK, TCF7, ZAP70, RORA, PRF1, KLRG1, GIMAP7, LDLRAP1 
......
......
......
## PC_ 5 
## Positive:  LTB, IL7R, CKB, VIM, AQP3, MS4A7, CYTIP, RGS10, RP11-290F20.3, CD2 
##        SIGLEC10, HMOX1, HN1, NDUFA4, ATP1A1, TRADD, LILRB2, PTGES3, FYB, ANXA5 
##        TCF7, CORO1B, FAM110A, IL32, ABRACL, PPA1, TIMP1, GDI2, GIMAP7, VMO1 
## Negative:  GZMB, FGFBP2, NKG7, GNLY, CST7, PRF1, CCL4, GZMA, SPON2, GZMH 
##        S100A8, XCL2, CTSW, CLIC3, AKR1C3, CCL5, CCL3, IGFBP7, XCL1, S100A9 
##        LGALS2, GPR56, HOPX, TTC38, GSTP1, RBP7, TYROBP, CD14, S100A12, MS4A6A

Seurat提供了多種手段來查看PCA分析的結(jié)果,其中包括PrintPCA, VizPCA, PCAPlot, 以及PCHeatmap

【一維可視化】 對每一個維度绳姨,權(quán)重較大的基因進(jìn)行可視化

VizDimLoadings(pbmc, dims = 1:2, reduction = "pca")
image.png

【二維可視化】 將細(xì)胞降維到二維空間

DimPlot(object = pbmc, reduction = "pca")
image.png

Tips: 下圖以PC_1 來看登澜,是解釋細(xì)胞分布最大的基因組合方向,所有的基因是維度飘庄,有些基因?qū)@個方向共享很大袱衷,也就是說更容易分開細(xì)胞丹禀,這些基因可能更加重要斋扰。下面是熱圖1展示這些基因?qū)τ趨^(qū)分細(xì)胞的效果陵刹,可以看到將很多細(xì)胞區(qū)分成紫色和黃色.效果不錯.

可以看到5,6維度貌似區(qū)分不開了.

DimHeatmap(pbmc, dims = 1:12, cells = 500, balanced = TRUE)
image.png

8. 決定需要考慮的PC

Suerat使用了jackStraw方法[4]來估計應(yīng)該使用多少個principal components的基因來進(jìn)行下游分析。

# 注意: 這可能是一個非常費(fèi)時的過程碾盐。
pbmc <- JackStraw(pbmc, num.replicate = 100)  # 重復(fù)一百次
pbmc <- ScoreJackStraw(pbmc, dims = 1:20)     # 選擇20個PC

JackStrawPlot以及PCElbowPlot函數(shù)提供給我們兩種可視化手段來查看jackStraw的結(jié)果晃跺。使用JackStrawPlot可以查看每個PC的p value,這樣方便我們通過p值進(jìn)行篩選毫玖。PCElbowPlot可以方便的查看從哪個PC開始掀虎,差分度就進(jìn)入的平臺期。

  • 1.JackStrawPlot
JackStrawPlot(pbmc, dims = 1:15)
image.png
  • 2.PCElbowPlot : 拐點(diǎn)圖 # 最大可設(shè)置到50

    ElbowPlot(pbmc,ndims = 50, reduction = "pca")   # 最大可設(shè)置到50
    

    可以直觀看到7 后面共享比較平均.

image.png

先擇PC付枫,對于得到正確的結(jié)果具體關(guān)鍵性的作用烹玉。除了上面的方法以外,還可以使用其它的一些辦法阐滩,比如說使用GSEA等富集分析的辦法來選擇PC二打,或者說使用一個隨機(jī)模型來查看具體哪些PC會比較有效果。但是后者這一方法在實(shí)現(xiàn)起來需要消耗過多的資源掂榔。

在本例中继效,因?yàn)槭荢eurat挑選的例子症杏,所以通過上面的JackStraw方法,只要把cut.off值設(shè)置在7-10之間莲趣,就可以得到差不多的結(jié)果。

Tips: 確定進(jìn)行聚類和降維的基因和細(xì)胞后饱溢,下一步就是聚類了喧伞,在這里需要搞情況聚類和降維作用是不一樣的。特別是T-sne是降維可視化作用绩郎,而不是用它來聚類.為什么看到T-sne 圖是不同顏色的色塊呢潘鲫?常見的聚類包括kmeans/hclust .

9.細(xì)胞分集

當(dāng)決定了使用哪些PC中的基因?qū)?xì)胞進(jìn)行分類之后,就可以使用FindClusters來對細(xì)胞分集了肋杖。分集后的結(jié)果會保存在object@ident slot中溉仑。

(Step-1)先在PCA空間中構(gòu)造一個基于歐氏距離的KNN圖,然后根據(jù)任意兩個細(xì)胞在局部鄰近區(qū)域的共享重疊(Jaccard相似性)來細(xì)化它們之間的邊權(quán)值状植。此步驟使用FindNeighbors函數(shù)執(zhí)行浊竟,并將之前定義的數(shù)據(jù)集維度作為輸入。
(Step-2)使用FindClusters函數(shù)對數(shù)據(jù)進(jìn)行優(yōu)化津畸,并包含一個分辨率參數(shù)振定,該參數(shù)設(shè)置下游集群的“granularity”,增加的值將導(dǎo)致更多的集群肉拓。將該參數(shù)設(shè)置在0.4-1.2之間后频,對于3K左右的單細(xì)胞數(shù)據(jù)集通常會得到良好的結(jié)果。對于較大的數(shù)據(jù)集暖途,最佳分辨率通常會增加卑惜。可以使用Idents函數(shù)找到clusters驻售。

? 下面選取了1到10 維度的基因進(jìn)行聚類分析

pbmc <- FindNeighbors(pbmc, dims = 1:10)  ## dims 作為輸入的維度
pbmc <- FindClusters(pbmc, resolution = 0.6)  ## 分辨率參數(shù)露久,和cluster 個數(shù)有關(guān)系,如何你想獲得粗糙的分類欺栗,需要調(diào)成大一些.
# 查看一下前幾個的cluster,結(jié)果聚成3類.可能發(fā)現(xiàn)新的細(xì)胞系.
head(Idents(pbmc), 5)

## AAACATACAACCAC AAACATTGAGCTAC AAACCGTGCTTCCG AAACCGTGTATGCG AAACGCTGGTTCTT 
##              4              3              0              6              4 
## Levels: 0 1 2 3 4 5 6 7 8

10.降維后抱环,用聚類的類別可視化【UMAP/tSNE】

使用UMAP或者tSNE的好處在于將多維的PC圖降維至2維圖像中來,這樣方便分集細(xì)胞的可視化纸巷。 UMAP皺縮成團(tuán)分不開镇草,而tSNE圖則分散得多。

pbmc <- RunUMAP(pbmc, dims = 1:10)
P1 <- DimPlot(pbmc, reduction = "umap", label = TRUE)
pbmc <- RunTSNE(pbmc, dims = 1:10)
P2 <- DimPlot(pbmc, reduction = "tsne",label = TRUE)
P1 + P2
image.png

得到聚類分組結(jié)果瘤旨,通常需要繼續(xù)分析梯啤,在每組里面那些標(biāo)記基因。由于10x genomic 對每一個細(xì)胞都進(jìn)行標(biāo)簽化存哲,不知道每一個標(biāo)簽對應(yīng)那種細(xì)胞因宇,可以通過每組的標(biāo)記基因?qū)γ拷M進(jìn)行細(xì)胞類型判別(根據(jù)文獻(xiàn)說明的已知marker),進(jìn)而發(fā)現(xiàn)新的標(biāo)記基因.

11.尋找分集標(biāo)記基因

生成了tSNE圖像后七婴,我們還需要確認(rèn)這一堆堆的細(xì)胞都分別是些什么細(xì)胞,這時察滑,可以使用特定細(xì)胞的marker來對不同的細(xì)胞群進(jìn)行標(biāo)記打厘。但是想要對它們進(jìn)行標(biāo)記,首先需要得到每個集群差異表達(dá)的基因贺辰。

在比較時户盯,Seurat使用一比多的辦法。如果需要對cluster 1的細(xì)胞(ident.1)進(jìn)行差異分析時饲化,它比較的對象將是除了cluster 1以外的其它所有的細(xì)胞莽鸭。也可以使用ident.2參數(shù)來傳遞需要比較的對象。 在FindMarkers函數(shù)中吃靠,min.pct是指的marker基因所占細(xì)胞數(shù)的最低比例硫眨,這里使用1/4。 使用max.cells.per.ident可以讓函數(shù)對細(xì)胞進(jìn)行抽樣巢块,以加速計算礁阁。 FindAllMarkers可以一次性找到所有的高表達(dá)的marker。

# find all markers of cluster 1
cluster1.markers <- FindMarkers(object = pbmc, ident.1 = 1, min.pct = 0.25)
head(cluster1.markers, n = 5)
##               p_val avg_logFC pct.1 pct.2     p_val_adj
## RPS12 4.371171e-118 0.5264969     1 0.990 5.994624e-114
## RPS6  1.681008e-114 0.5234111     1 0.994 2.305334e-110
## RPS27 1.719993e-107 0.5242477     1 0.991 2.358799e-103
## RPS14 1.546910e-105 0.4500125     1 0.993 2.121432e-101
## RPS25  5.848778e-98 0.5427189     1 0.973  8.021015e-94
# find all markers distinguishing cluster 5 from clusters 0 and 3
cluster5.markers <- FindMarkers(object = pbmc, ident.1 = 5, 
                                ident.2 = c(0,3), min.pct = 0.25)
head(cluster5.markers, n = 5)
##                p_val avg_logFC pct.1 pct.2     p_val_adj
## FCGR3A 3.849393e-139  2.723391 0.981 0.098 5.279058e-135
## RHOC    1.149445e-91  1.665090 0.865 0.130  1.576350e-87
## CDKN1C  6.799344e-75  1.061123 0.519 0.022  9.324621e-71
## IFITM2  1.347125e-73  1.560680 1.000 0.644  1.847448e-69
## HES4    3.616785e-69  1.107357 0.596 0.052  4.960059e-65

計算所有類和其他類的標(biāo)記基因

# find markers for every cluster compared to all remaining cells, 
# report only the positive ones
pbmc.markers <- FindAllMarkers(object = pbmc, only.pos = TRUE, 
                               min.pct = 0.25, thresh.use = 0.25)
pbmc.markers %>% group_by(cluster) %>% top_n(n = 2, wt = avg_logFC)
## # A tibble: 18 x 7
## # Groups:   cluster [9]
##        p_val avg_logFC pct.1 pct.2 p_val_adj cluster gene    
##        <dbl>     <dbl> <dbl> <dbl>     <dbl> <fct>   <chr>   
##  1 0.            3.72  0.969 0.136 0.        0       S100A8  
##  2 6.30e-298     3.77  0.996 0.236 8.63e-294 0       S100A9  
##  3 7.44e- 94     0.807 0.938 0.587 1.02e- 89 1       LDHB    
##  4 3.14e- 61     0.848 0.426 0.105 4.31e- 57 1       CCR7    
##  5 1.22e- 80     0.975 0.981 0.635 1.67e- 76 2       LTB     
##  6 5.02e- 69     0.956 0.783 0.315 6.88e- 65 2       IL7R    
##  7 0.            2.95  0.931 0.045 0.        3       CD79A   
##  8 5.62e-214     2.46  0.617 0.024 7.71e-210 3       TCL1A   
##  9 3.86e-164     2.39  0.973 0.22  5.30e-160 4       CCL5    
## 10 2.97e-142     2.12  0.595 0.052 4.07e-138 4       GZMK    
## 11 1.66e-171     2.34  0.981 0.135 2.27e-167 5       FCGR3A  
## 12 1.68e-106     1.90  1     0.368 2.30e-102 5       LST1    
## 13 2.24e-211     3.48  0.972 0.063 3.07e-207 6       GZMB    
## 14 1.84e-127     3.52  0.943 0.138 2.52e-123 6       GNLY    
## 15 1.11e-180     2.68  0.806 0.013 1.52e-176 7       FCER1A  
## 16 5.01e- 20     1.93  1     0.548 6.87e- 16 7       HLA-DPB1
## 17 4.08e-171     5.02  1     0.012 5.60e-167 8       PF4     
## 18 6.09e- 99     5.96  1     0.026 8.35e- 95 8       PPBP

還可以使用不同的算法來尋找差異表達(dá)的基因族奢。

cluster1.markers <- FindMarkers(object = pbmc, ident.1 = 0, 
                                thresh.use = 0.25, test.use = "roc", 
                                only.pos = TRUE)

想了解更多關(guān)于查找差異表達(dá)基因的信息氮兵,可以查看Seurat的vignette

【一維可視化】標(biāo)記基因在不同cluster 表達(dá)量

拿到差異表達(dá)基因后歹鱼,可以使用VlnPlot來查看結(jié)果泣栈。

VlnPlot(object = pbmc, features = c("MS4A1", "CD79A"))
image.png
# you can plot raw UMI counts as well
VlnPlot(object = pbmc, features= c("NKG7", "PF4"), 
        slot = "counts", log = TRUE)
image.png
## RidgePlot
RidgePlot(pbmc, features = c("MS4A1", "GNLY", "CD3E", "CD14", "FCER1A", "FCGR3A", "LYZ", "PPBP", "CD8A"))

## DotPlot
DotPlot(pbmc, features = c("MS4A1", "GNLY", "CD3E", "CD14", "FCER1A", "FCGR3A", "LYZ", "PPBP", "CD8A"))

【二維可視化】標(biāo)記基因在不同細(xì)胞表達(dá)量

FeaturePlot(object = pbmc, 
            features = c("MS4A1", "GNLY", "CD3E", "CD14", "FCER1A", 
                         "FCGR3A", "LYZ", "PPBP", "CD8A"), 
            cols = c("blue", "red"))
image.png

提取所有cluster 的top10 標(biāo)記基因可視化

top10 <- pbmc.markers %>% group_by(cluster) %>% top_n(n = 10, wt = avg_logFC)
# 設(shè)置slim.col.label=TRUE將避免打印每個細(xì)胞的名稱,而只打印cluster的ID.
DoHeatmap(object = pbmc, features = top10$gene) + NoLegend()
image.png

目前我們通過聚類知道了弥姻,將細(xì)胞分成8個類別南片,但是并不知道具體是那種細(xì)胞。所有需要進(jìn)一步通過已知的特定細(xì)胞標(biāo)記基因?qū)luster 打上細(xì)胞類型標(biāo)簽.

12.對分集細(xì)胞進(jìn)行標(biāo)記

對于示例數(shù)據(jù)庭敦,我們已經(jīng)有一些比較常見的細(xì)胞marker了疼进,很方便的就可以對分集的細(xì)胞進(jìn)行標(biāo)記了。

Cluster ID Markers Cell Type
0 IL7R, CCR7 Naive CD4+ T
1 IL7R, S100A4 Memory CD4+
2 CD14, LYZ CD14+ Mono
3 MS4A1 B
4 CD8A CD8+ T
5 FCGR3A, MS4A7 FCGR3A+ Mono
6 GNLY, NKG7 NK
7 FCER1A, CST3 DC
8 PPBP Platelet

將原來的cluster 1-8 秧廉,修改成對應(yīng)的細(xì)胞名稱

new.cluster.ids <- c("Naive CD4 T", "Memory CD4 T", 
                     "CD14+ Mono", "B", "CD8 T", 
                     "FCGR3A+ Mono", 
                     "NK", "DC", "Platelet")
names(new.cluster.ids) <- levels(pbmc)
pbmc <- RenameIdents(pbmc, new.cluster.ids)

P1 <- DimPlot(pbmc, reduction = "umap", label = TRUE, pt.size = 0.5) + NoLegend()
P2 <- DimPlot(pbmc, reduction = "tsne", label = TRUE, pt.size = 0.5) + NoLegend()
P1 + P2
image.png

當(dāng)我們修改了聚類的參數(shù)伞广,結(jié)果會不同。比如分辨率參數(shù).

# 生成一個快照, 其實(shí)就是把pbmc@ident中的數(shù)據(jù)拷貝到pbmc@meta.data中疼电。
# 當(dāng)我們想把pbmc@meta.data中的值賦值給pbmc@ident的話嚼锄,可以使用SetAllIdent函數(shù)。
# 比如pbmc <- SetAllIdent(object=pbmc, id = 'orig.ident')
pbmc <- StashIdent(object = pbmc, save.name = "ClusterNames_0.6")

# 現(xiàn)在我們使用不同的resolution來重新分群蔽豺。當(dāng)我們提高resolution的時候区丑,
# 我們可以得到更多的群。
# 之前我們在FindClusters中設(shè)置了save.snn=TRUE,所以可以不用再計算SNN了沧侥。
# 下面就直接提高一下區(qū)分度可霎,設(shè)置resolution = 0.8
pbmc <- FindClusters(pbmc, resolution = 0.8)

分辨率左圖是0.8,右圖0.6

# 并排畫兩個tSNE,右邊的是用ClusterNames_0.6 (resolution=0.6) 來分組顏色的宴杀。
# 我們可以看到當(dāng)resolution提高之后癣朗,CD4 T細(xì)胞被分成了兩個亞群。
plot1 <- DimPlot(object = pbmc, reduction = "umap", label = TRUE) + NoLegend()
plot2 <- DimPlot(object = pbmc, reduction = "umap", label = TRUE,
                 group.by = "ClusterNames_0.6") +
  NoLegend()
plot1 + plot2
image.png

類別不同旺罢,我們又可以按照這一次聚類結(jié)果旷余,尋找marker基因

# 我們再一次尋找不同分集中的marders。
tcell.markers <- FindMarkers(object = pbmc, ident.1 = 0, ident.2 = 1)

# Most of the markers tend to be expressed in C1 (i.e. S100A4). 
# However, we can see that CCR7 is upregulated in 
# C0, strongly indicating that we can differentiate memory from naive CD4 cells.
# cols.use demarcates the color palette from low to high expression
FeaturePlot(object = pbmc, features = c("S100A4", "CCR7"), 
            cols = c("blue", "red"))
image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末主经,一起剝皮案震驚了整個濱河市荣暮,隨后出現(xiàn)的幾起案子庭惜,更是在濱河造成了極大的恐慌罩驻,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件护赊,死亡現(xiàn)場離奇詭異惠遏,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)骏啰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進(jìn)店門节吮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人判耕,你說我怎么就攤上這事透绩。” “怎么了壁熄?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵帚豪,是天一觀的道長。 經(jīng)常有香客問我草丧,道長狸臣,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任昌执,我火速辦了婚禮烛亦,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘懂拾。我一直安慰自己煤禽,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布岖赋。 她就那樣靜靜地躺著呜师,像睡著了一般。 火紅的嫁衣襯著肌膚如雪贾节。 梳的紋絲不亂的頭發(fā)上汁汗,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天衷畦,我揣著相機(jī)與錄音,去河邊找鬼知牌。 笑死祈争,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的角寸。 我是一名探鬼主播菩混,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼扁藕!你這毒婦竟也來了沮峡?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤亿柑,失蹤者是張志新(化名)和其女友劉穎邢疙,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體望薄,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡疟游,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了痕支。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片颁虐。...
    茶點(diǎn)故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖卧须,靈堂內(nèi)的尸體忽然破棺而出另绩,到底是詐尸還是另有隱情,我是刑警寧澤花嘶,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布笋籽,位于F島的核電站,受9級特大地震影響察绷,放射性物質(zhì)發(fā)生泄漏干签。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一拆撼、第九天 我趴在偏房一處隱蔽的房頂上張望容劳。 院中可真熱鬧,春花似錦闸度、人聲如沸竭贩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽留量。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間楼熄,已是汗流浹背忆绰。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留可岂,地道東北人错敢。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像缕粹,于是被迫代替她去往敵國和親稚茅。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評論 2 355

推薦閱讀更多精彩內(nèi)容