單細胞交響樂11-多樣本間差異分析

劉小澤寫於2020.7.10、7.15

爲何取名叫“交響樂”?因爲單細胞分析就像一個大樂團,需要各個流程的協同配合

單細胞交響樂1-常用的數據結構SingleCellExperiment
單細胞交響樂2-scRNAseq從實驗到下游簡介
單細胞交響樂3-細胞質控
單細胞交響樂4-歸一化
單細胞交響樂5-挑選高變化基因
單細胞交響樂6-降維
單細胞交響樂7-聚類分羣
單細胞交響樂8-marker基因檢測
單細胞交響樂9-細胞類型註釋
單細胞交響樂10-數據集整合後的批次矯正

1 前言

scRNA-seq的一個強大之處在於:方便多個實驗條件下的樣本比較,比如可以檢測藥物處理後或基因敲除後的細胞類型變化,比起常規的單一實驗因素能提供更多信息。

對於多樣本的scRNA差異分析,主要分成兩大類:差異表達(differential expression)和差異丰度(differential abundance),前者檢測相同類型細胞在不同條件下表達的變化,後者檢測不同條件下細胞類型(或狀態等)組成的變化。下面就利用小鼠早期胚胎細胞數據(Pijuan-Sala et al. 2019) 來展示這兩種分析。

數據介紹

數據來自小鼠E8.5時期的嵌合體胚胎,每個嵌合體胚胎都是將td-Tomato-positive的胚胎幹細胞(ESCs)注射到野生型囊胚中得到的。這裏注射的細胞和囊胚細胞除了td-Tomato報告基因,沒有其他基因上的差異。利用野生型嵌合體進行研究的目的是爲了確定注射過程本身是否引入了其他的差異。

在小鼠胚胎幹細胞(ES 細胞)中進行DNA 同源重組,將ES 細胞重新注射到囊胚腔中,可以形成嵌合胚胎,並能在假孕小鼠體內發育,最終發育爲嵌合體小鼠,是判定胚胎幹細胞系是否具有種系分化能力的唯一方法

sce.chimera數據總共包含6個樣本,包含3個重複批次,每個批次2個處理,一個處理樣本屬於 td-Tomato陽性細胞,另一個處理樣本屬於陰性。樣本是從6-7個嵌合胚胎中利用熒光活化分選得到的。每個樣本利用10X建庫,得到2000-7000個細胞。

數據準備

scater+scran標準處理模式如下,這個需要下載很多數據,整個過程還是很慢的(數據分享在:https://share.weiyun.com/5NE9lhXA):

其中merging這一步中指定出了批次信息,方便更好地進行數據整合

#--- loading ---#
library(MouseGastrulationData)
sce.chimera <- WTChimeraData(samples=5:10)
sce.chimera

#--- feature-annotation ---#
library(scater)
rownames(sce.chimera) <- uniquifyFeatureNames(
    rowData(sce.chimera)$ENSEMBL, rowData(sce.chimera)$SYMBOL)

#--- quality-control ---#
drop <- sce.chimera$celltype.mapped %in% c("stripped", "Doublet")
sce.chimera <- sce.chimera[,!drop]

#--- normalization ---#
sce.chimera <- logNormCounts(sce.chimera)

#--- variance-modelling ---#
library(scran)
dec.chimera <- modelGeneVar(sce.chimera, block=sce.chimera$sample)
chosen.hvgs <- dec.chimera$bio > 0

#--- merging ---#
library(batchelor)
set.seed(01001001)
merged <- correctExperiments(sce.chimera, 
    batch=sce.chimera$sample, 
    subset.row=chosen.hvgs,
    PARAM=FastMnnParam(
        merge.order=list(
            list(1,3,5), # WT (3 replicates)
            list(2,4,6)  # td-Tomato (3 replicates)
        )
    )
)

#--- clustering ---#
g <- buildSNNGraph(merged, use.dimred="corrected")
clusters <- igraph::cluster_louvain(g)
colLabels(merged) <- factor(clusters$membership)

#--- dimensionality-reduction ---#
merged <- runTSNE(merged, dimred="corrected", external_neighbors=TRUE)
merged <- runUMAP(merged, dimred="corrected", external_neighbors=TRUE)

拿到數據,先要有個初步的認識

> merged
class: SingleCellExperiment 
dim: 14699 19426 
metadata(2): merge.info pca.info
assays(3): reconstructed counts logcounts
rownames(14699): Xkr4 Rp1 ... Vmn2r122
  CAAA01147332.1
rowData names(3): rotation ENSEMBL SYMBOL
colnames(19426): cell_9769 cell_9770 ...
  cell_30701 cell_30702
colData names(13): batch cell ... sizeFactor
  label
reducedDimNames(3): corrected TSNE UMAP
altExpNames(0):

# 有哪些樣本信息
> names(colData(merged))
 [1] "batch"           "cell"           
 [3] "barcode"         "sample"         
 [5] "stage"           "tomato"         
 [7] "pool"            "stage.mapped"   
 [9] "celltype.mapped" "closest.cell"   
[11] "doub.density"    "sizeFactor"     
[13] "label"  

# 看下三個批次
> table(merged$pool)

    3     4     5 
 3324  5644 10458 

# 看下兩種處理
> table(merged$tomato)

FALSE  TRUE 
10331  9095 

# 看下分羣結果
> table(colLabels(merged))

   1    2    3    4    5    6    7    8    9   10 
 947  112  868  680  606  507 2208  424 1259  252 
  11   12   13   14   15   16   17   18   19   20 
 104  727   58  423 1044  872  432 1264  454 1022 
  21   22   23   24   25   26 
 211  160  156 1640  860 2136 

# 當然也可以把三個批次和分羣結果放一起看
table(colLabels(merged), merged$pool)
# 或者把兩個處理和分羣結果放一起看
table(colLabels(merged), merged$tomato)

# 再直觀一點,看看數據整合的效果如何,也就是批次效應處理如何
gridExtra::grid.arrange(
    plotTSNE(merged, colour_by="tomato", text_by="label"),
    plotTSNE(merged, colour_by=data.frame(pool=factor(merged$pool))),
    ncol=2
)

其實現在有了分羣結果,下一步應該進行marker基因檢測以及細胞註釋了,但這裏的目的不是這些,所以這些步驟略去了,直接使用Pijuan-Sala et al. (2019)小鼠早期胚胎髮育數據集做的的細胞類型。這個信息放在了merged$celltype.mapped中。不過爲了看一下使用他人註釋數據用在我們自己的數據質量如何,可以用熱圖來看二者重疊程度

by.label <- table(colLabels(merged), merged$celltype.mapped)
pheatmap::pheatmap(log2(by.label+1), cluster_cols=FALSE, cluster_rows=FALSE,
    color=viridis::viridis(101))

通過這個圖可以看到,我們這裏存在多對多的關係。也反映出:針對發育分化的細胞,細胞類型註釋是個難題。

2 不同處理間差異基因表達分析 DE analysis

這也是最最常見的分析思路,一般拿到轉錄組表達量就會先想着把差異分析做一做
針對單細胞的差異分析方法有多種,一般的綜述都會提及。這裏使用的方法是“仿bulk轉錄組”的模式

2.1 首先構造一個“擬bulk轉錄組”的樣本

它的思路是:根據不同細胞類型和不同分羣,把對應的細胞表達量加起來。比如根據上面得到的細胞分羣信息和註釋信息

> colData(merged)[,c("celltype.mapped", "sample")]
DataFrame with 19426 rows and 2 columns
                        celltype.mapped    sample
                            <character> <integer>
cell_9769                    Mesenchyme         5
cell_9770                   Endothelium         5
cell_9771                     Allantois         5
cell_9772                    Erythroid3         5
cell_9773                    Erythroid1         5
...                                 ...       ...
cell_30698                   Erythroid2        10
cell_30699                   Erythroid3        10
cell_30700             Surface ectoderm        10
cell_30701 Forebrain/Midbrain/Hindbrain        10
cell_30702                   Erythroid3        10

然後根據這兩個信息作爲分組,將各自的組內細胞表達量分別加起來。

summed <- aggregateAcrossCells(merged, 
    id=colData(merged)[,c("celltype.mapped", "sample")])

> dim(merged);dim(summed)
[1] 14699 19426
[1] 14699   186

可見大大降低了樣本數量,原來是一個細胞當做一個樣本對待;現在是整合後的一組細胞當做一個樣本。這樣做的原因有以下幾個:

  • bulk轉錄組軟件的標準差異分析流程需要比較大的表達量,而單細胞中存在很多0表達量
  • 將多個細胞匯成一組,也不是隨便挑的幾個細胞,就像上面它是根據兩個條件選的同組細胞。就像是生物體內的複製過程,雖然這些細胞之間也存在着一些差異,但相比於組外的細胞,它們之間更相似。而如果直接把每個細胞的表達量傳給差異分析工具,它會認爲每個細胞就是一個獨立的生物樣本,這也是和真實情況不符的

2.2 進行差異分析

差異分析基於edgeR的 quasi-likelihood (QL)方法,使用負二項廣義線性模型(NB GLM) 來處理過度分散的表達量數據。

先來回憶一下bulk轉錄組的edegR分析怎麼做吧:
rm(list = ls())
options(stringsAsFactors = F)

load('airway.expreSet.Rdata')
library(edgeR)
##  第一步:創建edgeR對象
# 這裏需要表達矩陣和分組信息
e <- DGEList(counts=expr,group=factor(grp))

## 第二步:預處理
# 進行一下過濾
keep <- rowSums(cpm(e)>1) >= 2
e <- e[keep, , keep.lib.sizes=FALSE]
# 進行一下校正
e$samples$lib.size <- colSums(e$counts)
e <- calcNormFactors(e)
e$samples

DEG=e
## 第三步:創建模型並分析
# 這裏得到分組矩陣(實驗設計矩陣)
design <- model.matrix(~0+factor(grp))
rownames(design)<-colnames(DEG)
colnames(design)<-levels(factor(grp))

DEG <- estimateGLMCommonDisp(DEG,design)
DEG <- estimateGLMTrendedDisp(DEG, design)
DEG <- estimateGLMTagwiseDisp(DEG, design)

fit <- glmFit(DEG, design)
# edgeR User guide (Page. 30 => "GLM Approach")
lrt <- glmLRT(fit,  contrast=c(-1,1)) # accoding to design to modify
# or we can use another way (glmQLFTest):
# CasevsCtrl <- makeContrasts(Case-Ctrl=trt-untrt, levels=design)
# lrt <- glmQLFTest(fit,contrast=CasevsCtrl)

nrDEG=topTags(lrt, n=nrow(DEG))
nrDEG=as.data.frame(nrDEG)

由於我們前面使用了細胞類型+批次信息兩個分組條件,因此這裏需要先鎖定一個再分析另一個。意思就是我們可以先指定一個細胞類型,然後去進行這3個批次(各2個重複)共6個樣本的差異分析,比如可以指定細胞類型是:間質細胞

label <- "Mesenchyme"
current <- summed[,label==summed$celltype.mapped]
# 於是從原來的186組樣本又再次過濾爲了6組樣本
> dim(current)
[1] 14699     6
第一步:創建edgeR對象
library(edgeR)
y <- DGEList(counts(current), samples=colData(current))
y
第二步:預處理

首先是去除低質量樣本(擔心影響後面的歸一化):不過這裏的文庫大小不是像原來一樣計算每個樣本的表達量加和。因爲這裏已經將細胞分組,看到的6不是6個細胞,而是6組細胞。因此這裏的計算標準是:每組內含有不少於多少的細胞。 例如(Crowell et al. 2019)就定義瞭如果一組包含少於20個細胞,就是非常低的文庫

discarded <- current$ncells < 20
y <- y[,!discarded]
summary(discarded)
##    Mode   FALSE 
## logical       6

然後去除低質量基因(目的是增加後面模型構建的準確度,減少多重矯正的壓力):先得到一個logCPM閾值,然後過濾。可以看到下面過濾掉了不少基因

keep <- filterByExpr(y, group=current$tomato)
y <- y[keep,]
summary(keep)
##    Mode   FALSE    TRUE 
## logical    9011    5688

最後,歸一化矯正:使用TMM(trimmed mean of M-values)方法,也算得上是calcNormFactors()函數的標誌了

y <- calcNormFactors(y)
第三步:模型並分析

這部分的重點就是這個分組矩陣了,下面鎖定樣本中批次(pool)的差異,而保留注射導致的差異(tomato)

design <- model.matrix(~factor(pool) + factor(tomato), y$samples)
design
##         (Intercept) factor(pool)4 factor(pool)5 factor(tomato)TRUE
## Sample1           1             0             0                  1
## Sample2           1             0             0                  0
## Sample3           1             1             0                  1
## Sample4           1             1             0                  0
## Sample5           1             0             1                  1
## Sample6           1             0             1                  0
## attr(,"assign")
## [1] 0 1 1 2
## attr(,"contrasts")
## attr(,"contrasts")$`factor(pool)`
## [1] "contr.treatment"
## 
## attr(,"contrasts")$`factor(tomato)`
## [1] "contr.treatment"

接下來就是新增部分了,使用estimateDisp()來估計負二項分佈negative binomial (NB)

y <- estimateDisp(y, design)
summary(y$trended.dispersion)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  0.0103  0.0167  0.0213  0.0202  0.0235  0.0266

接着用glmQLFit() 估計 quasi-likelihood分佈【具體的統計知識可以日後再理解,這裏不是重點】

fit <- glmQLFit(y, design, robust=TRUE)

glmQLFTest()看一下表達量差異,差異基因是logFC不爲0(logFC=1也就是treat/control=1)並且FDR小於5%的

res <- glmQLFTest(fit, coef=ncol(design))
summary(decideTests(res))
##        factor(tomato)TRUE
## Down                    8
## NotSig               5672
## Up                      8

看到很少有基因是差異表達的,說明注射這個條件對間質細胞的表達量影響不大

最後,得到一個整合的結果

topTags(res)
## Coefficient:  factor(tomato)TRUE 
##            logFC logCPM       F    PValue       FDR
## Phlda2   -4.3874  9.934 1638.59 1.812e-16 1.031e-12
## Erdr1     2.0691  8.833  356.37 1.061e-11 3.017e-08
## Mid1      1.5191  6.931  120.15 1.844e-08 3.497e-05
## H13      -1.0596  7.540   80.80 2.373e-07 2.527e-04
## Kcnq1ot1  1.3763  7.242   83.31 2.392e-07 2.527e-04
## Akr1e1   -1.7206  5.128   79.31 2.665e-07 2.527e-04
## Zdbf2     1.8008  6.797   83.66 6.809e-07 5.533e-04
## Asb4     -0.9235  7.341   53.45 2.918e-06 2.075e-03
## Impact    0.8516  7.353   50.31 4.145e-06 2.620e-03
## Lum      -0.6031  9.275   41.67 1.205e-05 6.851e-03

2.3 循環操作

上面2.2部分是針對間質細胞這一種細胞類型,發現基本沒有和注射這個因素相關的差異基因。但是還存在其他很多種細胞類型,因此想到了:如何進行批處理?

最簡單的辦法是利用scran包的pseudoBulkDGE() ,它會對每個細胞類型進行操作,但依然是需要準備好數據

首先是過濾細胞

直接基於“擬bulk轉錄組”的數據

summed.filt <- summed[,summed$ncells >= 20]
> dim(summed.filt)
[1] 14699   126
然後構建分組矩陣

在2.2中,因爲指定了某個細胞類型,所以最後就是得到了這個批次下的6個處理

這裏也是,即使使用了全部的細胞類型,但還是要限制爲6個處理,因此可以只獲得每個處理出現第一次的細胞

targets <- colData(merged)[!duplicated(merged$sample),]
> dim(targets)
[1]  6 13

# 再根據這個分組信息構建矩陣
design <-  model.matrix(~factor(pool) + factor(tomato), data=targets)
rownames(design) <- targets$sample
最後就可以使用pseudoBulkDGE()
library(scran)
de.results <- pseudoBulkDGE(summed.filt, 
    sample=summed.filt$sample,
    label=summed.filt$celltype.mapped,
    design=design,
    coef=ncol(design),
    condition=targets$tomato 
)

這個結果是這樣的:

至於這5列是什麼內容,可以看看,裏面既有logFC判斷上下調,又有FDR判斷顯著性

> de.results$Allantois[1:3,1:5]
DataFrame with 3 rows and 5 columns
          logFC    logCPM         F    PValue       FDR
      <numeric> <numeric> <numeric> <numeric> <numeric>
Xkr4         NA        NA        NA        NA        NA
Rp1          NA        NA        NA        NA        NA
Sox17 -0.139844     4.909  0.335911  0.562224  0.891031

2.4 看一下循環操作的結果

檢查一下結果,例如看看每個細胞類型選FDR小於5%(即顯著)的差異基因數量。注意到這裏有一列NA,它指的是:要麼這個細胞類型中基因由於表達量太低被過濾掉,要麼就是在這個細胞類型中沒辦法比較。另外1表示顯著上調,-1表示顯著下調,0表示差異不顯著

is.de <- decideTestsPerLabel(de.results, threshold=0.05)
> dim(is.de)
[1] 14699    26

# 記錄了每個基因在每個類型中是否差異
> is.de[1:3,1:3]
      Allantois Blood progenitors 2 Cardiomyocytes
Xkr4         NA                  NA             NA
Rp1          NA                  NA             NA
Sox17         0                  NA             NA

summarizeTestsPerLabel(is.de)
##                                -1    0  1    NA
## Allantois                      69 5048 66  9516
## Blood progenitors 2             1 2472  2 12224
## Cardiomyocytes                  6 4361  5 10327
## Caudal epiblast                 0    0  0 14699
## Caudal Mesoderm                 0    0  0 14699
## Def. endoderm                   0    0  0 14699
## Endothelium                     3 3222  6 11468
## Erythroid1                     12 3035 25 11627
## Erythroid2                      5 3389  8 11297
## Erythroid3                     13 5048 16  9622
## ExE ectoderm                    0    0  0 14699
## ExE mesoderm                    2 5097 10  9590
## Forebrain/Midbrain/Hindbrain    8 6226 11  8454
## Gut                             5 4482  6 10206
## Haematoendothelial progenitors  7 4347 17 10328
## Intermediate mesoderm           6 3256  8 11429
## Mesenchyme                      8 5672  8  9011
## Neural crest                    6 3311  8 11374
## NMP                             6 4107 10 10576
## Paraxial mesoderm               4 4756  5  9934
## Parietal endoderm               0    0  0 14699
## Pharyngeal mesoderm             2 5082  9  9606
## Rostral neurectoderm            0    0  0 14699
## Somitic mesoderm                7 2948 13 11731
## Spinal cord                     7 4591  7 10094
## Surface ectoderm                9 5556  8  9126

還可以看看哪些上、下調差異基因在各種類型細胞中比較多

# 上調
up.de <- is.de > 0 & !is.na(is.de)
head(sort(rowMeans(up.de), decreasing=TRUE), 10)
##     Mid1    Erdr1   Impact    Mcts2     Nnat Kcnq1ot1  Slc38a4    Zdbf2 
##   0.7692   0.6538   0.5385   0.5000   0.5000   0.5000   0.3846   0.3462 
##     Hopx     Peg3 
##   0.3462   0.2308

# 下調
down.de <- is.de < 0 & !is.na(is.de)
head(sort(rowMeans(down.de), decreasing=TRUE), 10)
##        Akr1e1          Xist        Cdkn1c        Phlda2           H13 
##       0.61538       0.57692       0.57692       0.57692       0.46154 
##         Wfdc2         Hbb-y         Grb10 B930036N10Rik         Pink1 
##       0.19231       0.11538       0.11538       0.07692       0.07692

還可以看:哪些差異基因是在某個細胞類型中特有的

也就是這些基因僅僅在某一個類型的細胞中是差異表達的,在其他類型細胞中不是差異表達。

# 首先複製一份差異分析的結果
remotely.de <- decideTestsPerLabel(de.results, threshold=0.5)
# 從中把非差異基因選出來
not.de <- remotely.de==0 | is.na(remotely.de)
# 如果我們只關注Allantois這個細胞類型,那就把剩餘細胞類型設爲“其他”
other.labels <- setdiff(colnames(not.de), "Allantois")
# 從差異基因中找Allantois的,同時需要排除那些也存在於其他細胞類型的基因:即選擇非差異基因中其他細胞類型均爲True的,也就是下面rowMeans(not.de[,other.labels])==1
unique.degs <- is.de[,"Allantois"]!=0 & rowMeans(not.de[,other.labels])==1
# 提取基因名
unique.degs <- names(which(unique.degs))

# 看一下差別:如果只看Allantois中存在的是14699個,如果看它特有的是44個
> length(is.de[,"Allantois"]!=0)
[1] 14699
> length(unique.degs)
[1] 44

還可以將這些基因排個序(例如下面按Pvalue排序)

de.allantois <- de.results$Allantois
de.allantois <- de.allantois[order(de.allantois$PValue),]
de.allantois <- de.allantois[rownames(de.allantois) %in% unique.degs,]

> head(de.allantois)
DataFrame with 6 rows and 5 columns
             logFC    logCPM         F      PValue         FDR
         <numeric> <numeric> <numeric>   <numeric>   <numeric>
Slc22a18 -4.629906   3.87065  118.8863 2.19531e-27 1.42228e-24
Eif2s3y   1.757650   5.84561   74.0124 1.01564e-17 4.04928e-15
Rbp4      1.978988   4.38295   32.7443 1.11016e-08 1.74363e-06
Cfc1     -0.884383   5.66713   23.7376 1.13690e-06 1.33922e-04
Pdgfa    -0.423246   8.70475   23.4935 1.28991e-06 1.48569e-04
H3f3b     0.269312  12.07841   22.8530 1.79717e-06 2.02494e-04

如果說某些細胞類型沒有重複或沒有對照,它們就不好做差異分析,這些“失敗”的類型可以提取出來:

metadata(de.results)$failed
## [1] "Caudal epiblast"      "Caudal Mesoderm"      "Def. endoderm"       
## [4] "ExE ectoderm"         "Parietal endoderm"    "Rostral neurectoderm"

3 差異細胞丰度分析 DA analysis

檢測不同條件下細胞類型(或狀態等)組成的變化
如果說DE analysis重點在基因的表達量變化,那麼DA analysis就着眼於細胞數量的變化

差異丰度分析在流式細胞術中應用較多,常被用於檢查不同條件對複雜細胞羣體組成的影響。我們這裏也類比FACS技術,對scRNA的細胞也做一個“標記”,然後看看處理前後標記的丰度變化程度。

還是先將細胞按兩個維度(細胞類型+處理)歸類

abundances <- table(merged$celltype.mapped, merged$sample) 
> class(abundances)
[1] "table"

abundances <- unclass(abundances) #它的作用顯而易見
> class(abundances)
[1] "matrix" "array" 

> dim(abundances)
[1] 34  6
head(abundances)
##                      
##                        5  6   7   8   9  10
##   Allantois           97 15 139 127 318 259
##   Blood progenitors 1  6  3  16   6   8  17
##   Blood progenitors 2 31  8  28  21  43 114
##   Cardiomyocytes      85 21  79  31 174 211
##   Caudal epiblast      2  2   0   0  22  45
##   Caudal Mesoderm     10 10   9   3  10  29

這個abundances結果,依然可以類比爲原來的差異表達分析,即行爲基因列爲樣本,我們要對樣本間進行差異比較(這裏也就是對6個處理進行比較)

3.1 基於edgeR做DA analysis

首先爲列的樣本信息增加一些內容:

extra.info <- colData(merged)[match(colnames(abundances), merged$sample),]
y.ab <- DGEList(abundances, samples=extra.info)
y.ab

然後也還是按行過濾,只不過這裏不是根據基因的表達量了,而是按照細胞數量

keep <- filterByExpr(y.ab, group=y.ab$samples$tomato)
y.ab <- y.ab[keep,]
summary(keep)
##    Mode   FALSE    TRUE 
## logical      10      24

關於filterByExpr函數是如何過濾的【參考幫助文檔】:
宗旨:keeps genes that have at least min.count reads in a worthwhile number samples
依據:the filtering keeps genes that have count-per-million (CPM) above k in n samples
定義:k is determined by min.countand by the sample library sizes; n is determined by the design matrix.

這裏不再利用calcNormFactors()這麼複雜的歸一化方法,我們只需要簡單矯正一個文庫大小即可,具體原因下面再討論

下面的步驟其實和差異基因分析很像:

# 分組矩陣
design <- model.matrix(~factor(pool) + factor(tomato), y.ab$samples)
# 對每個細胞類型估計負二項分佈(由於細胞數量遠不如基因數量,點不夠就不用設置趨勢線)
y.ab <- estimateDisp(y.ab, design, trend="none")
# 再進行一個QL( quasi-likelihood) 分佈
fit.ab <- glmQLFit(y.ab, design, robust=TRUE, abundance.trend=FALSE)
# 檢驗
res <- glmQLFTest(fit.ab, coef=ncol(design))
summary(decideTests(res))
##        factor(tomato)TRUE
## Down                    1
## NotSig                 22
## Up                      1

# 看結果
topTags(res)
## Coefficient:  factor(tomato)TRUE 
##                                  logFC logCPM      F    PValue       FDR
## ExE ectoderm                   -6.5663  13.02 66.267 1.352e-10 3.245e-09
## Mesenchyme                      1.1652  16.29 11.291 1.535e-03 1.841e-02
## Allantois                       0.8345  15.51  5.312 2.555e-02 1.621e-01
## Cardiomyocytes                  0.8484  14.86  5.204 2.701e-02 1.621e-01
## Neural crest                   -0.7706  14.76  4.106 4.830e-02 2.149e-01
## Endothelium                     0.7519  14.29  3.912 5.371e-02 2.149e-01
## Erythroid3                     -0.6431  17.28  3.604 6.367e-02 2.183e-01
## Haematoendothelial progenitors  0.6581  14.72  3.124 8.351e-02 2.505e-01
## ExE mesoderm                    0.3805  15.68  1.181 2.827e-01 6.258e-01
## Pharyngeal mesoderm             0.3793  15.72  1.169 2.850e-01 6.258e-01
注意:

這幾個步驟裏面的重點其實一直都是model.matrix的設置,其他的統計計算我們並不關心,根據edgeR的官方文檔,設置的前後順序很重要

也就是說,這裏的6個處理樣本同時具有兩個屬性,即pooltomato,因此要對這6個樣本進行差異分析,那就必須把這兩個屬性都考慮進去,但哪個更重要我們需要掂量一下

# pool是哪兩個樣本屬於重複
> y.ab$samples$pool
[1] 3 3 4 4 5 5
# tomato指處理還是對照
> y.ab$samples$tomato
[1]  TRUE FALSE  TRUE FALSE  TRUE FALSE

pool 即每個處理的來源是不關心的,我們關心的是是否有tomato處理。因此pool放在了前面

3.2 處理細胞組成的影響

前面說不再利用calcNormFactors()這麼複雜的歸一化方法,因爲這種方法的假設是:基本每一行(feature)在各個列都是存在的,也就是說大部分基因在所有細胞中都是存在的。但是對於我們這裏的DA分析來講,行(細胞類型)不一定在所有的列(不同處理)中都有。很多實驗中只包含少數幾個細胞類型,如果還是按照這種計算方法,會對真實的細胞數量產生較大的干擾。

因此,默認的操作就是基於不同處理樣本的細胞總數進行歸一化處理。這個在技術和統計上說得過去,但落實到生物意義上又有爭議。如果一個處理中某種類型的細胞丰度很大,在歸一化後,就會導致其他幾個類型的細胞佔比下降,從而可能得到錯誤結論:認爲這個處理下的其他幾種類型的細胞數量會減少。

下面有幾種處理方式:

方法一:首先假設大部分的細胞類型在各個處理中都是存在的

這個假設對於野生型/對照組來說是合理的,因爲它不需要考慮注射處理後產生的不同結果。
這樣就可以利用calcNormFactors()去計算

y.ab2 <- calcNormFactors(y.ab)
y.ab2$samples$norm.factors
y.ab2 <- estimateDisp(y.ab2, design, trend="none")
fit.ab2 <- glmQLFit(y.ab2, design, robust=TRUE, abundance.trend=FALSE)
res2 <- glmQLFTest(fit.ab2, coef=ncol(design))
topTags(res2, n=10)
## Coefficient:  factor(tomato)TRUE 
##                                  logFC logCPM      F    PValue       FDR
## ExE ectoderm                   -6.9215  13.17 70.364 5.738e-11 1.377e-09
## Mesenchyme                      0.9513  16.27  6.787 1.219e-02 1.143e-01
## Neural crest                   -1.0032  14.78  6.464 1.429e-02 1.143e-01
## Erythroid3                     -0.8504  17.35  5.517 2.299e-02 1.380e-01
## Cardiomyocytes                  0.6400  14.84  2.735 1.047e-01 4.809e-01
## Allantois                       0.6054  15.51  2.503 1.202e-01 4.809e-01
## Forebrain/Midbrain/Hindbrain   -0.4943  16.55  1.928 1.713e-01 5.178e-01
## Endothelium                     0.5482  14.27  1.917 1.726e-01 5.178e-01
## Erythroid2                     -0.4818  16.00  1.677 2.015e-01 5.373e-01
## Haematoendothelial progenitors  0.4262  14.73  1.185 2.818e-01 6.240e-01
方法二:移除那些細胞數量很多的細胞類型

採用的常規的歸一化處理方法,只是考慮到那些丰度大的細胞類型對整體的影響,於是可以去除它們。

比如我們認爲ExE ectoderm這個細胞類型中細胞數量太多

offenders <- "ExE ectoderm"
# keep.lib.sizes=FALSE參數意爲重置文庫大小:reset the total number of cells for all samples
y.ab3 <- y.ab[setdiff(rownames(y.ab), offenders),, keep.lib.sizes=FALSE]
y.ab3 <- estimateDisp(y.ab3, design, trend="none")
fit.ab3 <- glmQLFit(y.ab3, design, robust=TRUE, abundance.trend=FALSE)
res3 <- glmQLFTest(fit.ab3, coef=ncol(design))
topTags(res3, n=10)
## Coefficient:  factor(tomato)TRUE 
##                                  logFC logCPM      F   PValue     FDR
## Mesenchyme                      1.1274  16.32 11.501 0.001438 0.03308
## Allantois                       0.7950  15.54  5.231 0.026836 0.18284
## Cardiomyocytes                  0.8104  14.90  5.152 0.027956 0.18284
## Neural crest                   -0.8085  14.80  4.903 0.031798 0.18284
## Erythroid3                     -0.6808  17.32  4.387 0.041743 0.19202
## Endothelium                     0.7151  14.32  3.830 0.056443 0.21636
## Haematoendothelial progenitors  0.6189  14.76  2.993 0.090338 0.29683
## Def. endoderm                   0.4911  12.43  1.084 0.303347 0.67818
## ExE mesoderm                    0.3419  15.71  1.036 0.314058 0.67818
## Pharyngeal mesoderm             0.3407  15.76  1.025 0.316623 0.67818

歡迎關注我們的公衆號~_~  
我們是兩個農轉生信的小碩,打造生信星球,想讓它成爲一個不拽術語、通俗易懂的生信知識平臺。需要幫助或提出意見請後臺留言或發送郵件到[email protected]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章