R包sva去除批次效應(yīng)

關(guān)于sva包

sva的用戶說明:http://www.bioconductor.org/packages/release/bioc/vignettes/sva/inst/doc/sva.pdf

其中關(guān)于去除批次效應(yīng)的函數(shù)有CombatCombat_seq兩個(gè)歉提,而Combat主要面對的是帶有小數(shù)的數(shù)據(jù)(比方說芯片數(shù)據(jù))区转,基于的是貝葉斯原理;而Combat_seq主打RNA-seq的count數(shù)據(jù)恋拷,基于負(fù)二項(xiàng)分布回歸

Combat

測試數(shù)據(jù)的設(shè)計(jì)矩陣為:



表達(dá)矩陣為:



按照說明書那樣蔬顾,我們需要事先知道這些batch的變量類型
# 提取batch的信息
batch = pheno$batch
# 建立對照組模型湘捎,這不也可以省略
modcombat = model.matrix(~1, data=pheno)

# 去除批次效應(yīng)
combat_edata1 = ComBat(dat=edata, batch=batch, mod=NULL, par.prior=TRUE,  prior.plots=FALSE)

這樣返回的就是去除批次效應(yīng)后的數(shù)據(jù)了

而Combat函數(shù)的核心代碼:

# 輸入數(shù)據(jù)
dat=edata
batch=batch
mod = NULL    ## 忽略設(shè)計(jì)矩陣
par.prior = TRUE
prior.plots = FALSE
mean.only = FALSE
ref.batch = NULL

# 定義出批次效應(yīng)的項(xiàng)
batch <- as.factor(batch)

# dat 為表達(dá)矩陣,s.data相當(dāng)于標(biāo)準(zhǔn)化后的表達(dá)矩陣
s.data <- (dat-stand.mean)/(sqrt(var.pooled) %*% t(rep(1,n.array)))

# 找到相同levels的sample舷胜,并歸類
n.batch <- nlevels(batch)
  batches <- list()
  for (i in 1:n.batch) {
    ## 把相同 levels 的 sample 歸為一類活翩,即 batches[[1]] 代表所有l(wèi)evels = 1 的sample
    batches[[i]] <- which(batch == levels(batch)[i])
  } # list of samples in each batch  

# 計(jì)算去除批次效應(yīng)的表達(dá)矩陣
bayesdata <- s.data
## batches 代表有批次效應(yīng)的sample
## 所有有批次效應(yīng)的sample需要扣除批次效應(yīng)的影響
for (i in batches){
    bayesdata[,i] <- (bayesdata[,i]-t(batch.design[i,]%*%gamma.star))/(sqrt(delta.star[j,])%*%t(rep(1,n.batches[j]))) 
    ### t(batch.design[i,]%*%gamma.star) 代表批次效應(yīng)所引起的基因表達(dá)量的差異材泄,這一部分是需要被扣除的
    j <- j+1
  }

# 最后乘上系數(shù)
 bayesdata <- (bayesdata*(sqrt(var.pooled)%*%t(rep(1,n.array))))+stand.mean # FIXME

而這段代碼的理論部分來自于文章《Adjusting batch effects in microarray expression data using empirical Bayes methods》

文章對去除批次效應(yīng)分為了三步:
step_1:Standardize the data


簡單分析下各個(gè)因素對表達(dá)量的影響

其中:

  1. Yijg 代表 gene g for sample j from batch i
  2. αg 代表 overall gene expression,即 gene g 在所有sample中平均表達(dá)量
  3. X 代表 a design matrix for sample conditions峦树,代表實(shí)驗(yàn)設(shè)計(jì)所制定的矩陣
  4. βg 代表對X矩陣的回歸系數(shù),代表不同設(shè)計(jì)矩陣各個(gè)因素下的效應(yīng)值
  5. X·βg 代表設(shè)計(jì)矩陣各個(gè)因素除平均表達(dá)量αg以外的額外的表達(dá)值急灭,對于sample j (因素 j)最后加上 αg 則代表sample j 中 gene g 的表達(dá)量
  6. γig 代表 the additive and multiplicative batch effects of batch i for gene g
  7. δig 代表 the additive and multiplicative batch effects of batch i for gene g

標(biāo)準(zhǔn)化

由上面的公式結(jié)合代碼我們不難看出谷遂,此時(shí)忽略設(shè)計(jì)矩陣

## 定義設(shè)計(jì)矩陣
## combine batch variable and covariates
design <- cbind(batchmod,mod)
## batchmod為與batch有關(guān)的設(shè)計(jì)矩陣埋凯,mod為實(shí)驗(yàn)設(shè)計(jì)矩陣
  
# 均值的計(jì)算
stand.mean <- stand.mean+t(tmp %*% B.hat)
# 方差的計(jì)算
var.pooled <- ((dat-t(design %*% B.hat))^2) %*% rep(1/n.array,n.array)
## B.hat代表β.hat
## tmp為與batch相關(guān)的設(shè)計(jì)矩陣,即與,如果不考慮實(shí)驗(yàn)設(shè)計(jì)因素换怖,那么tmp為0矩陣

Step_2: EB batch effect parameter estimates using parametric empirical priors
假設(shè)每一個(gè)元素所服從分布如下:


顯而易見的是經(jīng)過標(biāo)準(zhǔn)化后的sample j 中 gene g 的表達(dá)量的不同沉颂,完全是由于批次效應(yīng)所導(dǎo)致(因?yàn)闃?biāo)準(zhǔn)化過程以及扣除均值αg,實(shí)驗(yàn)設(shè)計(jì)的差異部分 X·βg 的影響钉蒲,僅剩下批次效應(yīng)的影響)

假設(shè)標(biāo)準(zhǔn)化后的表達(dá)矩陣?yán)锩娴脑刂?Zijg 服從正態(tài)分布彻坛,均值為 γig(γig為the additive and multiplicative batch effects of batch i for gene g)而這些參數(shù)估計(jì)需要用到貝葉斯后驗(yàn)來進(jìn)行估計(jì)


假設(shè) γig 服從正態(tài)分布钙蒙,這個(gè)假設(shè)我有點(diǎn)吐槽间驮,萬一 γig(批次效應(yīng)所引起的差異值)并不服從這種分布呢?

并且作者定義

為批次效應(yīng)所引起的基因表達(dá)量的差異扛施,這一部分是需要被扣除的

Step_3: Adjust the data for batch effects


由上面式子我們知道疙渣,最終去除批次效應(yīng)結(jié)果的主體是標(biāo)準(zhǔn)化的數(shù)據(jù)減去批次效應(yīng)所引起的基因表達(dá)量的差異而得
其中
為扣除批次效應(yīng)后的表達(dá)量
帶帽的
代表批次效應(yīng)所引起的基因表達(dá)量的差異的估計(jì)值

Combat_seq

這個(gè)函數(shù)主打RNA-seq的count數(shù)據(jù)昌阿,而它的下載方式需要用:

# 下載方式
devtools::install_github("zhangyuqing/sva-devel")

# 示例數(shù)據(jù)
count_matrix <- matrix(rnbinom(400, size=10, prob=0.1),nrow=50, ncol=8)
batch <- c(rep(1, 4), rep(2, 4))
adjusted <- ComBat_seq(count_matrix, batch=batch, group=NULL)

我們參考這篇文獻(xiàn)來分析它的原理:《ComBat-Seq: batch effect adjustment for RNA-Seq count data》
Combat_seq基于的原理是負(fù)二項(xiàng)分布回歸

這里的負(fù)二項(xiàng)分布指的是基因的表達(dá)服從負(fù)二項(xiàng)分布,如下圖



橫坐標(biāo)表示基因的表達(dá)量灶轰,縱坐標(biāo)表示的是基因表達(dá)量在某個(gè)區(qū)間范圍內(nèi)的頻率刷钢,那么整個(gè)count矩陣數(shù)據(jù)符合負(fù)二項(xiàng)分布,用具有這樣數(shù)據(jù)特點(diǎn)的矩陣做的回歸稱為負(fù)二項(xiàng)分布回歸


同樣的伴澄,它的基本模型也是線性模型阱缓,理解起來和Combat的是類似的

其中:

  1. μijg 代表 gene g for sample j from batch i
  2. αg 代表 overall gene expression,即 gene g 在所有sample中平均表達(dá)量
  3. Xj 代表 a design matrix for sample conditions敞嗡,代表實(shí)驗(yàn)設(shè)計(jì)所制定的矩陣
  4. βg 代表對X矩陣的回歸系數(shù)航背,代表不同設(shè)計(jì)矩陣各個(gè)因素下的效應(yīng)值
  5. Xj·βg 代表設(shè)計(jì)矩陣各個(gè)因素除平均表達(dá)量αg以外的額外的表達(dá)值,對于sample j (因素 j)最后加上 αg 則代表sample j 中 gene g 的表達(dá)量
  6. γgi 代表批次效應(yīng) i 影響 gene g 的表達(dá)值從而產(chǎn)生差異的部分(均值)
  7. ** ?gi** 代表批次效應(yīng) i 影響 gene g 的表達(dá)值從而產(chǎn)生差異的部分(dispersion)
  8. Nj 代表文庫大小

而關(guān)于Combat_seq的核心代碼:

# 讀入相關(guān)的內(nèi)容
## count_matrix為count矩陣
counts = count_matrix
## batch 為批次效應(yīng)向量
batch=batch
group=NULL
covar_mod=NULL
full_mod=TRUE
shrink=FALSE
shrink.disp=FALSE
gene.subset.n=NULL


# 廣義線性模型擬合數(shù)據(jù)箕肃,即建立真實(shí)的基因表達(dá)量
## 這里的design代表的是batch的設(shè)計(jì)矩陣
## dge_obj$counts為counts矩陣
## 參數(shù) phi_matrix 通過edgeR包中的函數(shù)estimateGLMCommonDisp進(jìn)行估計(jì)
glm_f2 <- glmFit.default(dge_obj$counts, design=design, dispersion=phi_matrix, 
                         offset=new_offset, prior.count=1e-4) 
  

# gamma_hat 為glm_f2 模型的系數(shù)今魔,代表不同batch對每個(gè)sample的影響
gamma_hat <- glm_f2$coefficients[, 1:n_batch]
# mu_hat為利用模型擬合的count值
mu_hat <- glm_f2$fitted.values
phi_hat <- do.call(cbind, genewise_disp_lst)

design矩陣

design矩陣的行為不同的sample1-8
而dge_obj$counts為counts矩陣涡贱,counts矩陣的行為不同的基因

前1-4個(gè)sample受到batch1的影響,后5-8個(gè)sample受到batch2的影響督函,由于batch的設(shè)計(jì)矩陣都是0激挪,1型的因子變量,所以模型的系數(shù)就可以定義為γgi垄分,即Xj·gamma_hat(X取值為0或1)對應(yīng)的就是γgi(批次效應(yīng) i 影響 gene g 的表達(dá)值從而產(chǎn)生差異的部分)的值

然而去除批次效應(yīng)所帶來影響需要將原始counts值,減去對應(yīng)batch所帶來的影響γgi

mu_star <- matrix(NA, nrow=nrow(counts), ncol=ncol(counts))
## mu_hat 可以理解為count值
## vec2mat(gamma_star_mat[, jj], n_batches[jj])可以理解為batch的效應(yīng)值 γgi叫倍,只不過將它做成矩陣形式方便計(jì)算
for(jj in 1:n_batch){
    ## count值減去batch的效應(yīng)值 γgi,最終得到去除批次效應(yīng)的結(jié)果
    mu_star[, batches_ind[[jj]]] <- exp(log(mu_hat[, batches_ind[[jj]]])-vec2mat(gamma_star_mat[, jj], n_batches[jj]))
  }

最后對 mu_star 進(jìn)行整數(shù)化的矯正就可以得到最終結(jié)果了:


行為基因听诸,列為sample1-8

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蚕泽,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子仔蝌,更是在濱河造成了極大的恐慌荒吏,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件豆混,死亡現(xiàn)場離奇詭異动知,居然都是意外死亡员辩,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門丹皱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來宋税,“玉大人,你說我怎么就攤上這事杰赛。” “怎么了根时?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵辰晕,是天一觀的道長。 經(jīng)常有香客問我替裆,道長,這世上最難降的妖魔是什么辆童? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任胸遇,我火速辦了婚禮,結(jié)果婚禮上纸镊,老公的妹妹穿的比我還像新娘。我一直安慰自己峰搪,他們只是感情好凯旭,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著罐呼,像睡著了一般。 火紅的嫁衣襯著肌膚如雪厌杜。 梳的紋絲不亂的頭發(fā)上计螺,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天,我揣著相機(jī)與錄音匙握,去河邊找鬼陈轿。 笑死,一個(gè)胖子當(dāng)著我的面吹牛济欢,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播茫叭,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼半等,長吁一口氣:“原來是場噩夢啊……” “哼呐萨!你這毒婦竟也來了莽囤?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤惨远,失蹤者是張志新(化名)和其女友劉穎话肖,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體最筒,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡床蜘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了扬蕊。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片丹擎。...
    茶點(diǎn)故事閱讀 37,997評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖鸥鹉,靈堂內(nèi)的尸體忽然破棺而出庶骄,到底是詐尸還是另有隱情,我是刑警寧澤灸异,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布羔飞,位于F島的核電站,受9級特大地震影響逻淌,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜田柔,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望欣舵。 院中可真熱鬧,春花似錦缘圈、人聲如沸袜蚕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽颠黎。三九已至,卻和暖如春狭归,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背过椎。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工疚宇, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人敷待。 一個(gè)月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓榜揖,卻偏偏與公主長得像勾哩,于是被迫代替她去往敵國和親举哟。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評論 2 345

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