前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >药物预测之相关性为什么不行

药物预测之相关性为什么不行

作者头像
生信技能树
发布2021-10-12 12:16:08
1.3K0
发布2021-10-12 12:16:08
举报
文章被收录于专栏:生信技能树

有了前面的教程:药物预测之认识表达量矩阵和药物IC50 的背景知识铺垫,认识了Cancer Therapeutics Response Portal (CTRP) 和 Genomics of Drug Sensitivity in Cancer (GDSC) 两个数据库资源。也介绍了2021年7月新鲜出炉的 药物预测R包之oncoPredict的用法以及一个超级老旧的R包的用法,见:药物预测R包之pRRophetic

现在可以尝试一下理解药物预测的原理啦,首先我们看看仅仅是相关性,能不能搞定药物预测!

首先认识需要预测的表达量矩阵

我们还是使用Bortezomib的表达量矩阵,来预测里面的全部样品对Bortezomib这个药物的反应情况!Bortezomib 是第一种蛋白酶体抑制剂,具有抗癌活性。在 pRRophetic 包里面有 bortezomibData数据集,主要是一个表达量矩阵,264个样品,以及这264个样品的结局 (药物处理后)。

代码语言:javascript
复制
library(pRRophetic)
data(bortezomibData)
dim(exprDataBortezomib)
exprDataBortezomib[1:4,1:4]
boxplot(exprDataBortezomib[1:4,])
# 264个样品的表达量矩阵
table(studyResponse)
# 264个病人的结局 (药物处理后)
PGx_Responder = IE PGx_Responder = NR  PGx_Responder = R 
                25                126                113

具体是什么癌症什么病人就需要看该文章以及该数据集的来源文献啦,但是药物处理结局事件是很明显的,主要是区分R和NR,应该是有无响应的简单情况。

然后提取Bortezomib这个药物的数据资源

有了上面的已知信息,现在我们来看看Genomics of Drug Sensitivity in Cancer (GDSC) 这个数据库资源。

代码语言:javascript
复制
rm(list = ls())
library(pRRophetic)   
# exprMatCcle (ccleData)       
data(cgp2016ExprRma) 
dim(cgp2016ExprRma) 
data(PANCANCER_IC_Tue_Aug_9_15_28_57_2016)
length(unique(drugData2016$Drug.name))
unique(drugData2016$Drug.name) 

如下所示的表达量矩阵和药物信息 :

代码语言:javascript
复制
> cgp2016ExprRma[1:4,1:4]
         CAL-120   DMS-114   CAL-51    H2869
TSPAN6  7.632023  7.548671 8.712338 7.797142
TNMD    2.964585  2.777716 2.643508 2.817923
DPM1   10.379553 11.807341 9.880733 9.883471
SCYL3   3.614794  4.066887 3.956230 4.063701
> drugData2016[1:4,1:4]
  Drug.name Drug.Id Cell.line.name Cosmic.sample.Id
1 Erlotinib       1         MC-CAR           683665
2 Erlotinib       1            ES3           684055
3 Erlotinib       1            ES5           684057
4 Erlotinib       1            ES7           684059

现在我们提前Bortezomib这个药物的反应情况:

代码语言:javascript
复制
Bort_drugs=drugData2016[drugData2016$Drug.name=='Bortezomib',]
dim(Bort_drugs)
kp =  Bort_drugs$Cell.line.name %in% colnames(cgp2016ExprRma) 
table(kp)
Bort_drugs=Bort_drugs[kp,]
pos=match( Bort_drugs$Cell.line.name ,colnames(cgp2016ExprRma)  )
Bort_ExprRma=cgp2016ExprRma[,pos]

可以看到 Genomics of Drug Sensitivity in Cancer (GDSC) 这个数据库里面虽然是有1018个细胞系,但是有Bortezomib药物处理信息的只有389个,有意思的是有38个细胞系有Bortezomib药物处理信息但是没有表达量矩阵。

合并两个表达量矩阵

两个表达量矩阵各自的技术都不一样,所以肯定是存在批次效应的,

代码语言:javascript
复制
ids=intersect(rownames(Bort_ExprRma),rownames(exprDataBortezomib))
m=cor(cbind(exprDataBortezomib[ids,],
          Bort_ExprRma[ids,]))
library(pheatmap)
pheatmap(m)
ac=data.frame(batch=c(
  rep('test',ncol(exprDataBortezomib)),
  rep('GDSC',ncol(Bort_ExprRma))
))
rownames(ac)=colnames(m)
pheatmap(m,show_rownames = F,show_colnames = F,
         annotation_col = ac)

两个表达量矩阵的基因交集居然只有一万多个 :

代码语言:javascript
复制
> dim(exprDataBortezomib)
[1] 22283   264
> dim(Bort_ExprRma)
[1] 17419   389
> length(ids)
[1] 11437

各自的表达量矩阵的相关性如下所示:

批次效应

可以看到,妥妥的批次效应,不过,我们仍然是可以尝试给每个细胞系一个相关性最高选项。

代码语言:javascript
复制
ch_m=m[1:ncol(exprDataBortezomib),
       (ncol(exprDataBortezomib)+1):ncol(m)]
pheatmap(ch_m,show_rownames = F,show_colnames = F)
ch_m[1:4,1:4]
colnames(Bort_drugs)
pred_drug = Bort_drugs[apply(ch_m, 1, which.max), "IC50"]
boxplot(pred_drug~studyResponse)

可以看到,基本上没有如何差异,明明是不同样品对Bortezomib药物处理应该是有R和NR的差异!

而且我把这样的简单的相关性预测结果,跟之前的R包预测结果(见:药物预测R包之pRRophetic )对比发现,也没有一致性。

既然有批次效应,去除后会不会好一点呢?

最简单的当然是sva去除啦!

代码语言:javascript
复制
    combat_edata1 = ComBat(dat=as.matrix(m), 
                            batch=c(
                             rep('test',ncol(exp_test)),
                             rep('GDSC',ncol(exp_db))
                           ), mod=NULL, 
                           par.prior=T, prior.plots=F)
    combat_edata1[1:4,1:4]

有意思的是,sva确实是把两个表达量矩阵的差异效应给去除了,而且预测的药物效果稍微合理了一点,至少在R组(药物敏感)里面的IC50值显著的低,如下所示:

它虽然是跟 之前的R包预测结果(见:药物预测R包之pRRophetic )相关性并不是非常高,但是起码是有统计学显著的正相关,而且也不能说之前的R包预测结果(见:药物预测R包之pRRophetic )就是金标准!

也仅仅是,我们简简单单的把需要预测的表达量矩阵, 去跟数据库里面有药物作用信息的表达量矩阵,进行一个相关性计算(前提是去除了批次效应),然后给需要预测的样品每个都找到了一个最相关的数据库里面的样品,直接把药物作用值赋值给预测样品。居然都可以勉勉强强得到还算是合理的结果啊!

相关性预测药物效果的逻辑链

给需要预测的样品去数据库资源里面找到一个跟它表达量相关性最高的样品,直接把该样品的药物作用值赋值给预测样品,是勉勉强强得到还算是合理的结果。这个推理的逻辑基础就是,药物作用跟表达量是线性相关的。

一个很简单的例子就是,根据颜值来预测收入,我们有一个数据库记录了2万人的颜值和这2万人的收入,发现确实是线性相关,颜值越高收入越高,这里面的相关系数目前不知道,我们也不想去分析。这个时候有一个全新的团队里面的人的收入是未知的,但是颜值是可以判断的,我们对每个人都判断颜值,然后去2万人里面找到最匹配它的颜值,就把匹配到的人收入直接辅助给它作为预测值。

听起来似乎是很合理,但是它的假设前提就是2万人的颜值和这2万人的收入确实是线性相关,比如颜值越高收入越高。但是实际情况是部分颜值低到可怜的人居然收入反转了比如马云,也就是说这个相关性有可能是一个一元二次方程,如果你还记得一点点以前学过的数学,就可以想象得到同样的超高收入会对应两个极端的颜值(马云和李彦宏)。这个时候如果仅仅是看颜值相似性你就没办法判断它的收入了,非常的麻烦。

那,我们来探索一下, Genomics of Drug Sensitivity in Cancer (GDSC) 这个数据库资源里面的各个样品的表达量信息是否跟各个药物处理的IC50值有相关性!代码如下:

代码语言:javascript
复制
d=as.matrix(dist(cor(Bort_ExprRma[,order(Bort_drugs$IC50)])))
df=data.frame(dist=d[1,],
              ic50=sort(Bort_drugs$IC50))
library(ggpubr)
ggscatter(df, x = "dist", y = "ic50",
          color = "black", shape = 21, size = 3, # Points color, shape and size
          add = "reg.line",  # Add regressin line
          add.params = list(color = "blue", fill = "lightgray"), # Customize reg. line
          conf.int = TRUE, # Add confidence interval
          cor.coef = TRUE, # Add correlation coefficient. see ?stat_cor
          cor.coeff.args = list(method = "pearson",  label.sep = "\n")
)

略微有点尴尬,基本上没有相关性:

基本上没有相关性

头疼啊, 如果颜值跟收入并没有很明显的相关性,那么我们为什么要看一个人的颜值来判断它的收入呢?

做一个学徒作业吧,这个 drugData2016 有两百多药物,每个都做这样的类似的相关性分析,看看是不是有部分药物它确实跟表达量的相关性的距离是有关系的!

值得一提的是:前面的dist函数有euclidean","maximum","manhattan","canberra","binary"or"minkowski" 这么多参数可以选择,为了教程的简洁,我们这里就没有继续扩展讲解。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-10-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 生信技能树 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 首先认识需要预测的表达量矩阵
  • 然后提取Bortezomib这个药物的数据资源
  • 合并两个表达量矩阵
  • 既然有批次效应,去除后会不会好一点呢?
  • 相关性预测药物效果的逻辑链
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档