Skip to content

Latest commit

 

History

History
93 lines (74 loc) · 2.42 KB

File metadata and controls

93 lines (74 loc) · 2.42 KB

Inferenza causale con pazienti sintetici

Poiché synthdiet genera pazienti completamente sintetici, il risultato controfattuale reale di ogni paziente sotto qualsiasi dieta è calcolabile. Ciò rende la libreria particolarmente utile per insegnare l'inferenza causale.

Confronti controfattuali

from synthdiet import (
    Anthropometrics, Demographics, Lifestyle, Patient, Sex,
    mediterranean_diet, standard_diet,
)
from synthdiet.diseases import Type2Diabetes
from synthdiet.causal import counterfactual_run

patient = Patient(
    demographics=Demographics(age=58, sex=Sex.MALE),
    anthropometrics=Anthropometrics(height_cm=176, weight_kg=98),
    lifestyle=Lifestyle(),
)
patient.add_disease(Type2Diabetes(severity="moderate"))

pair = counterfactual_run(patient, mediterranean_diet(), standard_diet(),
                          duration_weeks=12)
ite = pair.individual_effect("hba1c_pct")
print(f"Effetto individuale su HbA1c: {ite:+.2f} pp")

ATE su una coorte

from synthdiet import CohortGenerator, CohortSpec, DiseaseSpec
from synthdiet.causal import ATEEstimator

cohort = CohortGenerator(
    CohortSpec(size=80, diseases=[DiseaseSpec("type_2_diabetes", 1.0)]),
    seed=1,
).generate()

est = ATEEstimator(
    treatment_diet=mediterranean_diet(),
    control_diet=standard_diet(),
    duration_weeks=12,
)
result = est.estimate(cohort, outcome="hba1c_pct")
print(result.pretty())

Effetti eterogenei (CATE)

from synthdiet.causal import cate_by_subgroup

cate = cate_by_subgroup(
    cohort=cohort,
    treatment_diet=mediterranean_diet(),
    control_diet=standard_diet(),
    subgroup_fn=lambda p: "obeso" if p.bmi >= 30 else "non_obeso",
    outcome="hba1c_pct",
)
for group, ate in cate.items():
    print(group, ate.pretty())

Confondimento e aggiustamento

from synthdiet.causal import ConfoundingExperiment

exp = ConfoundingExperiment(
    treatment_diet=mediterranean_diet(),
    control_diet=standard_diet(),
    # I pazienti più gravi ricevono più spesso l'intervento
    propensity=lambda p: min(0.9, max(0.1, (p.bmi - 22) / 25.0)),
    duration_weeks=12,
)
report = exp.run(cohort, outcome="hba1c_pct", seed=42)
print(report)

L'output include il vero ATE, il confronto naïve (distorto), la stima IPTW e la stima g-formula.

Visualizzare un DAG

from synthdiet.causal.dag import default_diet_dag

dag = default_diet_dag()
print(dag.to_mermaid())