【阅读总结】Variant Effect Predictor: TranceptEVE、EVEscape、popEVE

省流:

本系列旨在整理Debora课题组一系列基于深度生成模型预测致病突变的工作,包括EVE、Tranception、TranceptEVE、EVEscape和popEVE,主要讨论数据来源与处理、模型架构与训练、性能测试与实例。

ModelPublishYearAvailable简述
EVENature2021https://github.com/OATML-Markslab/EVE https://evemodel.org/VAE模型,输入MSA,输出突变的进化分数(野生型ELBO减突变型ELBO)
TranceptionICML2022https://github.com/OATML-Markslab/Tranceptionk-mers融合输入的自回归模型
TranceptEVENIPS2022Tranception+EVE,weighted average
StructSeqNIPS2023TranceptEVE+ESM-IF1
EVEscapeNature2023https://github.com/OATML-Markslab/EVEscapeEVE+Biophysical
popEVEmedRxiv2024https://github.com/debbiemarkslab/popEVE https://pop.evemodel.org/EVE+ESM-1v

已完成:
【阅读总结】Variant Effect Predictor: EVE 深度生成模型预测致病突变
【阅读总结】Variant Effect Predictor: Tranception 自回归预测 + ProteinGym 基准数据集

TranceptEVE

Tranception在推理时使用的retrieval,是一种对MSA的抽提。TranceptEVE中进一步用EVE来强化MSA信息,与自回归推理/检索推理配合。

数据

evaluate on ProteinGym benchmarks

模型

TrancepEVE的结果有三个部分组成:retrieved MSA的氨基酸概率分布 log ⁡ P M \log P_M logPM,自回归预测结果 log ⁡ P T \log P_T logPT,和EVE预测结果 log ⁡ P E \log P_E logPE

log ⁡ P ( x i ∣ x < i ) = ( 1 − α P ) [ ( 1 − β P ) log ⁡ P T ( x i ∣ x < i ) + β P log ⁡ P M ( x i ) ] + α P log ⁡ P E ( x i ) \log P\left(x_i \mid x_{<i}\right)=\left(1-\alpha_P\right)\left[\left(1-\beta_P\right) \log P_T\left(x_i \mid x_{<i}\right)+\beta_P \log P_M\left(x_i\right)\right]+\alpha_P \log P_E\left(x_i\right) logP(xix<i)=(1αP)[(1βP)logPT(xix<i)+βPlogPM(xi)]+αPlogPE(xi)

依然保留双向预测( N → C \mathrm{N} \rightarrow \mathrm{C} NC C → N \mathrm{C} \rightarrow \mathrm{N} CN ):

log ⁡ P ( x ) = 1 2 [ log ⁡ P ( x N → C ) + log ⁡ P ( x C → N ) ] \log P(\mathbf{x})=\frac{1}{2}\left[\log P\left(\mathbf{x}_{N \rightarrow C}\right)+\log P\left(\mathbf{x}_{C \rightarrow N}\right)\right] logP(x)=21[logP(xNC)+logP(xCN)]

α α α β β β取决于检索得到的 MSA深度(见下表)。如果目标蛋白质没有或很少有同源物,就依赖自回归预测;如果 MSA 更深,会更加重视 MSA 和 EVE 先验。

MSA depth (Nb. sequences)
< 10 <10 <10 < 1 0 2 <10^2 <102 < 1 0 3 <10^3 <103 < 1 0 5 <10^5 <105 ≥ 1 0 5 \geq 10^5 105
α \alpha α0.00.30.60.70.8
β \beta β0.00.10.30.40.5

对indels的处理同Tranception。

原始EVE仅对覆盖完全(有较高质量MSA)的区域建模,但是本工作中EVE计算目标蛋白所有位置所有突变类型。TranceptEVE也可以兼容原始EVE,用其他两项log priors计算。

Appendix B.6提到,标准ensemble(log likelihood ratios from Tranception和delta ELBOs from EVE取平均)与TranceptEVE整体表现相当。但是TranceptEVE不需要考虑Tranception和EVE的缩放,保留了Tranception的自回归性(未来用于生成?)和处理indels的能力,且对于一个野生型的所有突变预测只需要建立一个EVE模型。

EVEscape

EVEscape score由三个部分组成:

  1. Fitness:EVEscape针对抗体逃逸的病毒蛋白,调整了EVE使用的超参数
    • sequence re-weighting in MSA (theta): 0.01, better suited to viruses
    • fragment filtering (threshold_sequence_frac_gaps): sequences in the MSA that align to at least 50% of the target sequence.
    • position filtering (threshold_focus_cols_frac_gaps): columns with at least 70% coverage, except for SARS-CoV-2 Spike for which we lower the required value to 30% in order to maximally cover experimental positions and significant pandemic sites.
      EVE模型架构不变。
  2. Accessibility:根据病毒蛋白的 PDB 文件计算Weighted Contact Number(WCN)
  3. Dissimilarity:突变体和野生型之间的电荷和疏水性差异之和

对这 3 项的乘积进行对数变换以获得最终的 EVEscape 分数:

def logistic(x):
    return 1 / (1 + np.exp(-x))

def standardization(x):
    return (x - x.mean()) / x.std()
    
#Compute EVEscape scores
summary["evescape"] = 0
summary["evescape"] += np.log(
    logistic(
        standardization(df_imp["evol_indices"]) * 1 /
        temperatures["fitness"]))
summary["evescape"] += np.log(
    logistic(
        standardization(df_imp["wcn_fill_r"]) * 1 /
        temperatures["surfacc"]))
summary["evescape"] += np.log(
    logistic(
        standardization(df_imp["charge_ew-hydro"]) * 1 /
        temperatures["exchangability"]))

popEVE

popEVE旨在全蛋白组范围内比较突变效应

数据

预印本中未放出。

模型

对EVE和ESM-1v预测分数,用gpytorch训练a two-component gaussian mixture model(见EVE)。本段代码可参见官方教程与解说

class GPModel(gpytorch.models.ApproximateGP):
    def __init__(self, inducing_points):
        # 初始化高斯过程模型,包括设置变分策略、均值和协方差模块
        variational_distribution = gpytorch.variational.NaturalVariationalDistribution(inducing_points.size(0))
        # 使用GPyTorch提供的变分策略,将模型的诱导点位置作为可学习参数
        variational_strategy = gpytorch.variational.VariationalStrategy(
            self, inducing_points, variational_distribution, learn_inducing_locations=True
        )
        super(GPModel, self).__init__(variational_strategy)
        
        # 采用零均值函数来降低过度预测致病性的风险
        self.mean_module = gpytorch.means.ZeroMean()
        # 设定核函数
        self.covar_module = gpytorch.kernels.ScaleKernel(gpytorch.kernels.RBFKernel())

    def forward(self, x):
        mean_x = self.mean_module(x)
        covar_x = self.covar_module(x)
        # 返回多元正态分布
        return gpytorch.distributions.MultivariateNormal(mean_x, covar_x)


使用Pòlya-Gamma辅助变量增强对高斯过程二元分类进行有效推理:

class PGLikelihood(gpytorch.likelihoods._OneDimensionalLikelihood):
    """
    Florian Wenzel, Theo Galy-Fajou, Christan Donner, Marius Kloft, Manfred Opper.
    "Efficient Gaussian process classification using Pòlya-Gamma data augmentation."
    """

    def expected_log_prob(self, target, input):
        # 计算 GP 输出(即输入分布)与目标值(标签)之间的 期望对数似然。
        mean, variance = input.mean, input.variance
        raw_second_moment = variance + mean.pow(2)

        # 将目标标签值从 0 和 1 转换为 -1 和 1 以匹配Pòlya-Gamma
        target = target.to(mean.dtype).mul(2.).sub(1.)

        # 通过二阶矩计算辅助变量 c,并从计算图中分离出来以避免梯度更新。
        c = raw_second_moment.detach().sqrt()
        # 计算 Pòlya-Gamma 辅助变量期望值
        half_omega = 0.25 * torch.tanh(0.5 * c) / c

        res = 0.5 * target * mean - half_omega * raw_second_moment
        res = res.sum(dim=-1)
        return res

    def forward(self, function_samples):
        return torch.distributions.Bernoulli(logits=function_samples)

    def marginal(self, function_dist):
        prob_lambda = lambda function_samples: self.forward(function_samples).probs
        probs = self.quadrature(prob_lambda, function_dist)
        return torch.distributions.Bernoulli(probs=probs)

使用 NGD(自然梯度下降)优化器来处理诱导点协方差矩阵和相应的均值向量,使用 Adam 优化器来处理所有其他参数(内核超参数以及诱导点位置)。

性能

在癌基因 MEF2C 和非必需嗅觉受体 ORF2A14上检验了致病/非必需基因的popEVE分数分布

`std::variant`是C++17引入的一个类模板,它代表了一个可以存储多种类型值的类型安全的联合体。`std::variant`中的每一类型称为一个“可能类型”。当创建一个`std::variant`实例时,你需要列出所有可能存储的类型,而该实例会存储其中的一种类型。 在你提到的`std::variant<std::monostate, bool>`中,`std::variant`可以存储两种类型的值:`std::monostate`和`bool`。`std::monostate`是`std::variant`特有的一个类型,用来表示variant不持有任何值的状态。它通常用于表示variant未初始化的情况。 `std::variant`提供了一系列操作来检查当前存储的类型、获取当前存储的值以及修改存储的值。使用`std::variant`可以替代C++98的`union`,但是更加安全,因为不需要担心类型混淆和越界问题。 `std::variant`的使用示例可能如下: ```cpp #include <variant> #include <iostream> int main() { std::variant<std::monostate, bool> v; std::cout << std::holds_alternative<std::monostate>(v) << std::endl; // 输出:1,因为variant默认不持有任何值 v = true; if (std::holds_alternative<bool>(v)) { std::cout << std::get<bool>(v) << std::endl; // 输出:1 } return 0; } ``` 在上面的代码中,我们首先创建了一个`std::variant`实例`v`,默认情况下它不持有任何值,即持有`std::monostate`。然后我们给`v`赋予了一个`bool`类型的值`true`,并检查当前存储的类型和获取存储的值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值