阅读文献《Modeling gene regulation from paired expression and chromatin accessibility data》,以建模的角度看待基因调控的关系
构建模型加以理解
其中
- TGl 代表第 l 个受调控的基因的表达量
- CR1,...,4 代表chromatin regulators的表达量,chromatin regulators可以理解为调控染色质开放程度的regulators
- TF1,...,4 代表转录因子的表达量
- Ol1,...,4 代表对应 Element 的开放程度的,这里的 Element 称为 REs(regulatory element)
- α,β 代表系数
- Zi 体现第 i 个RE是否被激活
- Ci,j 体现第 j 个CR是否会被第 i 个RE招募
- PPI(CRj) 代表已知的,且能与第 j 个CR互作的TF集合
- MBi 第 i 个RE上match的motif集合
- REi 在上图表示的是某 Element ,Element 表示的是,一旦被激活则会对下游基因产生调控
- Bi,k 第 i 个RE上经过homer match上的motif的-log(p_val)之和
这个模型的理解,首先 CR 调控基因启动子区的开放程度,使得不同 Element 的开放程度不同,从而影响TF 结合到基因启动子区的 Elements 上,调控下游基因的表达
这个模型称之为PECA
1. Model of CR binding to REs
REs是否招募CRs可视为一个二分类问题,即招募(1)和不招募(0)两种,记作 Ci,j∈{0,1},作者在这里借助逻辑回归的思想,巧用对数比来表示REs对CRs招募的状态,
其中:
- ηl,0 和 ηl,1 为待估计参数;
- TFSk: TF expression specificity score
- Si,j :Si,j = PPI( CRj) ∩ MBi;i ∈ Il,j∈{1,2,...,J},l∈{1,2,...,L}
2. Model of RE activity
同理RE是否被激活也是一个二分类问题,记第 i 个RE的状态为:激活(1),未激活(0);Zi∈{0,1}
其中:
- Ci = [Ci,1, Ci,2, ..., Ci,J];i ∈ Il,l∈{1,2,...,L}
- αi,-1 和 αi,0 为待估参数
3.Model of TG expression.
将以上因素综合起来建立回归方程来表征 CR,TF 和 O(openness) 对下游基因 TG 的表达量影响
代码分析
以示例数据为例 RAd4 为例,本例子为 mm9 的参考基因组:
1. peaks calling
# 利用 macs2 call peak
macs2 callpeak -t ~/PECA-master/Input/RAd4.bam -f BAM -n RAd4 -g mm --nomodel --shift -100 --extsize 200
# 整理 peak 文件
cat RAd4_peaks.narrowPeak | awk 'BEGIN{FS="\t";OFS="\t"}{print $1,$2,$3,$1"_"$2"_"$3}' | grep -v rand |grep -v chrUn > region.txt
其中 region.txt 文件如下:
chr19 3024082 3024282 chr19_3024082_3024282 chr19 3033281 3033481 chr19_3033281_3033481 chr19 3069706 3069906 chr19_3069706_3069906 chr19 3100747 3100947 chr19_3100747_3100947 chr19 3204539 3204739 chr19_3204539_3204739 chr19 3282618 3283448 chr19_3282618_3283448 chr19 3292091 3292316 chr19_3292091_3292316 chr19 3323139 3323551 chr19_3323139_3323551 chr19 3325290 3325683 chr19_3325290_3325683 chr19 3357700 3357978 chr19_3357700_3357978 chr19 3388600 3389490 chr19_3388600_3389490 chr19 3422478 3422876 chr19_3422478_3422876 chr19 3451329 3451560 chr19_3451329_3451560
表示的是 peak 的位置
2. homer 寻找motif
其中 all_motif_rmdup 为示例数据自带,作为先验的已知 motif 文件
# conda 安装 homer
conda create -y -c bioconda -n homer homer
# 激活环境
source activate homer
# 下载 mm9 的参考基因组
perl /home/rzli/miniconda3/envs/homer/share/homer/configureHomer.pl -install mm9
# 寻找 motif,其中 all_motif_rmdup 为示例数据自带,作为先验的已知 motif 文件
findMotifsGenome.pl region.txt mm9 ./. -size given -find ~/PECA-master/Data/all_motif_rmdup -preparsedDir ./Homer/ -p nproc > MotifTarget.bed
# 整理文件
cat MotifTarget.bed|awk 'NR>1'|cut -f 1,4,6 > MotifTarget.txt
其中 MotifTarget.txt 如下
chr19_4839098_4839717 HNF6(Homeobox)/Liver-Hnf6-ChIP-Seq(ERP000394)/Homer 9.376597 chr19_4711683_4712307 HNF6(Homeobox)/Liver-Hnf6-ChIP-Seq(ERP000394)/Homer 4.741806 chr19_4604255_4604660 HNF6(Homeobox)/Liver-Hnf6-ChIP-Seq(ERP000394)/Homer 4.593759 chr19_3895167_3895648 HNF6(Homeobox)/Liver-Hnf6-ChIP-Seq(ERP000394)/Homer 8.026843 chr19_3575421_3576392 HNF6(Homeobox)/Liver-Hnf6-ChIP-Seq(ERP000394)/Homer 8.384482 chr19_3451329_3451560 HNF6(Homeobox)/Liver-Hnf6-ChIP-Seq(ERP000394)/Homer 7.330646 chr19_4855043_4855691 p63(p53)/Keratinocyte-p63-ChIP-Seq(GSE17611)/Homer 10.213847 chr19_4855043_4855691 p63(p53)/Keratinocyte-p63-ChIP-Seq(GSE17611)/Homer 10.568649 chr19_3906982_3907189 p63(p53)/Keratinocyte-p63-ChIP-Seq(GSE17611)/Homer 7.931396 chr19_3906982_3907189 p63(p53)/Keratinocyte-p63-ChIP-Seq(GSE17611)/Homer 8.082046 chr19_3719049_3719844 p63(p53)/Keratinocyte-p63-ChIP-Seq(GSE17611)/Homer 7.308626 chr19_3719049_3719844 p63(p53)/Keratinocyte-p63-ChIP-Seq(GSE17611)/Homer 7.013301 chr19_3422478_3422876 p63(p53)/Keratinocyte-p63-ChIP-Seq(GSE17611)/Homer 7.178829 chr19_3422478_3422876 p63(p53)/Keratinocyte-p63-ChIP-Seq(GSE17611)/Homer 7.625964 chr19_3282618_3283448 p63(p53)/Keratinocyte-p63-ChIP-Seq(GSE17611)/Homer 7.190954
代表motif 的位置以及相应分数
3. 计算 openness
# 对 region.txt 文件提取前三行并排序 , region.txt 表示 peaks 的位置,记作 region.bed
cat region.txt|cut -f 1-3|sort -k1,1 -k2,2n > region.bed
# 设立 background.bed , region.txt peak 文件的 start 和 end 分别向前后拓展 500000 bp
cat region.bed|awk 'BEGIN{OFS="\t"}{print $1,$2-500000,$3+500000}'| awk '{$2=$2<0?1:$2}1'|tr ' ' '\t'>background.bed
cat region.bed >a1
# 计算 region.bed 文件区间深度
samtools bedcov region.bed ~/PECA-master/Input/RAd4.bam > read.bed
# 计算 genome_100k_mm9.bed 文件区间深度( genome_100k_mm9.bed 为随机背景bed,可为什么不直接用 background.bed )
samtools bedcov ../PECA-master/Data/genome_100k_mm9.bed ~/PECA-master/Input/RAd4.bam > back_read
# bedtools 取交集
bedtools intersect -a background.bed -b back_read -wa -wb -sorted > background
其中 back_read 为:
chr1 0 100000 0 chr1 100000 200000 0 chr1 200000 300000 0 chr1 300000 400000 0 chr1 400000 500000 0 chr1 500000 600000 0 chr1 600000 700000 0 chr1 700000 800000 0 chr1 800000 900000 0 chr1 900000 1000000 0 chr1 1000000 1100000 0 chr1 1100000 1200000 0
back_read 的特点是按照每 100000 个碱基为一个区间进行深度的统计
background 为:
chr19 2524082 3524282 chr19 2500000 2600000 0 chr19 2524082 3524282 chr19 2600000 2700000 0 chr19 2524082 3524282 chr19 2700000 2800000 0 chr19 2524082 3524282 chr19 2800000 2900000 0 chr19 2524082 3524282 chr19 2900000 3000000 0 chr19 2524082 3524282 chr19 3000000 3100000 5370 chr19 2524082 3524282 chr19 3100000 3200000 46912 chr19 2524082 3524282 chr19 3200000 3300000 111392 chr19 2524082 3524282 chr19 3300000 3400000 188552 chr19 2524082 3524282 chr19 3400000 3500000 137901 chr19 2524082 3524282 chr19 3500000 3600000 187800
当 background.bed 的区间落在 back_read 区间内,则输出到 background 中
# 整理 background 文件,计算区间内的总 reads 数
awk 'BEGIN{OFS="\t"}{print $1,$2,$3,$7,$6-$5}' background|sed 's/\t/\_/1'|sed 's/\t/\_/1'|awk '{a[$1]+=$2;b[$1]+=$3}END{for(i in a){print i,a[i],b[i];}}'|tr ' ' '\t'|tr '_' '\t'|sort -k1,1 -k2,2n > background_fc
# 对 read.bed 文件去除背景的干扰, 并标准化
paste -d '\t' read.bed background_fc|awk 'BEGIN{OFS="\t"}{print $1,$2,$3,$4*$9/(($3-$2)*($8+5))}'|sed 's/\t/\_/1'|sed 's/\t/\_/1' > openness.bed
# 制作 openness.bed 的 bed 文件 openness1.bed
cat openness.bed |tr '_' '\t' > openness1.bed
其中 background_fc 为:
chr19 2524082 3524282 677927 1100000 chr19 2533281 3533481 677927 1100000 chr19 2569706 3569906 677927 1100000 chr19 2600747 3600947 845800 1100000 chr19 2704539 3704739 1056533 1100000 chr19 2782618 3783448 1056533 1100000 chr19 2792091 3792316 1056533 1100000 chr19 2823139 3823551 1263554 1100000 chr19 2825290 3825683 1263554 1100000 chr19 2857700 3857978 1263554 1100000 chr19 2888600 3889490 1263554 1100000 chr19 2922478 3922876 1507007 1100000
那么
chr19 2524082 3524282 677927 1100000
的第三列 677927 是怎么来的? 我们在 background 文件中选择chr19 2524082 3524282
相应的部分:chr19 2524082 3524282 chr19 2500000 2600000 0 chr19 2524082 3524282 chr19 2600000 2700000 0 chr19 2524082 3524282 chr19 2700000 2800000 0 chr19 2524082 3524282 chr19 2800000 2900000 0 chr19 2524082 3524282 chr19 2900000 3000000 0 chr19 2524082 3524282 chr19 3000000 3100000 5370 chr19 2524082 3524282 chr19 3100000 3200000 46912 chr19 2524082 3524282 chr19 3200000 3300000 111392 chr19 2524082 3524282 chr19 3300000 3400000 188552 chr19 2524082 3524282 chr19 3400000 3500000 137901 chr19 2524082 3524282 chr19 3500000 3600000 187800
将这个区间的reads数目加起来就可得到 677927
openness.bed 文件的部分展示:
chr19_3024082_3024282 0.868081 chr19_3033281_3033481 0.600355 chr19_3069706_3069906 0.600355 chr19_3100747_3100947 3.10828 chr19_3204539_3204739 5.47117
openness1.bed 文件的部分展示:
chr19 3024082 3024282 0.868081 chr19 3033281 3033481 0.600355 chr19 3069706 3069906 0.600355 chr19 3100747 3100947 3.10828 chr19 3204539 3204739 5.47117 chr19 3282618 3283448 13.6113
4. 计算 openness 与基因表达量的相关性
注:这一模块罗列重要代码
# 构建启动子与基因区的bed文件,定义上下游200kb,gene.bed 可以从相应物种 GTF 文件获取
cat ./gene.bed| awk 'BEGIN{OFS="\t"}{print $1,$2-200000,$3+200000,$4}'| awk '{$2=$2<0?1:$2}1'|tr ' ' '\t' > promoter_200k.bed
# promoter_200k.bed 与 chip-seq 的 peaks 文件取交集
bedtools intersect -a region.txt -b promoter_200k.bed -wa -wb|cut -f 4,8 > peak_gene.txt
# 计算相离的距离
bedtools intersect -a region.txt -b promoter_200k.bed -wa -wb|awk '{print $3-$7+100000}'|awk '{$1=$1<0?-$1:$1}1' > dis
注:gene.bed 可以从相应物种 GTF 文件获取
peak_gene.txt:
chr19_3100747_3100947 Ighmbp2 chr19_3100747_3100947 Mrpl21 chr19_3204539_3204739 Cpt1a chr19_3204539_3204739 Ighmbp2 chr19_3204539_3204739 Mrpl21 chr19_3282618_3283448 Gal chr19_3282618_3283448 Cpt1a chr19_3282618_3283448 Ighmbp2
前一列代表 peak 在基因启动子区域的位置,例如基因 Ighmbp2 启动子区域中出现的 peak 位于 chr19 3100747 3100947
接下来计算相关性的方法是用 matlab 写的,输出为'TFName','List','R2','Exp_median','TFExp_median'
# 获得 mm9 中已知 TF 编码基因名
TFName=TFName(d==1);
# 标准化
Exp=log2(1+quantilenorm(Exp));
Opn=log2(1+quantilenorm(Opn));
# 获得基因名 Symbol
List=Symbol;
# TFExp 为 mm9 中已知 TF 编码基因的表达量
TFExp=Exp(f(d==1),:);
# Exp 为 mm9 中所有基因的表达量
R2=corr(TFExp',Exp');
# 求表达量的中位数
Exp_median=median(Exp')';
TFExp_median=median(TFExp')';
R2 从某种程度上反映了 RE 是否被激活
5. 计算调控网络
[1]. 计算 CR binding to REs 的概率:
这一部分是用 matlab 计算的,因此罗列关键代码
# 定义 eita0 ,eita1
eita0=-30.4395;
eita1=0.8759;
# 计算结合概率 CRB_P
TFBO=(repmat(C_TFExp,1,length(Opn)).*repmat(C_TFExp./TFS,1,length(Opn)).*TF_binding(d1==1,:).*repmat(Opn',length(C_TFName),1)).^0.25;
CRB=eita0+eita1*CR_TF*TFBO;
CRB_P=1-exp(CRB')./(1+exp(CRB'));
疑问:为什么作者自定义 eita0 ,eita1
其中:
repmat(C_TFExp,1,length(Opn)).
代表已知TF编码基因的表达量repmat(C_TFExp./TFS,1,length(Opn)).
代表 TFSk,TF expression specificity scoreTF_binding(d1==1,:).
代表 Bi,k,这里作者做了一个定义,定义TF_binding
表格的列为:TFName,Element_name,motifName,motifWeight,Match2
,并不完全是定义的 p_valrepmat(Opn',length(C_TFName),1))
代表 Oi 表示的是 peak_gene.txt中,某基因启动子区的开放分数
但是 Zi :第 i 个RE是否被激活;βl,0和βl,i的定义在代码中不是很清晰,这里需要自己改写一下
思考
-
首先,由于CRs 可以调控 REs 的开放程度,REs是否招募CRs可以依据 REs 的开放程度和 已知 CRs 表达量之间的相关性进行定义,相关性高度更倾向于被招募,以此来对 Ci 的状态分类 0(未招募)和 1 (招募)
-
Zi :第 i 个RE是否被激活可以定义 Zi 与 Oi ,Ci,j,CRi之间的函数关系,依据自然的排序对 Zi 的状态进行划分 0(未激活)和 1 (激活);最后训练 Zi 与 Oi ,Ci,j,CRi 逻辑回归的参数,求解状态概率
甚至,Ci,j ,Zi 的值分别可以用状态概率进行表示 P(Ci,j = 1 | TF,Oi) 和 P(Zi,j = 1 | CR,Oi, Ci) 表示 -
最后利用回归的方法求解 βl,0 和 βl,i 作为效应值,表征 CRi ,REs 的开放程度,TFi 对基因表达的影响
Github地址:https://github.com/SUwonglab/PECA
网友评论