- Downsamplingはそれなりに数のある標本から、標本数を減らしてリサンプリングする作業のこと
- RNAseqのデータにおいて、複数の細胞からの1細胞RNAseqのデータを相互比較したりするときに、ダウンサンプリングした方がよい、という話が、こちらの論文にあったので、Rでシミュレーションしてどんな具合かを眺めてみる
- 1細胞RNAseq では、1細胞内にmRNAのプールがあって、Ng個(たとえば25000個とか)の遺伝子のそれぞれのmRNA分子が、n_1,n_2,...,n_{Ng}個というように整数値で存在していると考える。そして1細胞シークエンスという条件では、このn_1+n_2+...+n_{Ng}の総mRNA分子のプールから、それなりの数が多項分布的に選び出されてそれが「読み本数」として報告される、という仕組みになっている
- こんなときに、実験を複数の細胞で実施すると、これまた実験条件ブレが結構入るのは少量系の宿命なのだが、「多項分布的な選び出し」の部分にかなりのばらつきが入ってしまう
また、この論文では、典型的な細胞状態、というものを複数想定して、その想定細胞から、RNAseq結果が得られたとして、どの想定細胞である確率がどれくらい高いか、という評価をしているのだが、それをするときに、細胞ごとに、読み本数がばらつくと、そのばらつきが、「比率評価」の曖昧度に影響することもあり、「読み本数」をそろえたい
- 「読み本数」をそろえるためにダウンサンプリングしましょう、となっている
- リプレイスなしで指定本数までダウンサンプリングしている
- 書き散らしソース
Ng <- 1000
Nc <- 1000
p <- dexp(1:Ng,0.01)
p <- p/sum(p)
plot(p)
X <- matrix(0,Nc,Ng)
Y <- list()
Z <- rep(0,Ng)
for(i in 1:Nc){
N.mRNA <- round(10^(runif(1)*2+3))
s <- sample(1:Ng,N.mRNA,replace=TRUE,prob=p)
X[i,] <- tabulate(s,Ng)
Y[[i]] <- s
Z <- Z + X[i,]
}
thres <- 10^4
P1 <- P2 <- matrix(0,Nc,Ng)
oks <- rep(0,Nc)
n.rna <- rep(0,Nc)
for(i in 1:Nc){
P1[i,] <- (X[i,]+1)/sum(X[i,]+1)
n.rna[i] <- sum(X[i,])
if(sum(X[i,]) > thres){
tmp <- sample(Y[[i]],thres)
tmp.tab <- tabulate(tmp,Ng)
P2[i,] <- (tmp.tab+1)/sum(tmp.tab+1)
oks[i] <- 1
}
}
mean1 <- apply(P1,2,mean)
mean1.1 <- apply(P1[which(oks==1),],2,mean)
var1 <- apply(P1,2,var)
mean2 <- apply(P2[which(oks==1),],2,mean)
var2 <- apply(P2[which(oks==1),],2,var)
plot(mean1,p)
plot(mean2,p)
matplot(log(cbind(p,mean1,mean1.1,mean2,Z/sum(Z))),type="l")
legend(0, -10, c("theory","simple.mean","mean.of.manys","down.sampled","total.mean"), col = 1:5, lty = 1:5)
plot(n.rna,P1[,1])