使用scran分析單細(xì)胞數(shù)據(jù)

官網(wǎng)教程:Scran1.20.1(最新)慕嚷。本教程使用的是Scran1.18.7,有幾個函數(shù)不太一樣。

# 查看安裝的scran的網(wǎng)頁版教程:
browseVignettes("scran")
1. 介紹

The scran package implements methods to perform low-level processing of scRNA-seq data, including cell cycle phase assignment, variance modelling and testing for marker genes and gene-gene correlations. This vignette provides brief descriptions of these methods and some toy examples to demonstrate their use.
更多教程

2. 數(shù)據(jù)準(zhǔn)備

這個數(shù)據(jù)集是CEL-seq測的人類胰腺數(shù)據(jù)集卷员,由SingleCellExperiment包提供。

library(scRNAseq)
sce <- GrunPancreasData()
sce
## class: SingleCellExperiment 
## dim: 20064 1728 
## metadata(0):
## assays(1): counts
## rownames(20064): A1BG-AS1__chr19 A1BG__chr19 ... ZZEF1__chr17
##   ZZZ3__chr1
## rowData names(2): symbol chr
## colnames(1728): D2ex_1 D2ex_2 ... D17TGFB_95 D17TGFB_96
## colData names(2): donor sample
## reducedDimNames(0):
## mainExpName: endogenous
## altExpNames(1): ERCC
View(sce)

關(guān)于sce對象父晶,參考: http://www.reibang.com/p/533aa6c50a38

首先進(jìn)行一些(粗略的)質(zhì)控以去除counts過低或spike-in過高的細(xì)胞城豁。

library(scuttle)
qcstats <- perCellQCMetrics(sce) 
qcfilter <- quickPerCellQC(qcstats, percent_subsets="altexps_ERCC_percent")
sce <- sce[,!qcfilter$discard]
summary(qcfilter$discard)
##    Mode   FALSE    TRUE 
## logical    1291     437
3. 標(biāo)準(zhǔn)化(Normalizing cell-specific biases)

scran中的標(biāo)準(zhǔn)化使用computeSumFactors()函數(shù)肉迫,該過程是基于反卷積方法:先合并許多細(xì)胞的計數(shù)以避免drop-out問題验辞,然后將基于池的量化因子(scale factor)“去卷積”為cell-based factors,以進(jìn)行特定細(xì)胞的標(biāo)準(zhǔn)化喊衫。而標(biāo)準(zhǔn)化之前對細(xì)胞進(jìn)行聚類(quickCluster)不是必需的跌造,不過減少cluster中細(xì)胞之間的差異表達(dá)基因數(shù)量確實可以提高標(biāo)準(zhǔn)化的準(zhǔn)確性。

library(scran)
clusters <- quickCluster(sce)
sce <- computeSumFactors(sce, clusters=clusters)
summary(sizeFactors(sce))
##     Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
## 0.006722 0.442629 0.801312 1.000000 1.295809 9.227575

也可以使用spike-in來進(jìn)行標(biāo)準(zhǔn)化

sce2 <- computeSpikeFactors(sce, "ERCC")
summary(sizeFactors(sce2))
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
## 0.01041 0.57760 0.88667 1.00000 1.27679 7.43466

不管使用哪種方法來計算量化因子族购,計算標(biāo)準(zhǔn)化的表達(dá)值都是使用scuttle包的logNormCounts()函數(shù)壳贪。標(biāo)準(zhǔn)化后的表達(dá)矩陣可以用于下游的聚類和降維等分析。

sce <- logNormCounts(sce)
4. 差異建模(Variance modelling)
dec <- modelGeneVar(sce)
plot(dec$mean, dec$total, xlab="Mean log-expression", ylab="Variance")
curve(metadata(dec)$trend(x), col="blue", add=TRUE)
dec2 <- modelGeneVarWithSpikes(sce, 'ERCC')
plot(dec2$mean, dec2$total, xlab="Mean log-expression", ylab="Variance")
points(metadata(dec2)$mean, metadata(dec2)$var, col="red")
curve(metadata(dec2)$trend(x), col="blue", add=TRUE)
# Turned off weighting to avoid overfitting for each donor.
dec3 <- modelGeneVar(sce, block=sce$donor, density.weights=FALSE)
per.block <- dec3$per.block
par(mfrow=c(3, 2))
for (i in seq_along(per.block)) {
    decX <- per.block[[i]]
    plot(decX$mean, decX$total, xlab="Mean log-expression", 
        ylab="Variance", main=names(per.block)[i])
    curve(metadata(decX)$trend(x), col="blue", add=TRUE)
}
# Get the top 10% of genes.
top.hvgs <- getTopHVGs(dec, prop=0.1)

# Get the top 2000 genes.
top.hvgs2 <- getTopHVGs(dec, n=2000)

# Get all genes with positive biological components.
top.hvgs3 <- getTopHVGs(dec, var.threshold=0)

# Get all genes with FDR below 5%.
top.hvgs4 <- getTopHVGs(dec, fdr.threshold=0.05)
# Running the PCA with the 10% of HVGs.
library(scater)
sce <- runPCA(sce, subset_row=top.hvgs)
reducedDimNames(sce)
5. 自動化PC選擇
sced <- denoisePCA(sce, dec2, subset.row=getTopHVGs(dec2, prop=0.1))
ncol(reducedDim(sced, "PCA"))
## [1] 50
output <- getClusteredPCs(reducedDim(sce))
npcs <- metadata(output)$chosen
reducedDim(sce, "PCAsub") <- reducedDim(sce, "PCA")[,1:npcs,drop=FALSE]
npcs
## [1] 14
6. Graph-based clustering
# In this case, using the PCs that we chose from getClusteredPCs().
g <- buildSNNGraph(sce, use.dimred="PCAsub")
cluster <- igraph::cluster_walktrap(g)$membership

# Assigning to the 'colLabels' of the 'sce'.
colLabels(sce) <- factor(cluster)
table(colLabels(sce))
## 
##   1   2   3   4   5   6   7   8   9  10  11  12 
##  79 285  64 170 166 164 124  32  57  63  63  24
sce <- runTSNE(sce, dimred="PCAsub")
plotTSNE(sce, colour_by="label", text_by="label")
ratio <- clusterModularity(g, cluster, as.ratio=TRUE)

library(pheatmap)
pheatmap(log10(ratio+1), cluster_cols=FALSE, cluster_rows=FALSE,
    col=rev(heat.colors(100)))
ass.prob <- bootstrapCluster(sce, FUN=function(x) {
    g <- buildSNNGraph(x, use.dimred="PCAsub")
    igraph::cluster_walktrap(g)$membership
}, clusters=sce$cluster)

pheatmap(ass.prob, cluster_cols=FALSE, cluster_rows=FALSE,
    col=colorRampPalette(c("white", "blue"))(100))
subout <- quickSubCluster(sce, groups=colLabels(sce))
table(metadata(subout)$subcluster) # formatted as '<parent>.<subcluster>'
## 
##  1.1  1.2 10.1 10.2 10.3 11.1 11.2   12  2.1  2.2  2.3  2.4  3.1  3.2  3.3  4.1 
##   38   41   16   19   28   29   34   24   96   35   81   73   26   19   19   53 
##  4.2  4.3  4.4  5.1  5.2  6.1  6.2  6.3  7.1  7.2  7.3    8  9.1  9.2 
##   67   33   17   73   93   64   65   35   35   35   54   32   33   24
7. marker基因鑒定
# Uses clustering information from 'colLabels(sce)' by default:
markers <- findMarkers(sce)
markers[[1]][,1:3]
## DataFrame with 20064 rows and 3 columns
##                          Top      p.value          FDR
##                    <integer>    <numeric>    <numeric>
## CPE__chr4                  1  1.72176e-62  1.43939e-59
## KCNQ1OT1__chr11            1  2.07621e-61  1.60220e-58
## LOC100131257__chr7         1  2.66948e-43  7.87654e-41
## PGM5P2__chr9               1  2.67376e-51  1.27730e-48
## SCG2__chr2                 1 1.41986e-104 2.84880e-100
## ...                      ...          ...          ...
## TLX1NB__chr10          19918            1            1
## TNFRSF17__chr16        19946            1            1
## TSPAN32__chr11         19973            1            1
## WFDC11__chr20          20015            1            1
## XKR7__chr20            20025            1  
wmarkers <- findMarkers(sce, test.type="wilcox", direction="up", lfc=1)
wmarkers[[1]][,1:3]
## DataFrame with 20064 rows and 3 columns
##                          Top     p.value         FDR
##                    <integer>   <numeric>   <numeric>
## FBLIM1__chr1               1 7.55507e-30 2.16550e-26
## KCNQ1OT1__chr11            1 1.30379e-37 1.51912e-33
## PGM5P2__chr9               1 1.46543e-35 9.80080e-32
## UGDH-AS1__chr4             1 1.51428e-37 1.51912e-33
## LOC100131257__chr7         2 7.66839e-33 3.07717e-29
## ...                      ...         ...         ...
## TLX1NB__chr10          19918           1           1
## TNFRSF17__chr16        19946           1           1
## TSPAN32__chr11         19973           1           1
## WFDC11__chr20          20015           1           1
## XKR7__chr20            20025           1    
markers <- findMarkers(sce, pval.type="all")
markers[[1]][,1:2]
## DataFrame with 20064 rows and 2 columns
##                        p.value         FDR
##                      <numeric>   <numeric>
## UGDH-AS1__chr4     8.36195e-20 1.67774e-15
## KCNQ1OT1__chr11    2.72694e-19 2.42652e-15
## LOC100131257__chr7 3.62817e-19 2.42652e-15
## TFDP2__chr3        5.98639e-19 3.00277e-15
## LOC643406__chr20   1.09251e-18 4.38402e-15
## ...                        ...         ...
## ZP1__chr11                   1           1
## ZP3__chr7                    1           1
## ZPBP__chr7                   1           1
## ZSCAN1__chr19                1           1
## ZSCAN20__chr1                1           1
8. Detecting correlated genes
# Using the first 200 HVs, which are the most interesting anyway.
# Also turning down the number of iterations for speed.
of.interest <- top.hvgs[1:200]
cor.pairs <- correlatePairs(sce, subset.row=of.interest, iters=1e5)
cor.pairs
## DataFrame with 19900 rows and 6 columns
##                 gene1           gene2         rho     p.value         FDR
##           <character>     <character>   <numeric>   <numeric>   <numeric>
## 1      UGDH-AS1__chr4 KCNQ1OT1__chr11    0.830410 1.99998e-05 3.83241e-05
## 2           GCG__chr2      TTR__chr18    0.798357 1.99998e-05 3.83241e-05
## 3         REG1A__chr2     PRSS1__chr7    0.784339 1.99998e-05 3.83241e-05
## 4         REG1A__chr2    SPINK1__chr5    0.780994 1.99998e-05 3.83241e-05
## 5         REG1A__chr2     REG1B__chr2    0.760322 1.99998e-05 3.83241e-05
## ...               ...             ...         ...         ...         ...
## 19896    TM4SF1__chr3    HYDIN2__chr1 0.000115737     0.99877    0.998971
## 19897   SLC30A8__chr8     MUC13__chr3 0.000169530     0.99919    0.999341
## 19898     KRT7__chr12 FLJ30403__chr19 0.000159983     0.99957    0.999670
## 19899 C15orf48__chr15 FLJ30403__chr19 0.000144531     0.99973    0.999780
## 19900     RBP4__chr10     DUSP1__chr5 0.000153488     0.99993    0.999930
##         limited
##       <logical>
## 1          TRUE
## 2          TRUE
## 3          TRUE
## 4          TRUE
## 5          TRUE
## ...         ...
## 19896     FALSE
## 19897     FALSE
## 19898     FALSE
## 19899     FALSE
## 19900     FALSE
cor.pairs2 <- correlatePairs(sce, subset.row=of.interest, 
    block=sce$donor, iters=1e5)
cor.genes <- correlateGenes(cor.pairs)
cor.genes
## DataFrame with 200 rows and 5 columns
##                gene       rho     p.value         FDR   limited
##         <character> <numeric>   <numeric>   <numeric> <logical>
## 1    UGDH-AS1__chr4  0.830410 7.23629e-05 9.39778e-05      TRUE
## 2         GCG__chr2  0.798357 2.94812e-05 6.17910e-05      TRUE
## 3       REG1A__chr2  0.784339 2.88403e-05 6.17910e-05      TRUE
## 4        TTR__chr18  0.798357 2.72600e-05 6.17910e-05      TRUE
## 5       CHGB__chr20  0.751585 2.70746e-05 6.17910e-05      TRUE
## ...             ...       ...         ...         ...       ...
## 196       FN1__chr2  0.164284 1.59198e-04 1.60806e-04      TRUE
## 197      MAFA__chr8  0.362235 6.12302e-05 8.33063e-05      TRUE
## 198        F3__chr1  0.378165 3.82688e-05 6.31239e-05      TRUE
## 199    SRXN1__chr20  0.340372 2.09472e-04 2.09472e-04      TRUE
## 200 KDM4A-AS1__chr1  0.330622 9.47610e-05 1.03564e-04      TRUE
9. 轉(zhuǎn)換成其他數(shù)據(jù)形式
y <- convertTo(sce, type="edgeR")
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
禁止轉(zhuǎn)載寝杖,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者违施。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市瑟幕,隨后出現(xiàn)的幾起案子醉拓,更是在濱河造成了極大的恐慌,老刑警劉巖收苏,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異愤兵,居然都是意外死亡鹿霸,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進(jìn)店門秆乳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來懦鼠,“玉大人,你說我怎么就攤上這事屹堰「匾保” “怎么了?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵扯键,是天一觀的道長睦袖。 經(jīng)常有香客問我,道長荣刑,這世上最難降的妖魔是什么馅笙? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮厉亏,結(jié)果婚禮上董习,老公的妹妹穿的比我還像新娘。我一直安慰自己爱只,他們只是感情好皿淋,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般窝趣。 火紅的嫁衣襯著肌膚如雪疯暑。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天高帖,我揣著相機(jī)與錄音缰儿,去河邊找鬼。 笑死散址,一個胖子當(dāng)著我的面吹牛乖阵,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播预麸,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼瞪浸,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了吏祸?” 一聲冷哼從身側(cè)響起对蒲,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎贡翘,沒想到半個月后蹈矮,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鸣驱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年泛鸟,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片踊东。...
    茶點(diǎn)故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡北滥,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出闸翅,到底是詐尸還是另有隱情再芋,我是刑警寧澤,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布坚冀,位于F島的核電站济赎,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏记某。R本人自食惡果不足惜联喘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望辙纬。 院中可真熱鬧豁遭,春花似錦、人聲如沸贺拣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至闪幽,卻和暖如春啥辨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背盯腌。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工溉知, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人腕够。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓级乍,卻偏偏與公主長得像,于是被迫代替她去往敵國和親帚湘。 傳聞我的和親對象是個殘疾皇子玫荣,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評論 2 348

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