RMSD与TM-score对比应用指南 - 第4节
4.1 从RMSD到TM-score:距离度量思维的转变
说实话,我早年被RMSD坑过不少次。两个蛋白质结构整体看起来差不多,RMSD值却大得吓人。后来我才明白——RMSD对局部的“尾巴”或者柔性loop区域太敏感了。一个偏离很远的残基,就能把整个评分拉崩。
TM-score的思路完全不同。它不是为了告诉“你这两个结构差多少埃”,而是回答一个更实际的问题:“这两个结构,整体骨架像不像?”
4.1.1 核心思想:距离越近,得分越高
TM-score本质是一个加权后的平均相似度。它的数学基础其实很简单:
- 每个残基对,按空间距离给一个“相似度分数”
- 距离近的,得分接近1.0
- 距离远的,得分迅速衰减到接近0
- 最后取平均,得到一个0到1之间的值
这个“迅速衰减”是关键。你想想看,如果你有一个残基距离很远,它的得分几乎为零,不会像RMSD那样把整体值拉高。这就是TM-score对“异常尾巴”不敏感的原因。
我的经验:我习惯用TM-score做模型质量评估时,先看整体值是否大于0.5。小于0.5的基本上可以判定“两个结构不相关”,大于0.5才有进一步分析的价值。
4.2 标准TM-score公式拆解
4.2.1 数学表达式
我当年第一次看到这个公式时,也愣了一下。但其实只要拆开看,每个部分都很直观:
TM-score = max( 1/N_ref * Σ_{i=1}^{N_aln} 1/(1 + (d_i / d0)^2) )
这里的每个符号都不复杂:
- N_ref —— 参考结构的残基总数(通常是目标结构/天然结构)
- N_aln —— 两个结构中对位上的残基对数
- d_i —— 第i个对位残基的Cα原子之间的欧氏距离,单位是Å
- d0 —— 归一化因子,用来消除蛋白质大小的差异
注意区分:分母是N_ref,不是N_aln。为什么要用参考结构的残基数?因为你是在“以参考结构为标准”来衡量目标结构模型的质量。如果两个结构长度不同,用N_ref更公平。
4.2.2 为什么是“1/(1+x²)”这个形式?
其实这个公式看着长,它的核心思想很小。我经常跟学生说,你把它当成一个“距离-得分转换器”就行:
| 距离d_i (Å) | d0=5Å时的得分 | 物理含义 |
|---|---|---|
| 0 | 1.0 | 完美对齐 |
| 1 | 0.96 | 几乎完美 |
| 5 | 0.5 | 半信半疑 |
| 10 | 0.2 | 一般般 |
| 20 | 0.058 | 基本无关 |
你看,距离在d0以内时,得分下降很慢;超过d0后,下降速度就快了。这种“软边界”设计,比RMSD那种“硬距离惩罚”要合理得多。
4.3 归一化因子d₀:暗藏玄机
4.3.1 d₀的计算公式
d₀不是乱取的。我记得在早年的论文里,作者的思路是:蛋白质越大,自然状态下残基之间的距离波动范围也越大。所以d₀得跟着蛋白质大小走。
标准的d₀计算方式是:
d0 = 1.24 * ³√(N_ref - 15) - 1.8
这个公式来源于对天然蛋白质结构的统计。它保证了:
- 小蛋白质(~100残基)的d₀ ~ 4.0Å
- 中等蛋白质(~300残基)的d₀ ~ 5.5Å
- 大蛋白质(~500残基)的d₀ ~ 6.5Å
我曾经踩过的坑:有次我用自写代码算TM-score,忽略了d₀依赖N_ref这个细节。结果一个500残基的蛋白质和它的天然结构对比,TM-score只有0.3。后来才发现d₀我写死了5.0,应该用6.5。改完后分数直接跳到0.85。嗯,这个坑爬得值。
4.3.2 为什么要有d₀?
说白了,d₀就是为了让不同大小的蛋白质,TM-score的“打分尺度”一致。一个100残基的蛋白,如果两个结构差2Å,RMSD上看着还不错;但同样2Å的偏差放在一个500残基的蛋白上,可能说明结构更相似。d₀把这个感觉量化为数学了。
4.4 全局对位优化:max() 里面的门道
公式里的那个 max(),不是装饰。它意味着TM-score的计算过程里,需要做一步“找最佳对位”。
4.4.1 对位流程
我习惯把TM-score的计算分成两步:
- 对位调整: 旋转平移目标结构,让两个结构的相对位置最优
- 评分计算: 在最优对位下,按公式算出最终的TM-score
这个过程一般用迭代法做。我最常用的方法是:
1. 初始对齐(比如用序列对齐或重心对齐)
2. 计算当前对位下的TM-score
3. 根据残基权重(距离近的权重高),重新做加权最小二乘对齐
4. 重复步骤2-3,直到收敛(通常3-5次迭代就够了)
实用建议:计算过程中,我建议每次迭代后检查一下TM-score的变化。如果连续两次迭代变化小于0.001,基本可以认为稳定了。没必要算到小数点后第6位,浪费时间。
4.5 计算过程的整体逻辑
为了方便理解,我画了一张流程图。这张图把从输入到输出的流程都串起来了:
这张图的核心逻辑:从初始对位出发,经过“计算得分 → 加权重对齐 → 判断收敛”的循环,直到对位稳定后输出最终TM-score。其中d₀的计算和加权最小二乘对齐是两个最容易出错的步骤。
4.6 实际计算中的几个注意点
4.6.1 代码实现时的细节
我在写TM-score计算代码时,会发现几个容易忽略的地方:
// 伪代码核心片段
double calc_tm_score(double* coords_ref, double* coords_mov, int N_ref) {
int N_aln = N_ref; // 全对位的情况
double d0 = 1.24 * pow(N_ref - 15, 1.0/3.0) - 1.8; // 公式中的d0
double sum = 0.0;
for (int i = 0; i < N_aln; i++) {
double d = euclidean_dist(coords_ref[i], coords_mov[i]);
sum += 1.0 / (1.0 + (d / d0) * (d / d0));
}
return sum / N_ref;
}
注意:上面的代码假设了两个结构已经是对齐好的。实际计算中,你需要先做加权最小二乘对齐。我见过有人直接把原始坐标塞进去算,得到0.2的分数还以为是模型不好——其实是对位都没找对。这个坑我踩过之后,就再也不跳了。
4.6.2 什么时候用TM-score最合适?
- 评估同源模型质量: TM-score > 0.7一般说明模型质量很高
- 判断是否同源性: 两个结构TM-score > 0.5,大概率是同源(同一折叠类型)
- 比较不同长度的蛋白: TM-score对长度差异有天然的容忍度
4.6.3 什么时候TM-score会失效?
- 两个结构本身没有明显的全局拓扑相似性
- 对位残基太少(比如只有20个残基对位,统计意义不够)
- 目标结构非常长而参考结构非常短(长度比差异太大)
一个小建议:我习惯同时看TM-score和RMSD两个指标。TM-score看全局相似度,RMSD看局部偏移的“绝对值”;两者结合,基本不会被骗。
4.7 本章小结
TM-score的计算原理,说白了就是三个要点:
- 归一化的指数得分函数 —— 距离近得高分,距离远迅速降分
- 长度相关d₀参数 —— 消除蛋白质大小对打分的影响
- 全局对位优化 —— 通过迭代找最优对位,再算最终分
掌握了这些,你自己写一个TM-score计算器也就几十行代码的事。嗯,下回有人问你“RMSD和TM-score哪个好”,你就可以告诉他:“不是哪个好,是看你要干什么。”