劉小澤寫于19.3.26
這次主要內容是更新一下第四期的QC部分,另外簡單看一下標準化(沒有涉及流程),因此標題定了一個 四plus
慢慢翻開細枝末節
上一次說到了加載、創建、獲取single-cell數據集
、質控(細胞、基因兩個層次)
,繼續進行~
上一次質控環節的一些補充說明[主要更新在于過濾更加全面]
根據文庫大小過濾細胞時,我們是根據密度圖進行選擇,閾值也是按照5%設定的。今天突然想起來,其實還有另一種閾值選擇方法,也許更有說服力
# Calculate QC metrics[上一次的代碼]
> library(scater)
> sce2 <- calculateQCMetrics(sce2, feature_controls = list(ERCC = isSpike(sce2, "ERCC")))
# names(colData(sce2))
#####################################
# 畫個直方圖
# 理論上分選細胞是遵循“無限稀釋”=》泊松分布的“鐘形曲線”
# 如果表達量太高(最右側),可能是一孔兩個細胞(doublets);
# 如果表達量太低(最左側),可能是細胞質量不好或沒有細胞
#####################################
> hist(
sce2$total_counts,
breaks = 100
)
> abline(v=1.3e6, col="red")
# 這樣是不是就更直觀了呢?
> table(keep)
keep
FALSE TRUE
180 684
除了對總文庫大小total_count進行過濾,還可以根據 細胞中檢測到的基因數(the number of detected genes in all cells)進行過濾
> hist(
+ sce2$total_features_by_counts,
+ breaks = 100
+ )
> abline(v = 7000, col = "red")
> filter_by_expr_features <- (sce2$total_features_by_counts > 7000)
> table(filter_by_expr_features)
filter_by_expr_features
FALSE TRUE
116 748
# 另外根據ERCC結果可以去掉NA19098.r2這個重復,并且選擇ERCC占比低于25的(這個閾值是自定義的)
> filter_by_ERCC <-
sce2$batch != "NA19098.r2" & sce2$pct_counts_ERCC < 25
> table(filter_by_ERCC)
filter_by_ERCC
FALSE TRUE
103 761
一般來講,QC過濾的方法可以根據:表達的基因數量(total number of unique genes detected in each sample.);文庫大小( total number of RNA molecules detected per sample);ERCC、線粒體基因與內源基因的比率(pct_counts_ERCC、pct_counts_MT)[這個比率高說明細胞有可能死亡或者表達受到抑制,即得不到什么表達量]
sce2$use <- (
# sufficient features (genes)
filter_by_expr_features &
# sufficient molecules counted
filter_by_total_counts &
# sufficient endogenous RNA
filter_by_ERCC
# remove cells with unusual number of reads in MT genes
# filter_by_MT
)
上面??是細胞過濾,下面??是基因過濾
做完QC后,可以進行可視化,檢查一下基因表達量(主要看前50),目的是看一下實驗設計的spikein如何
plotQC(sce2, type = "highest-expression")
# 結果分布比較平穩表示細胞中全轉錄組的覆蓋度比較好(粗略來看),前15個基因存在一些spike-in(已知濃度的外源RNA分子),因此如果下一步重復實驗的話,可以將spikein的比重降低
過濾基因(還是根據至少2個細胞中存在表達量大于1的基因
的標準)
filter_genes <- apply(
counts(sce2[ , colData(sce2)$use]),
1,
function(x) length(x[x > 1]) >= 2
)
rowData(sce2)$use <- filter_genes
dim(reads[rowData(reads)$use, colData(reads)$use])
assay(reads, "logcounts_raw") <- log2(counts(reads) + 1)
reducedDim(reads) <- NULL
save(sce2, file = "sce2.RData")
標準化
為何需要標準化?
分析單細胞數據其中一個目的就是找到感興趣的biological signal ,還是以下圖為例:
我們可以根據基因表達量將細胞分組,但是這里比較關心的是找到不同細胞亞群的biomarker,然后使用不同的藥物治療。找biomarker的過程并不簡單,其中會引入許多的人工技術性誤差,以至于掩蓋掉真正關心的生物學差異
其中一個混雜因素就是"批次效應(batch effect)"。下圖中將兩組(NA19098和NA19101)進行PCA分析,每個點是一個細胞,細胞被投射到不同維度上,選擇其中兩個可以代表變化/方差最大的維度來表示數據特征。可以看到,細胞分別按照個體(individual)和批次(batch)進行分組。
按照個體劃分是理所當然的,因為我們就是要看看不同個體之間的biological signal,但是按照批次分組就有點說不通了,只是因為細胞是不同批次測序的,而有的批次之間并沒有太大的差別,這種情況就屬于技術上分組,而不是生物意義上分組。因此,標準化的目的就是:移除不想要的技術差異(例如批次效應),同時保存感興趣的生物學相關的差異
標準化方法有許多
- 最直接:將表達矩陣的每一列除以標準化因子(normalization factor),這個因子可以是文庫大小或者文庫大小除以1,000,000(也就是counts per million,CPM);另外像RPKM、TPM都是這種形式的變體
- 其他方法:每個count除以各自不同的歸一化因子(scaling factor)。不同方法計算的scaling factor不同,例如
- edgeR中的Weighted trimmed mean of M-values (TMM)
- DESeq中是每個基因在所有細胞中的幾何平均數(geometric mean)
- scran中是zero inflation
歡迎關注我們的公眾號~_~
我們是兩個農轉生信的小碩,打造生信星球,想讓它成為一個不拽術語、通俗易懂的生信知識平臺。需要幫助或提出意見請后臺留言或發送郵件到jieandze1314@gmail.com