MDAnalysis专题

MDAnalysis协方差与HES重采样

用真实蛋白质轨迹演示收缩协方差和HES bootstrap,导出完整矩阵并解释统计波动的适用范围。

更新于 2026-11-08约 5 分钟阅读按任务与环境选择适用配置
阅读本篇目录

比较两段蛋白质轨迹时,HES用坐标分布的均值与协方差描述差异。本篇先用3个Cα、9维坐标说明协方差,再运行原生bootstrap。较小的原子选择便于理解矩阵;得到的数字只描述这3个原子,不能直接代表整条蛋白质。

1 运行与结果位置#

下载SPE、协方差与重采样示例,保存为spe-covariance.zip:

python3 -m zipfile -e spe-covariance.zip .
cd mdanalysis-spe-covariance
bash setup.sh
bash run.sh
bash verify.sh
bash plot.sh

本例为MDAnalysis 2.9.0、NumPy 1.26.4、SciPy 1.13.1,使用已有泛素轨迹的51帧Cα坐标。前26帧和后26帧各作为一组,两组共享中间那一帧,不是两条独立模拟。所有结构已对齐同一参考,因此HES调用中显式使用align=False。

输出为results/FULL-FIELDS.npz和results/VALIDATION.json。如果已运行过随机邻近嵌入的同一个包,直接读取已有结果即可。

2 收缩协方差怎么用#

少量帧配合过多坐标,协方差矩阵可能奇异或数值不稳定。本例把每帧前三个Cα展平为9维,分别计算显式收缩系数0.25与原生自动系数的结果:

fixed = shrinkage_covariance_estimator(
    coordinates_26_by_9, shrinkage_parameter=0.25
)
automatic = shrinkage_covariance_estimator(coordinates_26_by_9)

这是原生收缩估计器,不等同于简单地给对角线加一个常数。配套代码独立重建该版本的样本矩阵、单因子先验及其组合,并核对全部9×9元素;当前版本还包含其自身的样本缩放约定。因此不要拿另一软件的默认np.cov结果直接判断这里计算错误。

source env.sh
"$YS_PY" - <<'PYCODE'
import numpy as np
f = np.load('results/FULL-FIELDS.npz')
for i in range(2):
    fixed = f[f'covariance_{i}_explicit']
    auto = f[f'covariance_{i}_auto']
    np.savetxt(f'covariance-window-{i+1}.dat', fixed)
    print('window', i+1, 'shape', fixed.shape,
          'fixed condition', np.linalg.cond(fixed),
          'auto condition', np.linalg.cond(auto),
          'minimum auto eigenvalue', np.linalg.eigvalsh(auto).min())
PYCODE

实际结果如下;条件数无量纲,协方差和本表特征值的单位为Ų。

26帧窗口 系数0.25的条件数 自动系数的条件数 自动矩阵最小特征值
前半段 16.1423 20.5126 0.005211
后半段 24.5199 16.6615 0.007569

这些数字用于检查当前小例子的数值行为,不表示选择了最优的物理模型或已经收敛。收缩可以改善矩阵估计,不能补回轨迹中没有采到的构象。

3 原生HES bootstrap#

mean, spread = hes(
    [first_26_frames, last_26_frames],
    select='index 0 1 2', cov_estimator='shrinkage',
    weights=None, align=False,
    estimate_error=True, bootstrapping_samples=4
)

脚本在这一操作前设置np.random.seed(338),从每段原有26帧中有放回抽样,再计算四组HES。这里的随机数可以固定;同包中的底层SPE随机数规则不同,不能混为一谈。weights=None表示等权,不使用原子质量加权。

source env.sh
"$YS_PY" - <<'PYCODE'
import numpy as np
f = np.load('results/FULL-FIELDS.npz')
values = f['HES_bootstrap_all4_matrices'][:, 0, 1]
np.savetxt('hes-bootstrap.dat',
           np.column_stack([np.arange(1, len(values)+1), values]),
           header='resample HES')
print('four values:', values)
print('mean:', values.mean(), 'STD(ddof=0):', values.std())
print('native mean matrix:', f['HES_bootstrap_mean'])
print('native STD matrix:', f['HES_bootstrap_stddev'])
PYCODE

本次四次重采样的HES平均为4.47545,标准差为1.00993。HES没有固定的0~1范围,不要套用CES或DRES的数值尺度。图中的阴影是这四次重采样的均值±标准差,不是置信区间、标准误,也不是新的独立轨迹之间的统计误差。

两段真实轨迹的收缩协方差和四次HES重采样

原轨迹的相邻帧存在时间相关;本例逐帧有放回抽样,仅演示接口和数据导出。用于正式研究时,应根据相关时间选择块长度,增加独立轨迹和采样,并检查结果对窗口、原子选择与估计器的敏感性。不能仅把bootstrapping_samples调大就宣称轨迹收敛。

4 改成自己的数据时#

先保证两段轨迹的原子身份、顺序和对齐规则相同;再根据问题选原子,并检查样本数相对坐标维度是否足够。包内analyze.py的uni()负责加载坐标,cov()和bootstrap()集中给出了本篇的输入、原生调用和独立核对公式,可从这三处替换数据。

接口依据MDAnalysis 2.9协方差与ENCORE相似性说明。目前教程对应2.9接口;后续升级mdaencore时应重新核对参数和随机数行为。

需要根据你的体系选择资源?联系讨论计算需求。实际可用软件与权限,以当前账户和运行环境为准。

查看配图

放大后可滚动查看细节,按 Esc 关闭。

100%查看原图 ↗