貝葉斯共定位軟件coloc

前言

這篇文章的書寫锡溯,是受啟發(fā)于《post-GWAS:使用coloc進行共定位分析(Colocalization)》,目的是想了解一下軟件coloc是如何巧妙的運用貝葉斯方法的

共定位的基本原理

關(guān)于coloc的基本原理可以參考這四篇文章:

  1. 《Eliciting priors and relaxing the single causal variant assumption in colocalisation analyses》
  2. 《Bayesian Test for Colocalisation between Pairs of Genetic Association Studies Using Summary Statistics》
  3. 《A Bayesian framework for multiple trait colocalization from summary association statistics》
  4. 《Bayes Factors for Genome-Wide Association Studies: Comparison with P-values》

我們還是以GWAS數(shù)據(jù)和eQTL數(shù)據(jù)為例:


注:位于上方的區(qū)間理解為GWAS數(shù)據(jù)氧猬,位于下方的區(qū)間理解為eQTL數(shù)據(jù)垛叨;橙色表征該snp與 trait 1 顯著相關(guān),藍色表征該snp與 trait 2 顯著相關(guān)

對于某一段基因組區(qū)間來說儡遮,將會有下面四種假設(shè):

  1. H0 :No association with either trait
  2. H1 : Association with trait 1, not with trait 2
  3. H2 : Association with trait 2, not with trait 1
  4. H3 : Association with trait 1 and trait 2, two independent SNPs
  5. H4 : Association with trait 1 and trait 2, one shared SNP

那么怎么理解共定位呢安疗?
首先抛杨,無論是eQTL的數(shù)據(jù),還是GWAS的數(shù)據(jù)荐类,都是基于混合線性模型將基因型和性狀給聯(lián)系起來的怖现。但是無論是eQTL的數(shù)據(jù),還是GWAS的數(shù)據(jù)玉罐,一般就只能關(guān)聯(lián)一種性狀屈嗤;那么共定位的目的就是要將某些關(guān)聯(lián)到多個性狀的snp給找出來

而eQTL的優(yōu)勢是能夠找到snp能夠調(diào)控某基因的表達潘拨,從而影響某一種性狀(eQTL往往是通過snp影響某個基因表達,而這個基因控制著某一種性狀恢共,從而將snp和性狀聯(lián)系起來);而gwas的又是在全基因組的角度璧亚,尋找與某性狀相關(guān)聯(lián)的snp

如下圖:



對于某一段的基因組區(qū)間來說讨韭,0代表與trait無關(guān),1代表與trait有關(guān)癣蟋,那么第三張圖就表示該snp與兩種性狀都相關(guān)聯(lián)透硝,因此共定位就是想找出這一些與兩個性狀都相關(guān)的snp

貝葉斯因子

假設(shè):



那么等式
定義為貝葉斯因子
貝葉斯因子的大小

貝葉斯因子介于0—1之間,越接近1疯搅,代表越支持H1濒生;越接近0,則越支持H0

由式子我們可以看出貝葉斯因子是連接先驗概率和后驗概率的橋梁幔欧,然而在該項目中罪治,計算貝葉斯因子是一件比較困難的事情,因此作者采用了ABF(Approximate Bayes Factor)來近似代替貝葉斯因子礁蔗。

ABF利用gwas觉义,eQTL數(shù)據(jù)中的p_val與貝葉斯因子之間建立邏輯回歸模型,做擬合浴井,然后得到表達式

具體推導:
對于H0與H1兩種情況的事件來說晒骇,貝葉斯因子可以寫作是:

其中,i 代表每一個snp磺浙,pik表示在H1條件下發(fā)生的概率洪囤,1-pik表示在H0條件下發(fā)生的概率
zi代表gwas,eQTL數(shù)據(jù)中的p_val撕氧,經(jīng)過均值為0的正態(tài)分布轉(zhuǎn)換后的似然值瘤缩;事實上,p_val越小伦泥,代表該位點與性狀的關(guān)聯(lián)越顯著(越能接受H1)款咖,因此p_val對應(yīng)轉(zhuǎn)換后的似然值越大,即zi越大奄喂,進而推出 pik 越大铐殃,1-pik 越小,則H1發(fā)生的概率越大跨新,即貝葉斯因子越大富腊,越?jīng)]有理由拒絕H1
因此,最終有
zk代表gwas域帐,eQTL數(shù)據(jù)中的p_val赘被,經(jīng)過正態(tài)分布轉(zhuǎn)換后的似然值的總和
總結(jié):這樣做擬合是整,我們就只需要輸入gwas,eQTL數(shù)據(jù)中的p_val民假,就可以得到對應(yīng)的ABF了浮入,這樣的擬合連接了p_val和ABF,使計算更為方便了

對于四種假設(shè)羊异,我們計算后驗概率有:



而p0事秀,p1,p2野舶,p12分別代表H0易迹,H1,H2平道,H4假設(shè)下的先驗概率

代碼分析

注明出處:《post-GWAS:使用coloc進行共定位分析(Colocalization)》睹欲,我用了這篇文章的示例數(shù)據(jù)

# install
library(remotes)
install_github("chr1swallace/coloc",build_vignettes=TRUE)
library("coloc")
library(dplyr)

# 讀取文件
gwas <- read.table(file="GWAS.txt", header=T)
eqtl <- read.table(file="eQTL.txt", header=T)

# 運行
## 選取gwas數(shù)據(jù)和eQTL數(shù)據(jù)共有的snp(rs_id)
input <- merge(eqtl, gwas, by="rs_id", all=FALSE, suffixes=c("_eqtl","_gwas"))

# type="cc" 表示二元性狀
# type="quant" 表示連續(xù)性狀
result <- coloc.abf(dataset1=list(pvalues=input$pval_nominal_gwas, type="cc", s=0.33, N=50000), 
                    dataset2=list(pvalues=input$pval_nominal_eqtl, type="quant", N=10000), MAF=input$maf)

# 篩選后驗概率大于0.95的位點
need_result=result$results %>% filter(SNP.PP.H4 > 0.95)

從源代碼分析,對于函數(shù)coloc.abf()

# 讀取數(shù)據(jù)
dataset1=list(pvalues=input$pval_nominal_gwas, type="cc", s=0.33, N=50000)
dataset2=list(pvalues=input$pval_nominal_eqtl, type="quant", N=10000)
MAF=input$maf

對于eQTL的數(shù)據(jù):


eQTL
  1. id代表不同的snp
  2. variant_id 包含該snp的位置信息和突變信息
  3. gene_id 代表這些snp調(diào)控的基因一屋,一般做此類分析我們focus在一個基因上就好窘疮,這一個基因通常控制著一個性狀
  4. tss_distance 代表某snp距離這個基因的距離
  5. rna_count 代表該基因表達量
  6. maf 代表次等位基因頻率
  7. slope 可以理解為某snp對該基因調(diào)控的效應(yīng)
  8. p值為顯著性

對于gwas數(shù)據(jù):


gwas
  1. id代表不同的snp
  2. variant_id 包含該snp的位置信息和突變信息
  3. beta 可以理解為某snp對該基因調(diào)控的效應(yīng)
  4. p值為顯著性

我們看看源代碼:

# 定義H1冀墨,H2考余,H4的先驗概率
## 默認概率如下
p1=1e-4
p2=1e-4
p12=1e-5

# 預(yù)處理data,計算gwas和eQTL的貝葉斯因子
## (1) process.dataset
df1 <- process.dataset(d=dataset1, suffix="df1")
df2 <- process.dataset(d=dataset2, suffix="df2")

merged.df <- merge(df1,df2)
# 新增一列g(shù)was和eQTL的 logABF 的加和值
merged.df$internal.sum.lABF <- with(merged.df, lABF.df1 + lABF.df2)
## add SNP.PP.H4 - post prob that each SNP is THE causal variant for a shared signal
my.denom.log.abf <- logsum(merged.df$internal.sum.lABF)

## 計算 H4 的貝葉斯因子
merged.df$SNP.PP.H4 <- exp(merged.df$internal.sum.lABF - my.denom.log.abf)

pp.abf <- combine.abf(merged.df$lABF.df1, merged.df$lABF.df2, p1, p2, p12)  
common.snps <- nrow(merged.df)
results <- c(nsnps=common.snps, pp.abf)

output<-list(summary=results,
             results=merged.df,
             priors=c(p1=p1,p2=p2,p12=p12))

(1).對于函數(shù)process.dataset()

d$snp <- sprintf("SNP.%s",1:length(d$pvalues))
df <- data.frame(pvalues = d$pvalues,
                   MAF = d$MAF,
                   N=d$N,
                   snp=as.character(d$snp))    
snp.index <- which(colnames(df)=="snp")
colnames(df)[-snp.index] <- paste(colnames(df)[-snp.index], suffix, sep=".")
keep <- which(df$MAF>0 & df$pvalues > 0) # all p values and MAF > 0
df <- df[keep,]

## 計算 ABF(Approximate Bayes Factor)
abf <- approx.bf.p(p=df$pvalues, f=df$MAF, type=d$type, N=df$N, s=d$s, suffix=suffix)
df <- cbind(df, abf)

1.函數(shù)approx.bf.p()

p=df$pvalues
f=df$MAF
type=d$type
N=df$N
s=d$s
suffix=suffix
  
if(type=="quant") {
    sd.prior <- 0.15
    V <- Var.data(f, N)
} else {
    sd.prior <- 0.2
    V <- Var.data.cc(f, N, s)
}
# 將gwas和eQTL的p_val轉(zhuǎn)換為正態(tài)分布的似然值
z <- qnorm(0.5 * p, lower.tail = FALSE)
## Shrinkage factor: ratio of the prior variance to the total variance
## 計算校正因子 r
r <- sd.prior^2 / (sd.prior^2 + V)
## Approximate BF  # I want ln scale to compare in log natural scale with LR diff
## 計算 ABF 的log值
lABF = 0.5 * (log(1-r) + (r * z^2))
ret <- data.frame(V,z,r,lABF)
if(!is.null(suffix))
   colnames(ret) <- paste(colnames(ret), suffix, sep=".")

(2).對于函數(shù)combine.abf()

combine.abf <- function(l1, l2, p1, p2, p12) {
  lsum <- l1 + l2
  lH0.abf <- 0
  ## 計算H1的后驗概率
  lH1.abf <- log(p1) + logsum(l1)
  ## 計算H2的后驗概率
  lH2.abf <- log(p2) + logsum(l2)
  ## 計算H3的后驗概率
  lH3.abf <- log(p1) + log(p2) + logdiff(logsum(l1) + logsum(l2), logsum(lsum))
  ## 計算H4的后驗概率
  lH4.abf <- log(p12) + logsum(lsum)
  
  all.abf <- c(lH0.abf, lH1.abf, lH2.abf, lH3.abf, lH4.abf)
  my.denom.log.abf <- logsum(all.abf)
  pp.abf <- exp(all.abf - my.denom.log.abf)
  names(pp.abf) <- paste("PP.H", (1:length(pp.abf)) - 1, ".abf", sep = "")
  return(pp.abf)
}

代碼中注釋的計算后驗概率原理如下圖:


那么我們找到第五項的后驗概率高的話轧苫,代表該snp調(diào)控兩種性狀楚堤,并且將gwas和eQTL數(shù)據(jù)聯(lián)系到了一起

結(jié)果解讀

對于其中一個snp來說

  1. snp 代表此snp的名字
  2. pvalues.df1(df2)代表gwas(eQTL)數(shù)據(jù)的p_val
  3. MAF.df1(df2)代表eQTL數(shù)據(jù)的MAF值,gwas數(shù)據(jù)的那一列MAF也由eQTL數(shù)據(jù)的MAF值代替
  4. v.df1(df2)代表gwas(eQTL)數(shù)據(jù)的效應(yīng)值
  5. z.df1(df2)代表gwas(eQTL)數(shù)據(jù)的p_val含懊,經(jīng)過均值為0的正態(tài)分布轉(zhuǎn)換后的似然值
  6. r.df1(df2)代表gwas(eQTL)數(shù)據(jù)的矯正因子 r
  7. lABF.df1(df2)代表gwas(eQTL)數(shù)據(jù)的H0身冬,H1,H2岔乔,H3酥筝,H4
    log(貝葉斯因子)之和
  8. internal.sum.lABF 代表 lABF.df1 + lABF.df2
  9. SNP.PP.H4 代表H4的貝葉斯因子
# 新增一列g(shù)was和eQTL的 logABF 的加和值
## lABF.df1 + lABF.df2 相當于某snp gwas和eQTL數(shù)據(jù)貝葉斯因子的乘積
merged.df$internal.sum.lABF <- with(merged.df, lABF.df1 + lABF.df2)
## add SNP.PP.H4 - post prob that each SNP is THE causal variant for a shared signal
my.denom.log.abf <- logsum(merged.df$internal.sum.lABF)

## 計算 H4 的貝葉斯因子
merged.df$SNP.PP.H4 <- exp(merged.df$internal.sum.lABF - my.denom.log.abf)

如上圖所示,SNP.PP.H4 = 1代表有強烈的理由接受H4

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末雏门,一起剝皮案震驚了整個濱河市嘿歌,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌茁影,老刑警劉巖宙帝,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異募闲,居然都是意外死亡步脓,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來靴患,“玉大人仍侥,你說我怎么就攤上這事≡Ь” “怎么了农渊?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長或颊。 經(jīng)常有香客問我砸紊,道長,這世上最難降的妖魔是什么饭宾? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任批糟,我火速辦了婚禮格了,結(jié)果婚禮上看铆,老公的妹妹穿的比我還像新娘。我一直安慰自己盛末,他們只是感情好弹惦,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著悄但,像睡著了一般棠隐。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上檐嚣,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天助泽,我揣著相機與錄音,去河邊找鬼嚎京。 笑死嗡贺,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的鞍帝。 我是一名探鬼主播诫睬,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼帕涌!你這毒婦竟也來了摄凡?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤蚓曼,失蹤者是張志新(化名)和其女友劉穎亲澡,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體纫版,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡谷扣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片会涎。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡裹匙,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出末秃,到底是詐尸還是另有隱情概页,我是刑警寧澤练慕,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站铃将,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏劲阎。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一悯仙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧锡垄,春花似錦沦零、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至千贯,卻和暖如春屯仗,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背丈牢。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工祭钉, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人己沛。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓慌核,卻偏偏與公主長得像,于是被迫代替她去往敵國和親申尼。 傳聞我的和親對象是個殘疾皇子垮卓,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345

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