结构分析(4)化合物分子相似性

2021-01-29 10:20:34 浏览数 (1)

分子相似性:

相似性原理(similar property principle)指出,总体相似的分子应具有相似的生物活性。

相似性评估

化合物的指纹对于使用计算机考虑化合物的相似性是必需的。已经提出了各种评估方法,但是最常用的评估方法称为“ Tanimoto系数 ”。使用以下等式从两个分子A和B的位阵列指纹计算Tanimoto系数:

代码语言:javascript复制
#===========================================================================


#===========================================================================

rm(list=ls())
library(tibble)
library(tidyr)
set.seed(1234)
options(stringsAsFactors = F)
library(dplyr)
library(rcdk)
setwd('D:\SCIwork\F29\lianxishuju')
library(data.table)
library(plyr)
library(Hmisc)#加载包



#读取数据
data <- read.csv('train.csv', header = T)
SMILES <- data$SMILES

head(data)
# SMILES
# 1 [H][C@]12CCCN1CC1=C(C2)C2=C(C=C(OC)C(OC)=C2)C2=C1C=CC(OC)=C2
# 2         COC1=CC2=C(C=C1)C1=C(CC3CCCN3C1)C1=C2C=C(OC)C(OC)=C1
# 3         COC1=CC2=C(C=C1)C1=C(CN3CCCC3C1)C1=C2C=C(OC)C(OC)=C1
# 4       COC1=CC2=C(C=C1OC)C1=C(C=C(OC)C(OC)=C1)C1=C2CC2CCCN2C1
# 5          COC1=CC2=C(C=C1OC)C1=C(C=C(OC)C(OC)=C1)C(=C2)C(O)=O
# 6  COC1=CC2=C(C=C1OC)C1=C(C=C(OC)C(OC)=C1)C(=C2)C(=O)C1=CC=CN1


#计算分子指纹
mols1 <- parse.smiles(SMILES)
fps <- lapply(mols1, get.fingerprint, type='extended')
fp.sim <- fingerprint::fp.sim.matrix(fps, method='tanimoto')




#计算Tanimoto系数
sim_matrix <- as.data.frame(fp.sim)
names(sim_matrix) <- paste0('mol', 1:195)
rownames(sim_matrix) <- paste0('mol', 1:195)



#矩阵整理
flattenCorrMatrix <- function(cormat) {
  ut <- upper.tri(cormat) 
  
  df <-  data.frame( row = rownames(cormat)[row(cormat)[ut]],
                     column = rownames(cormat)[col(cormat)[ut]],
                     cor =(cormat)[ut])
  
  df}



#得到相似度高的分子
sim_dt <- flattenCorrMatrix(sim_matrix)
sim_dt <- subset(sim_dt, sim_dt$cor > 0.7)



# 
# #计算1-Tanimoto系数
# fp.dist <- 1 - fp.sim
# fp.dist <- as.data.frame(fp.dist)
# 
# 
# #计算Tanimoto系数
# dis_matrix <- as.data.frame(fp.dist)
# names(dis_matrix) <- paste0('mol', 1:195)
# rownames(dis_matrix) <- paste0('mol', 1:195)
# 
# 
# #得到相似度低的分子
# dis_dt <- flattenCorrMatrix(dis_matrix)
# dis_dt <- subset(dis_dt, dis_dt$cor > 0.9)
# 

0 人点赞