Validation neutralization assays versus polyclonal fitsΒΆ

Compare actual measured neutralization values for specific mutants to the polyclonal fits.

Import Python modules:

[1]:
import os
import pickle

import altair as alt

import pandas as pd

import yaml

Read configuration and validation assay measurements:

[2]:
with open("config.yaml") as f:
    config = yaml.safe_load(f)

validation_ic50s = pd.read_csv(config["validation_ic50s"], na_filter=None)

validation_ic50s
[2]:
antibody aa_substitutions measured IC50 lower_bound
0 S2M11 0.002572 False
1 S2M11 Y449N 3.000000 True
2 S2M11 E484Y 3.000000 True
3 S2M11 Q493K 3.000000 True

Now get the predictions by the averaged polyclonal model fits:

[3]:
validation_vs_prediction = []
for antibody, antibody_df in validation_ic50s.groupby("antibody"):
    with open(os.path.join(config["escape_dir"], f"{antibody}.pickle"), "rb") as f:
        model = pickle.load(f)
    validation_vs_prediction.append(model.icXX(antibody_df))

validation_vs_prediction = pd.concat(validation_vs_prediction, ignore_index=True)

validation_vs_prediction
[3]:
antibody aa_substitutions measured IC50 lower_bound mean_IC50 median_IC50 std_IC50 n_models frac_models
0 S2M11 0.002572 False 0.014581 0.013821 0.010911 4 1.0
1 S2M11 E484Y 3.000000 True 12.680002 8.836638 13.500400 4 1.0
2 S2M11 Q493K 3.000000 True 6.845216 5.779082 6.342219 4 1.0
3 S2M11 Y449N 3.000000 True 1.645030 1.408748 1.233082 4 1.0

Now plot the results. We will plot the median across the replicate polyclonal fits to different deep mutational scanning replicates. This is an interactive plot that you can mouse over for details:

[4]:
corr_chart = (
    alt.Chart(validation_vs_prediction)
    .encode(
        x=alt.X("measured IC50", scale=alt.Scale(type="log")),
        y=alt.Y(
            "median_IC50",
            title="predicted IC50 from DMS",
            scale=alt.Scale(type="log"),
        ),
        facet=alt.Facet("antibody", columns=4, title=None),
        color=alt.Color("lower_bound", title="lower_bound"),
        tooltip=[
            alt.Tooltip(c, format=".3g") if validation_vs_prediction[c].dtype == float
            else c
            for c in validation_vs_prediction.columns.tolist()
        ],
    )
    .mark_circle(filled=True, size=60, opacity=0.6)
    .configure_axis(grid=False)
    .resolve_scale(y="independent", x="independent")
    .properties(width=150, height=150)
)

corr_chart
/fh/fast/bloom_j/software/miniconda3/envs/dms-vep-pipeline/lib/python3.9/site-packages/altair/utils/core.py:317: FutureWarning: iteritems is deprecated and will be removed in a future version. Use .items instead.
  for col_name, dtype in df.dtypes.iteritems():
[4]:
[ ]: