4. 分子描述符计算
在QSAR建模中,分子描述符是把“化学结构”翻译成“数值向量”的桥梁。模型看到的从来不是苯环、羟基或氢键受体,而是一列列数字。因此,描述符计算的质量直接决定了后续特征选择、模型训练和活性预测的可解释性。本节围绕四类最常用的描述符——理化性质、拓扑描述符、分子指纹,以及RDKit与PaDEL两套实操工具展开,目标是让读者能够独立完成一次“从SMILES到描述符矩阵”的完整计算。
一、四类描述符的定位与差异
理化性质描述符直接对应分子的宏观物理化学行为,例如分子量(MolWt)、脂水分配系数(MolLogP)、拓扑极性表面积(TPSA)、氢键供体/受体数(NumHDonors/NumHAcceptors)、可旋转键数(NumRotatableBonds)等。它们数值连续、物理意义明确,是ADMET性质预测和类药性规则(如Lipinski五规则)的基础。
拓扑描述符从分子图的连接关系出发,不依赖三维构象。常见的有Wiener指数、Balaban指数、Kappa形状指数、Chi系列(如Chi0v、Chi1v)以及价连接性指数。它们对分子大小、分支程度和环结构敏感,适合刻画结构骨架差异。
分子指纹则是把结构编码为定长或变长的位串。MACCS Keys为166位,Morgan/ECFP为圆形指纹,通过半径参数控制邻域范围,RDKit指纹为路径型。指纹适合相似性搜索、聚类和基于片段的活性分类,但单独用于回归时解释性较弱。
三类描述符并非互斥。实际建模中常将理化性质与拓扑描述符拼接为连续特征,再与指纹或指纹降维结果组合,形成混合特征矩阵。
二、RDKit实操:从SMILES到描述符
RDKit是Python生态中最常用的化学信息学工具。以下示例以阿司匹林(乙酰水杨酸)的SMILES为例,演示如何计算理化性质与Morgan指纹。示例参数与输出为教学演示,实际数值以运行环境为准。
from rdkit import Chem
from rdkit.Chem import Descriptors, rdMolDescriptors, AllChem
smi = "CC(=O)Oc1ccccc1C(=O)O"
mol = Chem.MolFromSmiles(smi)
# 理化性质
mw = Descriptors.MolWt(mol) # 分子量
logp = Descriptors.MolLogP(mol) # 脂水分配系数
tpsa = rdMolDescriptors.CalcTPSA(mol) # 拓扑极性表面积
hbd = rdMolDescriptors.CalcNumHBD(mol)
hba = rdMolDescriptors.CalcNumHBA(mol)
rotb = rdMolDescriptors.CalcNumRotatableBonds(mol)
# Morgan指纹(半径2,2048位)
fp = AllChem.GetMorganFingerprintAsBitVect(mol, radius=2, nBits=2048)
bits = fp.ToBitString()
print(mw, logp, tpsa, hbd, hba, rotb)
print("指纹非零位数:", fp.GetNumOnBits())
运行后应得到一组连续数值和一条2048位指纹。判断计算是否正常,可检查:分子量是否在合理范围(阿司匹林约180)、TPSA是否为正、指纹非零位数是否远小于2048(稀疏性正常)。若MolFromSmiles返回None,说明SMILES不合法,需先清洗输入。
三、PaDEL实操:批量计算与命令行
当分子数量达到数百至数万时,PaDEL-Descriptor的批量能力更高效。它基于Java,支持SDF或SMILES列表输入,输出CSV格式的描述符矩阵。典型命令如下:
java -jar PaDEL-Descriptor.jar \
-removesalt -standardizenitro -detectaromaticity \
-descriptortypes descriptors.xml \
-dir ./molecules \
-file ./output/descriptors.csv
其中-removesalt去除盐离子,-standardizenitro标准化硝基,-detectaromaticity检测芳香性。输出CSV第一列为分子名,后续每列为一个描述符。PaDEL默认计算约1800个1D/2D描述符,包括理化性质、拓扑指数和指纹类特征。使用时需注意:PaDEL对输入分子的价态和芳香性判断较敏感,建议先用RDKit统一标准化后再送入PaDEL。
四、描述符计算中的常见问题与判断
第一,缺失值与无穷值。部分拓扑描述符在特定结构下可能返回NaN或Inf,需在建模前用numpy.nan_to_num或中位数填充处理。第二,量纲差异。分子量在百量级,而某些指数可能达到数千,标准化(Z-score或Min-Max)是必要步骤。第三,指纹与连续描述符的拼接。指纹位串为0/1,连续描述符为实数,直接拼接会导致尺度失衡,建议先对连续部分标准化,再与指纹合并。第四,可复现性。RDKit与PaDEL版本不同可能产生细微数值差异,应在项目中固定版本并记录参数。
五、实操检查清单
| 检查项 | 判断标准 | 处理方式 |
|---|---|---|
| SMILES解析成功率 | ≥95% | 清洗非法SMILES,记录失败列表 |
| 描述符缺失率 | 单列缺失<5% | 中位数填充或剔除该列 |
| 无穷值 | 0个 | 替换为NaN后统一填充 |
| 常数方差列 | 0列 | 直接删除 |
| 指纹非零位比例 | 5%~30% | 过低可减小nBits,过高可增大半径 |
| 版本记录 | RDKit/PaDEL版本明确 | 写入项目README |
完成本节后,读者应能独立完成一次从SMILES到描述符CSV的完整计算,并对结果做基本质量判断。描述符矩阵是QSAR工程的第一份“数据资产”,它的规范性会直接影响后续特征选择、模型训练与活性预测的可靠性。