AI 設計タンパク質の性能評価:計算予測と実験結果の比較分析
本文の状態
日本語全文を表示中
詳細モードで約18分の本文を読めます。
同じ出来事の情報源
この情報源を基点に整理
MarkTechPost
Anthropic が公開した AI 設計ミニタンパク結合体データセットを用い、計算予測と実験結果を比較検証するチュートリアルが提供され、構造予測の精度や実用化への課題が分析される。
AI深層分析を開く2026年8月28日 01:03
AI深層分析
キーポイント
AI 設計データの公開と検証
Anthropic が 1,440 件の AI 設計ミニタンパク結合体と 16 の標的に対する計算予測および 2 つの独立した実験室の実験結果を含むデータセットを公開している。
構造予測精度の評価
この分析では、構造予測モデルが実際に成功する結合体をどれだけ正確に特定できるかを評価し、複数の予測を組み合わせた場合のパフォーマンス向上も検討される。
実用化への課題の可視化
ランキングの実験予算への転換効率や、実験自体による結果の不一致(ディスアグリーメント)が分析され、現実的な適用可能性が問われる。
成功予測モデルの開発
標的を認識する分類器を訓練することで、これらのシグナルが実験的成功を信頼性高く予測できるかどうかを検証するアプローチが取られている。
動的なパスマッピングの導入
ファイル名の非統一性に対応するため、ハードコーディングではなくリポジトリを走査してパスマップを作成する。これにより、推測されたパスが失敗しても静かに止まる問題を回避できる。
重要な引用
we use Anthropic's claude-protein-binder-design dataset, which contains 1,440 AI-designed miniprotein binders tested against 16 targets.
Because the release includes both computational predictions and real wet-lab results from two independent labs, we can go beyond simply studying the designs.
the subset wetlab_summary lives at data/tables/wetlab/summary.parquet, and a guessed path would fail silently
pull design_summary, one row per design, 1,440 rows wide enough to carry every join we need downstream
編集コメントを表示
編集コメント
計算科学と実験科学のギャップを埋めるための貴重なデータセットであり、AI 創薬分野におけるモデル評価の標準化に寄与する。開発者はこのチュートリアルを通じて、予測精度の評価手法や実用化への障壁について深く理解できるだろう。
Source Article
元記事を日本語で読む
本文に関係しない購読案内、埋め込み通知、サイト内プロモーションは除いています。
本チュートリアルでは、Anthropic の「claude-protein-binder-design」データセットを活用します。このデータセットには、16 種類の標的タンパク質に対してテストされた 1,440 個の AI 設計ミニプロテイン結合体が含まれています。
公開されているデータには計算予測値に加え、2 つの独立した研究所による実際のウェットラボ実験結果も含まれているため、単に設計を分析するだけでなく、より深い評価が可能になります。具体的には、構造予測モデルがどの程度成功する結合体を特定できるか、複数の予測を組み合わせた場合に性能が向上するか、ランキングが実用的なテスト予算にどう換算されるか、そして実験結果のばらつきがどの程度実験自体に起因するのかを検証します。
さらに、これらのシグナルが実験的な成否を信頼して予測できるかどうかを試すため、「標的認識型分類器」も訓練します。
import subprocess, sys, warnings, itertools, math
warnings.filterwarnings("ignore")
import importlib.util
_needed = {"huggingface_hub": "huggingface_hub>=0.24", "pyarrow": "pyarrow",
"pandas": "pandas", "sklearn": "scikit-learn",
"matplotlib": "matplotlib", "scipy": "scipy"}
_missing = [pkg for mod, pkg in _needed.items() if importlib.util.find_spec(mod) is None]
if _missing:
print("installing:", ", ".join(_missing))
subprocess.run([sys.executable, "-m", "pip", "install", "-q", *_missing], check=False)
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy import stats
from huggingface_hub import HfApi, hf_hub_download
from sklearn.metrics import roc_auc_score, cohen_kappa_score, average_precision_score
from sklearn.model_selection import GroupKFold, StratifiedKFold
from sklearn.ensemble import HistGradientBoostingClassifier
from sklearn.inspection import permutation_importance
SEED = 0
rng_global = np.random.default_rng(SEED)
pd.set_option("display.width", 200)
pd.set_option("display.max_columns", 100)
plt.rcParams.update({"figure.dpi": 110, "font.size": 9, "axes.grid": True,
"grid.alpha": 0.25, "axes.spines.top": False, "axes.spines.right": False})
REPO = "Anthropic/claude-protein-binder-design"
BAR = "=" * 78
def head(n, title):
prefix = f"{n}. " if str(n) else ""
print(f"\n{BAR}\n {prefix}{title}\n{BAR}")
head(1, "TABLE DISCOVERY")
api = HfApi()
まず、実行環境で実際に不足しているライブラリのみをインストールし、リポジトリを一度走査してファイルの硬い指定ではなく、サブセット名とパスのマッピングを作成します。これは命名規則が統一されていないため重要です。例えば、"wetlab_summary"というサブセットは data/tables/wetlab/summary.parquet に存在しますが、推測したパスでは静かに失敗してしまいます。
マッピングを構築した後、design_summary を読み込みます。1 行が 1 デザインに対応し、1,440 行のデータには、後続の処理で必要な結合に十分な情報が含まれています。
repo_files = api.list_repo_files(REPO, repo_type="dataset")
TABLES = {}
for f in repo_files:
if f.startswith("data/tables/") and f.endswith(".parquet"):
key = f[len("data/tables/"): -len(".parquet")].replace("/", "_")
TABLES[key] = f
print(f"Found {len(TABLES)} Parquet tables:")
for k in sorted(TABLES):
print(f" - {k:38s} {TABLES[k]}")
def load_table(name: str) -> pd.DataFrame:
"""Load a subset by its viewer name, with a datasets-library fallback."""
if name in TABLES:
return pd.read_parquet(hf_hub_download(REPO, TABLES[name], repo_type="dataset"))
from datasets import load_dataset
return load_dataset(REPO, name, split="full").to_pandas()
ds = load_table("design_summary")
print(f"\ndesign_summary: {ds.shape[0]:,} rows x {ds.shape[1]} columns")インシリコからウェットラボへ:AI によるタンパク質設計の性能評価
まず、評価対象となるデータセットの構築と確認を行います。ここでは「バインダー」と「非バインダー」の 2 つのカテゴリを対象にテストします。
tested = ds["adaptyv_binding"].isin(CALLS) | ds["twist_binding"].isin(CALLS)
ev = ds[tested].copy()
ev["y"] = ev["binder_final"].astype(int)上記のコードは、複数のベンダーからの測定結果が含まれる設計のみを抽出し、評価可能なデータセット ev を作成しています。また、バインダーかどうかを示すラベル y を整数値として追加しています。
次に、全体の統計情報を出力します。
print(f"All designs : {len(ds):,}")
print(f"Evaluable (>=1 vendor call): {len(ev):,}")
print(f"Confirmed binders : {int(ev['y'].sum()):,} "
f"({100 * ev['y'].mean():.1f}% base rate)")
print(f"Never measured : {len(ds) - len(ev):,}")出力結果は以下のようになります。
- すべての設計数:ds の総行数
- 評価可能な設計数(少なくとも 1 つのベンダー測定があるもの):ev の行数
- 確認されたバインダー数とベースレート(平均値をパーセント表示)
- 一度も測定されていない設計数
最後に、各カテゴリ変数のレベル分布を確認します。
print("\nCategorical levels:")
for c in ["design_model", "campaign", "generator", "sequence_design_method", "vendor_agreement"]:
vals = ds[c].astype(str).value_counts()
print(f" {c:24s} ({len(vals)}): {', '.join(vals.index[:6])}"
+ (" ..." if len(vals) > 6 else ""))このループでは、設計モデル、キャンペーン、ジェネレーター、シーケンス設計手法、ベンダー合意といった各変数について、出現頻度の高い上位 6 つの値をリストアップします。カテゴリ数が 6 つを超える場合は省略記号を表示し、全体像を把握しやすくしています。
これにより、AI によるタンパク質設計の実験データがどのように構成され、どの程度が実際に検証されているかが明確になります。
ターゲットの数(ds['target'].nunique())とリストを表示します。
print(f"\nTargets ({ds['target'].nunique()}): {', '.join(sorted(ds['target'].unique()))}")
ビンドラーの長さの最小値から最大値、および中央値を出力します。
print(f"Binder length: {ds.binder_length.min()}-{ds.binder_length.max()} aa "
f"(median {ds.binder_length.median():.0f})")
「HIT-RATE LANDSCAPE」の最初の 3 行を表示します。
head(3, "HIT-RATE LANDSCAPE")
ウィルソンの信頼区間を計算する関数です。引数は成功回数 k、試行回数 n、および z スコア(デフォルトは 1.96)です。
def wilson(k, n, z=1.96):
if n == 0:
return (np.nan, np.nan, np.nan)
p = k / n
d = 1 + z**2 / n
c = (p + z**2 / (2 * n)) / d
h = z * math.sqrt(p * (1 - p) / n + z2 / (4 * n2)) / d
return p, max(0.0, c - h), min(1.0, c + h)
データフレームを指定された列でグループ化し、各グループのヒット率と信頼区間を集計する関数です。
def rate_table(df, by):
rows = []
for key, g in df.groupby(by, dropna=False):
p, lo, hi = wilson(int(g.y.sum()), len(g))
rows.append({by: key, "n": len(g), "hits": int(g.y.sum()),
rate": p, "lo": lo, "hi": hi})
return pd.DataFrame(rows).sort_values("rate", ascending=False).reset_index(drop=True)
for dim in ["design_model", "campaign", "generator", "sequence_design_method"]:
t = rate_table(ev, dim)
print(f"\n--- hit rate by {dim} ---")
print(t.to_string(index=False,
formatters={"rate": "{:.3f}".format, "lo": "{:.3f}".format, "hi": "{:.3f}".format}))
tt = rate_table(ev, "target")
fig, ax = plt.subplots(figsize=(9, 4.2))
ax.bar(tt.target, tt.rate, color="#4C72B0")
ax.errorbar(tt.target, tt.rate,
yerr=[(tt.rate - tt.lo).clip(lower=0), (tt.hi - tt.rate).clip(lower=0)],
fmt="none", ecolor="0.25", capsize=3, lw=1)
ax.axhline(ev.y.mean(), ls="--", c="crimson", lw=1, label=f"pooled {ev.y.mean():.2f}")
ax.set_ylabel("experimental hit rate"); ax.set_title("Hit rate by target (Wilson 95% CI)")
ax.tick_params(axis="x", rotation=55); ax.legend(); plt.tight_layout(); plt.show()
print("\nRead this plot as the dominant effect size in the dataset: target choice "
"swamps generator choice. Any model comparison that does not stratify by "
"target is mostly measuring which targets that model was pointed at.")
評価対象のセットは、binder_final 列ではなく実際のベンダーからの呼び出しに基づいてフィルタリングして定義します。binder_final はブール値であり、測定されなかった 120 件の設計を「False」として記録してしまうためです。
その後、モデル、キャンペーン、ジェネレーター、ターゲットごとにヒット率を計算し、小標本領域で正規近似が機能しないサブグループに対してはウィルソン区間(Wilson interval)で囲います。最初に注目すべきはターゲットのグラフです。これは、抗原の選択が比較対象となる他のすべての要因を圧倒していることを示しています。
Copy CodeCopiedUse a different Browser
「PER-PREDICTOR 識別力」の分析
まず、予測変数(PREDICTORS)を特定し、ソートして表示します。これは ipsae_min_ で始まるカラム名から接頭辞を除いたものです。
次に、AUC(Area Under the Curve)とその信頼区間を計算する関数 auc_ci を定義します。この関数は、予測スコア s と正解ラベル y を受け取り、ブートストラップ法(デフォルト300回)を用いて AUC の推定値と 95% 信頼区間を算出します。
計算ロジックの詳細:
- まず、欠損値を含むデータ行を除外します。
- データ数が 30 未満または正解ラベルのユニーク値が 2 つ未満の場合は、無効な結果(NaN)を返します。
- 基本となる AUC と平均適合度(AP)を計算します。
- ランダムサンプリングによりブートストラップサンプルを生成し、各サンプルで AUC を再計算します。この際、正解ラベルが少なくとも 2 つのクラスを含む場合のみ計算結果を採用します。
- 最終的に、得られたブートストラップ分布の 2.5% と 97.5% のパーセンタイルを信頼区間の下限と上限として設定します。
この関数を用いて、各予測変数 p と評価指標(ipsae_min および sc_dockq)の組み合わせについて AUC を計算し、結果をデータフレームに格納します。その後、予測変数をキーにして AUC の値をピボットテーブル化し、ipsae_min によるスコア順にソートして出力します。
最後に、実験的な結合子(binder)の最終評価との比較として、AUC を降順で並べ替えた結果表を表示します。数値は小数点以下 3 桁まで表示されます。
fig, ax = plt.subplots(figsize=(9, 4.2))
x = np.arange(len(piv)); w = 0.38
for i, (metric, colr) in enumerate([("ipsae_min", "#4C72B0"), ("sc_dockq", "#DD8452")]):
sub = perf[perf.metric == metric].set_index("predictor").reindex(piv.index)
lo_err = (sub.auc - sub.lo).clip(lower=0).fillna(0)
hi_err = (sub.hi - sub.auc).clip(lower=0).fillna(0)
ax.bar(x + (i - 0.5) * w, sub.auc, w, label=metric, color=colr)
ax.errorbar(x + (i - 0.5) * w, sub.auc,
yerr=[lo_err, hi_err], fmt="none", ecolor="0.3", capsize=2, lw=0.9)
ax.axhline(0.5, ls="--", c="crimson", lw=1)
ax.set_xticks(x); ax.set_xticklabels(piv.index, rotation=45, ha="right")
ax.set_ylabel("AUC"); ax.set_ylim(0.35, None)
ax.set_title("In-silico score vs wet-lab binding, by structure predictor")
ax.legend(); plt.tight_layout(); plt.show()
print("Interpretation: AUCs land well above chance but far below the ~0.9 you "
"would need to trust a single filter. That gap is the entire practical "
"reason this dataset exists.")
head(5, "CONSENSUS SCORING")
ips_cols = [f"ipsae_min_{p}" for p in PREDICTORS if f"ipsae_min_{p}" in ev.columns]
dq_cols = [f"sc_dockq_{p}" for p in PREDICTORS if f"sc_dockq_{p}" in ev.columns]
def pct_rank(df, cols):
return df[cols].rank(pct=True, na_option="keep")
R_ips, R_dq = pct_rank(ev, ips_cols), pct_rank(ev, dq_cols)
ev["cons_ipsae"] = R_ips.mean(axis=1)
ev["cons_dockq"] = R_dq.mean(axis=1)
ev["cons_all"] = pd.concat([R_ips, R_dq], axis=1).mean(axis=1)
ev["cons_median"] = pd.concat([R_ips, R_dq], axis=1).median(axis=1)
ev["cons_min"] = pd.concat([R_ips, R_dq], axis=1).min(axis=1)
ev["cons_disagree"] = pd.concat([R_ips, R_dq], axis=1).std(axis=1)
best_single = perf.loc[perf.auc.idxmax()]
print(f"Best single column: {best_single.metric}_{best_single.predictor} AUC={best_single.auc:.3f}")
print()
for name in ["cons_ipsae", "cons_dockq", "cons_all", "cons_median", "cons_min", "cons_disagree"]:
r = auc_ci(ev.y, ev[name])
print(f" {name:16s} AUC={r['auc']:.3f} [{r['lo']:.3f}, {r['hi']:.3f}] AP={r['ap']:.3f}")
corr = ev[ips_cols].corr(method="spearman")
fig, ax = plt.subplots(figsize=(6.2, 5.2))
im = ax.imshow(corr.values, cmap="viridis", vmin=0, vmax=1)
lbl = [c.replace("ipsae_min_", "") for c in ips_cols]
ax.set_xticks(range(len(lbl))); ax.set_xticklabels(lbl, rotation=90)
ax.set_yticks(range(len(lbl))); ax.set_yticklabels(lbl)
ax.set_title("Spearman correlation between predictors (ipSAE)")
ax.grid(False); fig.colorbar(im, shrink=0.8); plt.tight_layout(); plt.show()
print("\nIf every off-diagonal cell were ~1.0 there would be no ensemble gain to "
"harvest. The moderate correlations are why cons_all typically edges out "
"the best single predictor — and why disagreement itself carries signal.")
10 種類の予測モデルを、湿式実験(wet-lab)のラベルに対して ipSAE と自己一貫性 DockQ の両方で評価し、ブートストラップ法による信頼区間を算出することで、統計的に有意な差がどこにあるかを明確にします。その後、各列をパーセンタイルに変換してランク正規化し、統合を行います。これにより、異なる尺度やゼロ付近での分布の偏りがあっても、指標間で比較可能なスケールフリーな評価が可能になります。
スピアマン相関のヒートマップは、アンサンブル手法がなぜ有効なのかを説明しています。もし予測モデル同士が完全に一致していれば、そこから得られる付加価値は残らないからです。
「BUDGET CURVES (precision@N)」のグラフ描画
予算曲線を描くための関数 budget_curve を定義します。この関数は、指定されたスコア列に基づいてデータフレームを降順ソートし、上位 N 件のヒット数を累積計算して精度を算出します。
def budget_curve(df, score_col, max_n=400):
d = df[[score_col, "y"]].dropna().sort_values(score_col, ascending=False)
hits = d.y.values.cumsum()
n = np.arange(1, len(d) + 1)
k = min(max_n, len(d))
return n[:k], (hits / n)[:k]
次に、8 インチ x 4.4 インチの図を作成し、最良の単一モデルと合意形成(コンセンサス)アプローチの結果をプロットします。
fig, ax = plt.subplots(figsize=(8, 4.4))
best_col = f"{best_single.metric}_{best_single.predictor}"
for col, lab, style in [(best_col, f"best single ({best_col})", "-"),
("cons_all", "consensus (rank-avg, all)", "-"),
("cons_min", "consensus (unanimity/min)", "--")]:
n, prec = budget_curve(ev, col)
ax.plot(n, prec, style, lw=1.8, label=lab)
ランダムなベースライン(平均精度)を破線で表示し、軸ラベルとタイトルを設定します。
ax.axhline(ev.y.mean(), ls=":", c="crimson", lw=1.4, label=f"random baseline ({ev.y.mean():.2f})")
ax.set_xlabel("designs ordered for wet-lab testing (N, best-first)")
ax.set_ylabel("hit rate among top N")
ax.set_title("How much does in-silico triage buy you?")
凡例を表示し、レイアウトを整えて図を出力します。
ax.legend(); plt.tight_layout(); plt.show()
小規模な予算(N=25, 50, 100, 200)における富化率(enrichment rate)を確認するための出力処理を行います。各 N 値に対して、ランダムベースラインと比較して最良単一モデルと合意形成モデルの精度とその倍率を表示します。
print("Enrichment at small budgets:")
for N in [25, 50, 100, 200]:
line = f" N={N:4d} | random {ev.y.mean():.3f}"
for col, lab in [(best_col, "best-single"), ("cons_all", "consensus")]:
n, prec = budget_curve(ev, col, max_n=N)
line += f" | {lab} {prec[-1]:.3f} ({prec[-1] / ev.y.mean():.2f}x)"
print(line)
「VENDOR CONCORDANCE」の分析では、複数のベンダー(CALLS)で両方の結合タイプが検出されたデータに絞り込み、ベンダー間の一致度をクロス集計します。
both = ev[ev.adaptyv_binding.isin(CALLS) & ev.twist_binding.isin(CALLS)]
ct = pd.crosstab(both.adaptyv_binding, both.twist_binding)
両ベンダーからの呼び出しを持つデザインの数:
print(f"Designs with calls from BOTH vendors: {len(both):,}\n")
print(ct.to_string())
もし一致するデザインの数が 10 を超える場合、コエンのカッパ係数と合意率を計算します。
if len(both) > 10:
kappa = cohen_kappa_score(both.adaptyv_binding, both.twist_binding)
agree = (both.adaptyv_binding == both.twist_binding).mean()
print(f"\nRaw agreement: {agree:.3f} Cohen's kappa: {kappa:.3f}")
# カッパが 1.0 よりも大幅に低い場合、上記の「予測不能な」変動の一部はモデルの失敗ではなく、アッセイ間の不一致によるものであることを意味します。
print("Kappa well under 1.0 means part of the 'unpredictable' variance above "
"is assay disagreement, not model failure.")
次に、両ベンダーの KD(解離定数)データに対して欠損値を除去し、正の値のみを残して相関分析を行います。
kd = ev[["adaptyv_kd_nM", "twist_kd_nM"]].dropna()
kd = kd[(kd > 0).all(axis=1)]
もし有効なデータポイントが 10 以上ある場合、スピアマンの順位相関係数を計算し、対数スケールの散布図を描画します。
if len(kd) > 10:
rho, pv = stats.spearmanr(kd.adaptyv_kd_nM, kd.twist_kd_nM)
fig, ax = plt.subplots(figsize=(4.8, 4.6))
ax.scatter(kd.adaptyv_kd_nM, kd.twist_kd_nM, s=16, alpha=0.6, c="#4C72B0", edgecolor="none")
lims = [min(kd.min()) * 0.5, max(kd.max()) * 2]
ax.plot(lims, lims, "k--", lw=1)
ax.set_xscale("log"); ax.set_yscale("log")
ax.set_xlabel("Adaptyv KD (nM)"); ax.set_ylabel("Twist KD (nM)")
ax.set_title(f"Cross-vendor KD, n={len(kd)}, Spearman rho={rho:.2f}")
plt.tight_layout(); plt.show()
最後に、両ベンダー間の KD 値の中央値比率を計算し、絶対値の比較には注意が必要であることを示唆します。
med_ratio = np.median(kd.twist_kd_nM / kd.adaptyv_kd_nM)
print(f"Median KD ratio (Twist/Adaptyv): {med_ratio:.2f}x -> systematic format offset, "
"so treat absolute KD across vendors as ordinal, not interchangeable.")
ランキング性能を Precision@N に変換するのは、実験室が 1,300 種類のコンストラクトを一括で発注するわけではなく、AUC がリスト上位でのスコアの挙動を隠蔽してしまうからです。次に、25、50、100、200 という予算規模において、実際の選別(トライアージ)がもたらす価値がエンリッチメント表から読み取れます。さらに、ベンダー間の Cohen's κ と対数対数 KD 比較を提示し、これが性能の上限を示します。ラベルノイズが、いかなる AUC の値も誠実に到達できる高さを制限するからです。
Copy CodeCopiedUse a different Browser
head(8, "EXPRESSION CONFOUND")
if "twist_expression_mg_per_mL" in ev.columns:
g = ev.dropna(subset=["twist_expression_mg_per_mL"])
a = g.loc[g.y == 1, "twist_expression_mg_per_mL"]
b = g.loc[g.y == 0, "twist_expression_mg_per_mL"]
if len(a) > 5 and len(b) > 5:
u, pv = stats.mannwhitneyu(a, b)
print(f"Titer (mg/mL) binders median {a.median():.2f} (n={len(a)}) | "
f"non-binders {b.median():.2f} (n={len(b)}) Mann-Whitney p={pv:.2e}")
r = auc_ci(g.y, g.twist_expression_mg_per_mL)
print(f"AUC of raw expression titer alone as a 'binder' predictor: {r['auc']:.3f}")
fig, axes = plt.subplots(1, 2, figsize=(9, 3.6))
axes[0].hist([b, a], bins=25, label=["non-binder", "binder"],
color=["#BBBBBB", "#4C72B0"], density=True)
axes[0].set_xlabel("Twist titer (mg/mL)"); axes[0].set_ylabel("density"); axes[0].legend()
axes[0].set_title("Expression by outcome")
if "adaptyv_expression" in ev.columns:
ex = ev.groupby(ev.adaptyv_expression.astype(str)).y.agg(["mean", "size"])
ex = ex[ex["size"] >= 10].sort_values("mean")
axes[1].barh(ex.index, ex["mean"], color="#DD8452")
axes[1].set_xlabel("hit rate"); axes[1].set_title("Hit rate by Adaptyv expression class")
plt.tight_layout(); plt.show()
print("\nTakeaway: if expression alone scores meaningfully above 0.5, then part of "
"every AUC in section 4 is a solubility signal riding along. To isolate ")
「インターフェース品質」の項目では、セクション4を再実行する際、発現した設計のみを対象に制限しました。
発現データは以下のように抽出されます。adaptyv_expression カラムが存在する場合、その値が"medium"または"high"である行のみを残し、存在しない場合は全データを対象とします。
発現したサンプル数が100を超えた場合、以下の計算を実行して結果を出力します。
- 全評価可能なデータにおけるコンセンサス AUC: r_all['auc'] (サンプル数: r_all['n'])
- 発現サンプルのみにおけるコンセンサス AUC: r_exp['auc'] (サンプル数: r_exp['n'])
次に、「エピトープの収束性」に関する分析を開始します。
parse_epitope 関数は、入力文字列からエピトープ残基を抽出し、重複を除いたセットとして返す処理を行います。引数が文字列でない場合や空の場合は空のフリーズセット(不変集合)を返します。文字列をセミコロンで分割し、各トークンから最後の要素(コロン以降の部分)を取得してセットに追加します。
この関数を epitope_residues カラムに適用し、新しい epi カラムを作成しました。
次に、平均ペアワイズジャカード係数を計算する mean_pairwise_jaccard 関数を実装しています。これは、複数のセット間の類似度を評価するためのものです。対象となるセットが2つ未満の場合は NaN を返します。組み合わせの総数が最大値(4000)を超えた場合、乱数シードに基づいてランダムにサンプリングして計算コストを削減します。
各ペアについて、二つのセットの和集合のサイズで割った共通部分のサイズ(ジャカード係数)を算出し、すべてのペアの結果の平均値を返します。
最後に、ターゲットごとにデータをグループ化し、陽性(y == 1)および陰性(y == 0)サンプルから抽出したエピトープリストをそれぞれ B と N に格納しています。
結合対象の集合 B と非結合対象の集合 N の長さがともに 3 以上の場合、各ターゲットについて結合数と非結合数を記録し、ペアワイズ・ジャカード係数の平均を計算してデータフレームに追加します。その後、結合対象と非結合対象の差(delta)を算出し、その値で降順ソートした結果を表示します。
統計的有意性を検定するため、サンプル数が 6 以上の場合にペアワイズ・ウィルコクソン検定を実行し、p 値を出力して「結合対象の方がエピトープ収束性が高いか?」という問いに対する答えを示します。次に、結合数が多い順にソートしたターゲットのうち最上位のものを選び、そのターゲットに焦点を当てたサブセットを作成します。
このサブセット内では、陽性(y=1)と陰性(y=0)の設計において出現するエピトープの頻度をそれぞれカウントし、結合対象で最も頻出する 18 のエピトープを抽出します。その後、9x3.8 インチの図を作成し、これらのエピトープについて陽性と陰性の設計が接触する割合を棒グラフで比較表示します。X 軸ラベルは 70 度回転させて右揃えとし、Y 軸には「接触する設計の割合」、タイトルには対象ターゲット名を表示します。
ax.legend(); plt.tight_layout(); plt.show()
発現量(titer)だけで結合能を区別できるか、またその場合、上記のスコアの一部が実質的に「別の名前の溶存性」に過ぎないのかを検証します。発現された設計のみで合意形成(コンセンサス)を再実行することで、界面品質と生体物理的特性を分離して評価できます。その後、エピトープ接触リストをアミノ酸残基のセットに解析し、標的ごとに、また複数の標的間で比較しながら、確認された結合体が失敗例よりも特定の共有パッチ(領域)に収束しているかどうかを検討します。
Copy CodeCopiedUse a different Browser
head(10, "MODELLING WITH HONEST CROSS-VALIDATION")
AAS = "ACDEFGHIKLMNPQRSTVWY"
KD_HYDRO = dict(zip(AAS, [1.8, 2.5, -3.5, -3.5, 2.8, -0.4, -3.2, 4.5, -3.9, 3.8,
1.9, -3.5, -1.6, -3.5, -4.5, -0.8, -0.7, 4.2, -0.9, -1.3]))
CHARGE = {"K": 1, "R": 1, "H": 0.1, "D": -1, "E": -1}
def seq_features(seq):
seq = "".join(ch f
関連記事
今日のまとめ
AIデイリーブリーフで今日の重要ニュースをまとめ読み