从数学建模的角度看基因调控

阅读文献《Modeling gene regulation from paired expression and chromatin accessibility data》,以建模的角度看待基因调控的关系

构建模型加以理解

其中

  1. TGl 代表第 l 个受调控的基因的表达量
  2. CR1,...,4 代表chromatin regulators的表达量,chromatin regulators可以理解为调控染色质开放程度的regulators
  3. TF1,...,4 代表转录因子的表达量
  4. Ol1,...,4 代表对应 Element 的开放程度的,这里的 Element 称为 REs(regulatory element)
  5. α,β 代表系数
  6. Zi 体现第 i 个RE是否被激活
  7. Ci,j 体现第 j 个CR是否会被第 i 个RE招募
  8. PPI(CRj) 代表已知的,且能与第 j 个CR互作的TF集合
  9. MBi 在第 i 个RE上能match到的motif的集合,motif 为 TF 结合的序列,意味着确定 motif 后可以得知是哪一个 TF
  10. REi 在上图表示的是某 Element ,Element 表示的是,一旦被激活则会对下游基因产生调控
  11. 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招募的状态,

其中:

  1. ηl,0ηl,1 为待估计参数;
  2. TFSk: TF expression specificity score
  3. Si,j :Si,j = PPI( CRj) ∩ MBi;i ∈ Il,j∈{1,2,...,J},l∈{1,2,...,L}。PPI(CRj) 代表已知的,且能与第 j 个CR互作的TF集合,MBi 在第 i 个RE上能match到的motif的集合,motif 为 TF 结合的序列,意味着确定 motif 后可以得知是哪一个 TF。作者在这里取了 PPI(CRj)MBi 的交集,选择了能match到 REi 上的并且是已知的 TF

2. Model of RE activity

同理RE是否被激活也是一个二分类问题,记第 i 个RE的状态为:激活(1),未激活(0);Zi∈{0,1}

其中:

  1. Ci = [Ci,1, Ci,2, ..., Ci,J];i ∈ Il,l∈{1,2,...,L}
  2. α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

其中:

  1. repmat(C_TFExp,1,length(Opn)). 代表已知TF编码基因的表达量
  2. repmat(C_TFExp./TFS,1,length(Opn)). 代表 TFSk,TF expression specificity score
  3. TF_binding(d1==1,:). 代表 Bi,k,这里作者做了一个定义,定义 TF_binding 表格的列为:TFName,Element_name,motifName,motifWeight,Match2,并不完全是定义的 p_val
  4. repmat(Opn',length(C_TFName),1)) 代表 Oi 表示的是 peak_gene.txt中,某基因启动子区的开放分数

但是 Zi :第 i 个RE是否被激活;βl,0和βl,i的定义在代码中不是很清晰,这里需要自己改写一下

思考

  1. 首先,由于CRs 可以调控 REs 的开放程度,REs是否招募CRs可以依据 REs 的开放程度和 已知 CRs 表达量之间的相关性进行定义,相关性高度更倾向于被招募,以此来对 Ci 的状态分类 0(未招募)和 1 (招募)

  2. 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) 表示

  3. 最后利用回归的方法求解 βl,0 和 βl,i 作为效应值,表征 CRi ,REs 的开放程度,TFi 对基因表达的影响

Github地址:https://github.com/SUwonglab/PECA

你可能感兴趣的:(从数学建模的角度看基因调控)