Seurat應用筆記 數(shù)據(jù)為Seurat官網(wǎng)示范數(shù)據(jù)
library(Seurat)
library(dplyr)
library(magrittr)
每次重新進入R都要重新library包
每次得到什么中間結(jié)果可以
save.image("保存路徑")
或者直接點environment左上方的保存按鈕
(當然可以一開始用setwd設(shè)定好工作位置,然后調(diào)用save.image的時候就可以直接用“文件名+.RData”的形式),就可以對每次的數(shù)據(jù)分開保存。
load的作用就是把一個RData類型文件載入到environment中,這樣變量就全部在當前環(huán)境下,可以直接使用
setwd("運行環(huán)境位置")
單細胞數(shù)據(jù)文件分類:
由單細胞得的10x數(shù)據(jù),怎么處理?
code1:
matrix <- Read10X_h5("filtered_gene_bc_matrices_h5.h5")
該函數(shù)直接讀取10x的h5文件,并且得到一個matrix矩陣
code2:
matrix <- Read10X("data/matrix_dir")
默認讀取運行環(huán)境中的 data/matrix_dir目錄下包含文件,如果要讀取運行環(huán)境之外的文件,就要從頭什么盤開始輸入位置。
包括matrix.mtx, genes.tsv, and barcodes.tsv 把他們都放到matrix中
導入文件后用Seurat包處理
pbmc <-CreateSeuratObject(raw.data = matrix,min.cells = 3,
min.genes = 200, project = "NAME")
創(chuàng)建一個叫做"pbmc"的東西,是SeuratObject。
其中命名raw.data為以上matrix(有的代碼中命名不同,或者一開始導入的時候不以matrix形式導入,而以counts形式,總之這里raw.data = matrix可寫“你要創(chuàng)建的文件的名字”=“你前面導入東西的名字”);基因至少在min.cells個細胞中表達;每個細胞中至少表達min.genes個基因,可以自己設(shè)定;project的命名自己定義就好。
之后Seurat將數(shù)據(jù)保存在不同的slot中,如pbmc@raw.data, pbmc@data, pbmc@meta.data, pbmc@ident,其中raw.data存放的是每個細胞中每個gene的原始UMI數(shù)據(jù),data存放的是gene的表達量,meta.data存放的是每個細胞的統(tǒng)計數(shù)據(jù)如UMI數(shù)目,gene數(shù)目等,ident此時存放的是project信息。
由于技術(shù)原因,一個GEM(單細胞測試的油包水滴)中可能會包含2個或多個細胞,也可能不包含細胞,這時候可以通過觀察每個barcode中的基因數(shù)目或UMI數(shù)目來判斷。
處理篩掉異常GEM的方法:
- 可以計算每個barcode中的線粒體基因含量等,從而更加仔細的觀察數(shù)據(jù)的質(zhì)量。
pbmc[["percent.mt"]] <- PercentageFeatureSet(pbmc, pattern = "^mt-")
mt-開頭的是線粒體基因,這里將其進行標記并統(tǒng)計其分布頻率
VlnPlot(object = pbmc, features = c("nFeature_RNA", "nCount_RNA", "percent.mt"), ncol = 3)
pbmc <- subset(pbmc, subset = nFeature_RNA > 200 & nFeature_RNA < 2500 & percent.mt < 5)
plot1 <- FeatureScatter(pbmc, feature1 = "nCount_RNA", feature2 = "percent.mt")+ NoLegend()
plot2 <- FeatureScatter(pbmc, feature1 = "nCount_RNA", feature2 = "nFeature_RNA")+ NoLegend()
CombinePlots(plots = list(plot1, plot2))
以上對 pbmc 對象做小提琴圖,分別為基因數(shù),細胞數(shù)和線粒體占比
以上根據(jù)圖片中基因數(shù)和線粒體數(shù),分別設(shè)置過濾參數(shù),這里基因數(shù)200-2500,線粒體百分比為小于 5%(常用的過濾參數(shù))
作圖,直觀地看一下數(shù)據(jù)的質(zhì)量。要輸入代碼plot或者Combineplot,才可以在右邊出現(xiàn)圖
標準化
pbmc <- NormalizeData(pbmc, normalization.method = "LogNormalize", scale.factor = 10000)
鑒定高變基因,之后就關(guān)注這些基因進行研究
pbmc <- FindVariableFeatures(pbmc, selection.method = "vst", nfeatures = 2000)
top10 <- head(VariableFeatures(pbmc), 10)
使用默認參數(shù),用vst方法選取2000個高變基因。
然后選取top10變化的
plot3 <- VariableFeaturePlot(pbmc)
plot4 <- LabelPoints(plot = plot3, points = top10, repel = TRUE,xnudge=0,ynudge=0)
plot3+plot4
得到圖,看到變化最大的前2000個和10個的圖
接下來進行數(shù)據(jù)歸一化
1.線性姜維
有一堆細胞,但是你需要將這些細胞進行分群,但是你又不知道這些細胞如果進行分群的話是按照什么依據(jù)進行分群,就要先使用PCA 降維找到細胞分群的主要特點,這也就是我們常說的主成分分析
all.genes <- rownames(pbmc)
pbmc <- ScaleData(pbmc,features = all.genes,vars.to.regress = "percent.mt")
pbmc <- RunPCA(pbmc, features = VariableFeatures(object = pbmc))
數(shù)據(jù)歸一化,對所有基因進行標準化,默認只是標準化高變基因( 2000 ),速度更快,不影響 PCA 和分群,但影響熱圖的繪制。
線性降維(PCA),默認用前面得到的2000個高變基因集,但也可通過 features 參數(shù)自己指定 需要挺長時間的,從1%開始加載
定義可視化細胞和功能的幾種有用的方式PCA,包括VizDimReduction,DimPlot,和DimHeatmap 得到一堆positive negative基因
VizDimLoadings(object = pbmc, dims = 1:2, reduction = "pca")
DimPlot(pbmc, reduction = "pca")+ NoLegend()
DimHeatmap(pbmc, dims = 1:2, cells = 500, balanced = TRUE)
以上三行得到三個圖,定義可視化細胞和功能,還不知道有啥用?
鑒定數(shù)據(jù)集的可用維度,確定哪些主成分所代表的基因可以進入下游分析用于后續(xù)細胞分類。
這里可以使用JackStraw做重抽樣分析。可以用JackStrawPlot可視化看看哪些主成分可以進行下游分析。
pbmc <- JackStraw(pbmc, num.replicate = 100)
pbmc <- ScoreJackStraw(pbmc, dims = 1:20)
JackStrawPlot(pbmc, dims = 1:15)
ElbowPlot(object = pbmc)
第一步需要一定計算時間最后得到圖JackStrawPlot和Elbowplot,后者比較直觀。
第二行,得到JackStrawPlot。是彩色的,虛線以上的為可用維度,dim是展示多少個。可以調(diào)節(jié)dim,畫出不同數(shù)量的 pca 查看。
也就是:基于每個主成分對方差解釋率的排名。建議嘗試選擇多個主成分個數(shù)做下游分析,對整體影響不大;在選擇此參數(shù)時,建議選擇偏高的數(shù)字( “寧濫勿缺”,為了獲取更多的稀有分群);有些亞群很罕見,如果沒有先驗知識,很難將這種大小的數(shù)據(jù)集與背景噪聲區(qū)分開來。
第三行,得到Elbowplot,點圖。比較直觀地看到,前面的幾個點分得比較開。
之后就可以決定選取多少主成分用于細胞分類。從上到下,從p-value最小的開始選擇top few。
尊重官網(wǎng)的建議,這里選取top 10
- 非線性降維( UMAP/tSNE)
TSNE降維與PCA降維并不相同,TSNE降維主要是非線性降維。
TSNE優(yōu)勢:使得相似的對象有更高的概率被選擇,而不相似的對象有較低的概率被選擇。它將多維數(shù)據(jù)映射到適合于人類觀察的兩個或多個維度,廣泛應用于圖像處理。
一般情況下,在進行細胞分群時:先進行PCA主成分分析,再進行TSNE降維分析進行細胞分群,這樣的分群結(jié)果可靠度更高。
Seurat 提供了幾種非線性降維的方法進行數(shù)據(jù)可視化(在低維空間把相似的細胞聚在一起),比如 UMAP 和 t-SNE,運行 UMAP 需要先安裝'umap-learn'包,兩種方法都可以使用,但不要混用,這樣,后面的結(jié)算結(jié)果會將先前的聚類覆蓋掉,只能保留一個。
2.1 umap
umap優(yōu)于tsne:
UMAP 與 t-SNE 均是非線性降維,多用于數(shù)據(jù)可視化
UMAP 結(jié)構(gòu)與t-SNE一致
UMAP 計算更快
UMAP 能更好地反映高緯結(jié)構(gòu),比t-SNE有著更好的連續(xù)性
這種連續(xù)性反映到單細胞分析中就是能更好滴可視化細胞的分化狀態(tài)(UMAP better represents the multi-branched continuous trajectory of hematopoietic development)
umap安裝包如下:
install(packages = 'umap-learn')
基于PCA 空間中的歐氏距離計算 nearest neighbor graph,優(yōu)化任意兩個細胞間的距離權(quán)重(輸入上一步得到的 PC 維數(shù))
pbmc <- FindNeighbors(pbmc, dims = 1:10)
pbmc <- FindClusters(pbmc, resolution = 0.5)
resolution 參數(shù)決定下游聚類分析得到的分群數(shù),對于 3K 左右的細胞,設(shè)為 0.4-1.2 能得到較好的結(jié)果(官方說明);如果數(shù)據(jù)量增大,該參數(shù)也應該適當增大;增加的值會導致更多的群集。
使用 Idents()函數(shù)可查看不同細胞的分群;查看每一類有多少個細胞
head(Idents(pbmc), 8)
table(pbmc@active.ident)
得到前8個細胞分群的table
pbmc <- RunUMAP(object = pbmc, dims = 1:10)
DimPlot(object = pbmc, reduction = "umap")
umapplot<-UMAPPlot(pbmc,label = TRUE, pt.size = 1.5)+ NoLegend()
這里用 DimPlot()函數(shù)繪制散點圖。如果只做tsne,參數(shù)reduction = "tsne";如果不設(shè)定reduction,默認先從搜索 umap, 然后 tsne, 再然后 pca;
也可以直接使用這 3 個函數(shù) PCAPlot()、 TSNEPlot()、UMAPPlot(); cols, pt.size 分別調(diào)整分組顏色和點的大小;
2.2 TSNE
pbmc <- RunTSNE(pbmc, dims = 1:10)
DimPlot(object = pbmc, reduction = "tsne")
tsneplot<-TSNEPlot(pbmc,label = TRUE, pt.size = 1.5)+ NoLegend()
做完以上降維處理保存數(shù)據(jù)
saveRDS(pbmc, file = "pbmc_tutorial.rds")
save(pbmc,file="pbmc.RData")
load(file = "pbmc.RData")
保存在了工作路徑下文件夾中,并且下次用的時候直接load就好
尋找差異表達的特征(聚類生物標志物)
尋找某個聚類和其他所有聚類顯著表達的基因
cluster1.markers <- FindMarkers(object = pbmc, ident.1 = 1, min.pct = 0.25)
head(x = cluster1.markers, n = 5)
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)
write.table(as.data.frame(cluster5.markers), file="cluster1vs2.xls", sep="\t", quote = F)
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 <- FindAllMarkers(object = pbmc, only.pos = TRUE, min.pct = 0.25, logfc.threshold = 0.25, return.thresh = 0.01)
library(dplyr)
top10 <- pbmc.markers %>% group_by(cluster) %>% top_n(n = 10, wt = avg_logFC)
DoHeatmap(object = pbmc, features = top10$gene) + NoLegend()
畫圖
VlnPlot(object = pbmc, features = c("MS4A1", "CD79A"))
FeaturePlot(object = pbmc, features = c("MS4A1", "GNLY", "CD3E", "CD14", "FCER1A", "FCGR3A", "LYZ", "PPBP", "CD8A"))
you can plot raw UMI counts as well
VlnPlot(object = pbmc, features.plot = c("NKG7", "PF4"), use.raw = TRUE, y.log = TRUE)
FeaturePlot(object = pbmc, features = c("hbaa1","hbaa2","ighv1-4","cd79a","cd79b","cd4-1","cd8a","cd8b","itga2b"), cols = c("grey", "blue"), reduction = "tsne")
將單元類型標識分配給集群
new.cluster.ids <- c("1", "3", "4", "2", "5", "6", "7", "8")
names(x = new.cluster.ids) <- levels(x = pbmc)
pbmc <- RenameIdents(object = pbmc, new.cluster.ids)
DimPlot(object = pbmc, label = TRUE, pt.size = 1.5) + NoLegend()
氣泡圖
markers.to.plot <- c("cd74a", "cd74b")
DotPlot(pbmc, features = markers.to.plot) + RotatedAxis()