根據(jù)單細(xì)胞表達(dá)矩陣,箱圖可視化高表達(dá)基因

在單細(xì)胞測(cè)序下游分析中,當(dāng)重點(diǎn)關(guān)注哪些基因在所有細(xì)胞平均表達(dá)顯著時(shí),可選取所選取的top基因進(jìn)行可視化。

0、scater包方法

scaterR包里,有個(gè)函數(shù)plotHighestExprs,可自動(dòng)根據(jù)SingleCellExperiment對(duì)象數(shù)據(jù)進(jìn)行繪制。但有個(gè)缺點(diǎn)就是太慢了,具體操作如下

library(SingleCellExperiment)
sce <- SingleCellExperiment(
  assays = list(counts = expr)
)
class(sce)
library(scater)
sce <- logNormCounts(sce) 
p1 <- plotHighestExprs(sce, exprs_values = "logcounts",n=20)
#因?yàn)槌鰣D比較慢,故保存為本地后再觀察可提高效率
ggsave("./p1.pdf", plot = p1)
p1
  • 下面介紹一種手動(dòng)繪制箱圖的方法,不僅出圖快,而且箱圖反映的信息也更多一些

1、獲取單細(xì)胞表達(dá)矩陣

具體可分為三種情況

  • 直接獲得原始表達(dá)矩陣;
dim(expr)
expr[1:4,1:4]
expr
  • 從Seurat對(duì)象獲??;
scRNA = CreateSeuratObject(counts=expr)
class(scRNA)
#[1] "Seurat"
#attr(,"package")
#[1] "Seurat"
scRNA@assays$RNA@counts[1:4,1:4]
counts <- scRNA@assays$RNA@counts[1:4,1:4]
scRNA

注意的是Seurat是以稀疏矩陣dgCMatrix格式儲(chǔ)存的

  • 從SingleCellExpriment對(duì)象獲??;
sce <- SingleCellExperiment(
  assays = list(counts = expr)
)
class(sce)
#[1] "SingleCellExperiment"
#attr(,"package")
#[1] "SingleCellExperiment"
assay(sce, "counts")[1:4,1:4]
counts <- assay(sce, "counts")[1:4,1:4]
sce

2、原始表達(dá)矩陣標(biāo)準(zhǔn)化

最主要的原始是,不同細(xì)胞的文庫(kù)大小可能因測(cè)序過(guò)程存在差異。通過(guò)標(biāo)準(zhǔn)化,可使基因在不同細(xì)胞的表達(dá)情況具有可比性。

hist(colSums(expr))
histogram
  • 手動(dòng)對(duì)原始矩陣標(biāo)準(zhǔn)化
cell_lib <- colSums(expr) #計(jì)算細(xì)胞文庫(kù)
normalized <- t(t(expr)/cell_lib)*100

上述兩步也可合并成一步,但可能跳的有點(diǎn)多,關(guān)鍵理解如下示例的第三步的除法:
(1)R語(yǔ)言的計(jì)算是向量化的;例如可以進(jìn)行向量間加減乘除運(yùn)算,具體規(guī)則,自己嘗試下理解更深刻;
(2)應(yīng)用到矩陣時(shí),可以理解為一行代表向量的一個(gè)元素。


示例
# 最后乘100是將小數(shù)更友好得表示(百分比)
normalized[1:4,1:4]
normalized[1:4,1:4]
  • 如果是Seurat對(duì)象、SingleCellExperiment對(duì)象,則可以運(yùn)用相應(yīng)的函數(shù)計(jì)算,再導(dǎo)出標(biāo)準(zhǔn)化矩陣。
scRNA <- NormalizeData(scRNA)
scRNA@assays$RNA@data[1:4,1:4]

如下圖,結(jié)果與我們上面計(jì)算的有點(diǎn)不同;
查看NormalizeData幫助文檔可知,其默認(rèn)方法是計(jì)算每個(gè)細(xì)胞中基因表達(dá)量與文庫(kù)的比值,然后乘一個(gè)size.factor(一般是10000),最后進(jìn)行l(wèi)og轉(zhuǎn)換(加1,避免0以及零點(diǎn)幾的無(wú)意義結(jié)果log1p

基于Seurat的NormalizeData

NormalizeData

library("scater")
sce <- logNormCounts(sce) 
assay(sce, "logcounts")[1:4,1:4]

logNormCounts

如上圖結(jié)果,與之前兩種方法結(jié)果還不一樣。
scater包的logNormCounts的主要思路是首先平衡每個(gè)細(xì)胞的文庫(kù)大小,再計(jì)算相對(duì)于所在細(xì)胞文庫(kù)的比例。具體流程可見(jiàn)下圖的示例。
logNormCounts

綜上不同的方法,可得到不同的標(biāo)準(zhǔn)化結(jié)果。具體采用哪種方法,可自己根據(jù)情況選擇。

3、選取top基因,進(jìn)行箱圖可視化

  • 這里我選擇了第一種,自己簡(jiǎn)單進(jìn)行的標(biāo)準(zhǔn)化的結(jié)果。
#選擇平均在每個(gè)細(xì)胞表達(dá)最顯著的基因
most_exp <- sort(rowSums(normalized),T)[20:1] / ncol(expr)
# 可以想一下為什么設(shè)置[20:1],與下面繪圖有關(guān)
  • boxplot
boxplot(t(normalized[names(most_exp),]),
        cex=.01, las=1, cex.axis = .5,
        #分別設(shè)置離群點(diǎn)大小,軸標(biāo)簽的大小及方向
        xlab="% total count per cell",
        col=scales::hue_pal()(20)[20:1], #配色
        horizontal=TRUE)
boxplot
  • ggplot2
library(ggplot2)
library(reshape2)
newdata <- melt(t(normalized[names(most_exp),]))
head(newdata)
ggplot(data=newdata, aes(x=Var2, y=value, fill=Var2)) +
  geom_boxplot(outlier.size = 0.5) +
  coord_flip() + 
  theme(legend.position="none") +
  labs(title="High expression gene", x="", 
       y="% total count per cell")
ggplot2

最后總結(jié)下:主要根據(jù)單細(xì)胞表達(dá)矩陣,繪制箱圖來(lái)可視化高表達(dá)基因。中間介紹了下如何讓同一基因在不同細(xì)胞表達(dá)具有可比性的幾種方法。

參考文章
https://nbisweden.github.io/workshop-scRNAseq/labs/compiled/seurat/seurat_01_qc.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容