Data Science · Klinik Klinische Datenanalyse & Machine Learning
Ansicht
Lerntiefe
Codeansicht
Farbschema

14 · Fehlende Werte und Imputation

imputation_coverage.png

Abbildung · Quellcode

imputation_coverage

Erzeugt von make_figure() in module/14-fehlende-werte/code/benchmark.py, Zeile 499–560.

Python
def make_figure(beta_metrics: dict[str, dict]) -> None:
    import matplotlib.pyplot as plt

    apply_style()

    order = list(reversed(METHOD_ORDER))  # oracle on top
    labels_de = {
        "oracle": "Oracle (volle Wahrheit)",
        "complete_case": "Complete Case",
        "mean_imputation": "Mittelwert-Imputation",
        "median_imputation": "Median-Imputation",
        "regression_deterministic": "Regressions-Imputation (deterministisch)",
        "regression_stochastic": "Regressions-Imputation (stochastisch, single)",
        "pmm": "PMM (single, k=5)",
        "mice": "MICE (m=20, Rubin's rules)",
        "missing_indicator": "Missing-Indicator-Methode",
    }
    coverage = [beta_metrics[k]["coverage"] for k in order]
    colors = []
    for k in order:
        if k in ("oracle",):
            colors.append(PRIMARY)
        elif k == "complete_case":
            colors.append(SECONDARY)
        elif k == "mice":
            colors.append(PALETTE[2])  # multiple imputation -- distinct colour
        else:
            colors.append(EVENT)  # single-imputation methods

    fig, ax = plt.subplots(figsize=(9, 5.5))

    nominal = 0.95
    tol = 2 * np.sqrt(nominal * (1 - nominal) / R)
    ax.axvspan(nominal - tol, nominal + tol, color="#ECEDEF", zorder=0,
               label=f"Monte-Carlo-Toleranz (±2·SE, R={R})")
    ax.axvline(nominal, color=SECONDARY, linewidth=1.2, linestyle="--", zorder=1)

    bars = ax.barh(range(len(order)), coverage, color=colors, edgecolor="none",
                    height=0.6, zorder=2)
    ax.set_yticks(range(len(order)))
    ax.set_yticklabels([labels_de[k] for k in order])
    ax.set_xlim(0, 1.05)
    ax.set_xlabel("95%-CI-Abdeckung für beta(bga_ph)")
    ax.set_title("Abdeckung des 95%-Konfidenzintervalls je Imputationsmethode")
    ax.grid(axis="x")
    ax.grid(axis="y", visible=False)

    for bar, cov, k in zip(bars, coverage, order):
        single = " (single)" if k in SINGLE_IMPUTATION else ""
        ax.text(min(cov + 0.015, 1.0), bar.get_y() + bar.get_height() / 2,
                f"{cov:.0%}{single}", va="center", fontsize=9)

    from matplotlib.patches import Patch
    legend_items = [
        Patch(facecolor=PRIMARY, label="Oracle (volle Daten)"),
        Patch(facecolor=SECONDARY, label="Complete Case"),
        Patch(facecolor=EVENT, label="Single-Imputation-Methoden"),
        Patch(facecolor=PALETTE[2], label="Multiple Imputation (MICE)"),
    ]
    ax.legend(handles=legend_items, loc="lower right", fontsize=9)

    save(fig, Path(__file__).resolve().parents[1] / "assets" / "imputation_coverage.png")

← zurück zu Modul 14 · vollständige Datei ansehen