driver mutation 识别方法(部分简介)

Driver mutation 识别方法(部分)简介

背景


众所周知,癌症的发生主要是由于突变的累计引起的,但是癌症细胞中有着成千上万的突变,并不是所有突变都对肿瘤的演化具有促进作用。我们把对癌症发展具有正向作用的突变定义为“driver mutation",其他突变定义为”passage mutation"。因此从大量的mutations中鉴别driver mutation对于癌症的治疗是十分重要的。

See the source image

目前识别driver mutation 的方法大致可以分为两类:1.基于突变频率 2. 基于功能影响评分

基于突变频率的方法最适合于寻找频繁发生的driver事件,而应用于罕见的driver事件时性能较差。 相比之下,基于功能影响的方法无法找到人们对基因组元素了解不足或注释不明确的驱动因素。

方法


今天主要介绍两种方法,Driverpower和ActiveDriverWGS。

1.Driverpower

image-20210105145708847
第一步首先是筛选排除的区域
image-20210105150836798
第二步是使用GBM建模,或者使用随机套索+GLM

1.GBM: 使用的XGBoost算法

先来举个例子,我们要预测一家人对电子游戏的喜好程度,考虑到年轻和年老相比,年轻更可能喜欢电子游戏,以及男性和女性相比,男性更喜欢电子游戏,故先根据年龄大小区分小孩和大人,然后再通过性别区分开是男是女,逐一给各人在电子游戏喜好程度上打分,如下图所示。

img

训练出了2棵树tree1和tree2,类似之前gbdt的原理,两棵树的结论累加起来便是最终的结论,所以小孩的预测分数就是两棵树中小孩所落到的结点的分数相加:2 + 0.9 = 2.9。爷爷的预测分数同理:-1 + (-0.9)= -1.9。具体如下图所示:

img

XGBoost的核心算法思想基本就是:

  1. 不断地添加树,不断地进行特征分裂来生长一棵树,每次添加一个树,其实是学习一个新函数f(x),去拟合上次预测的残差。
  2. 当我们训练完成得到k棵树,我们要预测一个样本的分数,其实就是根据这个样本的特征,在每棵树中会落到对应的一个叶子节点,每个叶子节点就对应一个分数
  3. 最后只需要将每棵树对应的分数加起来就是该样本的预测值。

以负泊松对数似然为目标函数,以元素的ln(N*L)作为偏移量

N是样本数量,L是元件长度

2.随机套索+GLM

使用随机套索进行特征选择
w_k=arg \min\limits_{w} \rVert logit \left( \frac {y+1/2}{N \cdot L} \right) - Xw \rVert_2^2 + \alpha \sum_{i=1}^{1373} \frac{\arrowvert w_i\arrowvert}{b_i}
X是特征矩阵,w是权重矢量,α是正则化参数,bi是比例因子。

用GLM预测BMR
y \sim B (n,p) \ with \ n = N \cdot L \ and p = \frac {\widehat{y}}{N \cdot L}

y是观察到的突变计数,y是估计的突变计数。 我们使用二项式GLM通过logit链接函数获得y ^,即
\frac {\widehat{y}}{N \cdot L}=E\left( \frac {y}{N \cdot L}| X^{select} \right)= logit^{-1}\left( X^{select}\beta\right)
其中Xselect是所选特征矩阵,β是回归系数向量。

第三步,使用观测的突变数量与预测的突变数量进行负荷测试,并执行多次测试矫正
第四步,根据功能影响得分对近显著的element(q<0.25)调整观察到的突变计数

For CDS, CADD (SNVs and indels, v1.3), DANN (SNVs) and EIGEN (SNVs) scores were used. CADD indel scores were generated with the CADD web interface for all observed indels in the PCAWG data set. For splice site, CADD and DANN scores were used. For non-coding elements, the CADD, DANN and LINSIGHT (SNVs and indels) score were used.

首先,检索数据集中所有观察到的突变的原始分数。 其次,所有原始分数都通过 **-10log_{10}(rank/N_m) **转换为phred-like分数,其中Nm是观察到的具有分数的突变数。 第三,对于每个基因组元素,其功能评分S计算为:
S=\frac {1}{N}\sum\limits_{i=1}^{n}\ s_i

Si是第i个样本的平均功能影响评分。

最后一步是通过功能调整的突变计数,然后进行多次测试校正,重新评估近乎重要元素的重要性

Driverpower的安装和运行


安装

# [Optional] Create a new environment for DriverPower
conda create --name driverpower
# [Optional] Activate the environment
conda activate driverpower
# Setup Bioconda Channels if not set before
# https://bioconda.github.io/user/install.html#set-up-channels
conda config --add channels defaults
conda config --add channels bioconda
conda config --add channels conda-forge
# Install DriverPower
conda install -c smshuai driverpower

数据准备

# 合并特征数据
cat train_feature.hdf5.part1 train_feature.hdf5.part2 train_feature.hdf5.part3 > train_feature.hdf5 
md5sum train_feature.hdf5  # should be cb4af6bc7979efa087955f94909dd065
#下载python脚本
wget https://raw.githubusercontent.com/smshuai/DriverPower/master/script/prepare.py

callable.bed.gz ,DriverPower中使用的列入白名单的基因组区域; 可以用染色体长度文件(BED格式)替换以使用整个基因组。大约占全基因的96.41%

对于从ICGC下载的突变数据进行预处理

library(stringr)
a<-read.table("simple_somatic_mutation25.open.tsv.gz",sep="\t",header=T) ##读入数据
b<-a[,c(9,10,11,15,17,2)] ##提取需要的数据
c<-str_c("chr",b[,1],sep="")
b[,1]<-c
c<-unique(b)
write.table(c,file="~/mutation/CRC/clean-mutation25.tsv",sep="\t",quote=F,col.names=F,row.names=F)
image-20201130164409260

对于突变进行功能打分

zcat ./random_mutations.tsv.gz | \
awk 'BEGIN{OFS="\t"} $4 != "-" && $5 != "-" {print $1,$3,".",$4,$5}' | \
head -1000 | gzip > random_mutations.1K.vcf.gz

把突变文件上传到CADD网站

image-20210106201624066

运行

python ~/driverpower/prepare.py noncoding-mutation.tsv.gz ~/driverpower/train_elements.tsv.gz ~/driverpower/callable.bed.gz train_y.tsv  ##训练集
bedtools bed12tobed6 -i ~/driverpower/test_elements.bed12.gz | cut -f1-4 > test_elements.tsv    ###获得测试元件
python ~/driverpower/prepare.py noncoding-mutation.tsv.gz test_elements.tsv ~/driverpower/callable.bed.gz test_y.tsv  ##把测试元件和白名单元件取交集,并统计突变数目
image-20210107150651575
mkdir output
###建立背景
driverpower model \
    --feature ~/driverpower/train_feature.hdf5 \
    --response train_y.tsv \
    --method GBM \
    --gbmParam xgb_param.pkl\
    --name tutorial \
    --modelDir ./output
####计算功能分数    
zcat ./GRCh37-25.tsv.gz | tail -n +3 | awk 'BEGIN {OFS="\t"} {print "chr"$1, $2-1, $2, $6}' | bedtools intersect -a ./test_elements.tsv -b stdin -wa -wb > CADD_ele.tsv
# The 4th column is the element ID and the 8th column is the CADD PHRED score
printf "binID\tCADD\n" > CADD_per_ele_score.tsv
bedtools groupby -i ./CADD_ele.tsv -g 4 -c 8 -o mean  >> CADD_per_ele_score.tsv

####识别候选driver
driverpower infer \
    --feature ~/driverpower/test_feature.hdf5 \
    --response test_y.tsv \
    --model ./output/tutorial.GBM.model.pkl \
    --name 'DriverPower_burden_function' \
    --outDir ./output/ \
    --funcScore CADD_per_ele_score.tsv \
    --funcScoreCut "CADD:0.01"
image

一般认为q<0.1的为显著,q<0.25的为近显著

--gbmParam xgb_param.pkl

import pickle

# Default parameter for XGBoost used in DriverPower
param = {'max_depth': 8,
         'eta': 0.05,  # learning rate
         'subsample': 0.6,
         'nthread': 15,  # number of threads; recommend using the number of available CPUs
         'objective': 'count:poisson',
         'max_delta_step': 1.2,
         'eval_metric': 'poisson-nloglik',
         'silent': 1,
         'verbose_eval': 100,  # print evaluation every 100 rounds
         'early_stopping_rounds': 5,
         'num_boost_round': 5000  # max number of rounds; usually stop within 1500 rounds
        }

# Dump to pickle
with open('xgb_param.pkl', 'wb') as f:
    pickle.dump(param, f)
~/miniconda3/envs/test/bin/python pickle.py

这是一个通过合并突变负荷和功能影响信息来准确识别驱动和乘客突变的新框架。该方法利用了WGS技术产生的大型体细胞突变集,借助一千多个基因组特征构建了准确的全局BMR模型,与使用选定区域或侧翼区域构建本地BMR模型的方法形成对比。其优点之一是该方法不偏向于编码区,而是在编码和非编码区都使用相同的模型挖掘癌症driver。该方法的另一个优点是高度模块化。DriverPower可以与其他类型的基因组元素(编码的或非编码的)、用于建模BMR的其他回归算法以及其他功能影响评分方案一起使用。此外,尽管DriverPower是为WGS项目设计的,但它在WES策略中也表现出色。

2.ActiveDriverWGS

ActiveDriverWGS是基于Poisson广义线性回归的局部突变富集模型,该模型通过观察元素周围至少100 kbps的背景窗口中的突变来确定基因组元素中预期的突变数,包括区域上游和下游的±50 kbps 。

index
library(ActiveDriverWGS)
data("cll_mutations")
data("cancer_genes")
data("cancer_gene_sites")

some_genes = c("ATM", "MYD88", "NOTCH1")

results = ActiveDriverWGS(mutations = cll_mutations,
                          elements = cancer_genes[cancer_genes$id %in% some_genes,],
                          sites = cancer_gene_sites)

[图片上传失败...(image-3e5a3b-1610104748845)]

 library(GenomicRanges)
 library(ActiveDriverWGS)
  library(parallel)
 cll_mutations<-read.table("/public/slst/home/ningwei/mutation/CLL/WGS-mutation.tsv.gz",sep="\t")
 cancer_genes<-read.table("/public/slst/home/ningwei/mutation/CLL/new-element2.tsv")
 ##a<-read.table("~/data/a-b-comparment/test_elements-CLL.ts

 colnames(cll_mutations)<-c("chr","pos1","pos2","ref","alt","patient")
 colnames(cancer_genes)<-c("chr","start","end","id")

 ################获得元件
 gr_element_coords = GRanges(seqnames = cancer_genes$chr,
                             IRanges(start = cancer_genes$start,
                                     end = cancer_genes$end),
                             mcols = cancer_genes$id)
 ##############设置感兴趣位点
 gr_site_coords = GRanges()

 this_genome = BSgenome.Hsapiens.UCSC.hg19::Hsapiens

 ##############删除超突变(每mb的突变数目大于30)
 cll_mutations = format_muts(cll_mutations, this_genome,
                             filter_hyper_MB = 30)

      3 remove hypermut, n= 1927030 ,  89 %
      hypermuted samples:  DO229346 DO229353 DO230659

       reversing 0 positions
##########################
gr_maf = GRanges(cll_mutations$chr,
                 IRanges(start = cll_mutations$pos1,
                         end = cll_mutations$pos2),
                 mcols = cll_mutations[,c("patient", "tag")])
##################
 id<-a[i]
result = ADWGS_test(id = id,
                      gr_element_coords = gr_element_coords,
                      gr_site_coords = gr_site_coords,
                      gr_maf = gr_maf,
                      win_size = 50000, this_genome = this_genome)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,907评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,987评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,298评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,586评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,633评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,488评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,275评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,176评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,619评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,819评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,932评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,655评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,265评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,871评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,994评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,095评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,884评论 2 354

推荐阅读更多精彩内容