ejes[0, 0].bar(lista(asmd_means.keys()), lista(asmd_means.values()), color=colors_a) ejes[0, 0].axhline(0.1, ls=”–“, color=”red”, label=”0.10 umbral de desequilibrio”) ejes[0, 0].set_title(“ASMD media entre covariables”) ejes[0, 0].set_ylabel(“ASMD medio”); ejes[0, 0].legend() ejes[0, 0].tick_params(axis=”x”, rotación=20) verdad = target_df[“happiness”].mean() colores_b = [“#888”] + [“#1f77b4”, “#ff7f0e”, “#2ca02c”, “#d62728”][: len(methods)] + [“black”]
ejes[0, 1].bar(lista(resultados_medios.claves()), lista(resultados_medios.valores()), color=colores_b[: len(outcome_means)]) ejes[0, 1].axhline(verdad, ls=”–“, color=”negro”, etiqueta=f”verdad = {verdad:.2f}”) ejes[0, 1].set_title(“Felicidad media estimada versus verdad básica”) ejes[0, 1].set_ylabel(“Felicidad media”); ejes[0, 1].legend() ejes[0, 1].tick_params(axis=”x”, rotación=20) w_ipw = ajustado_ipw.to_df()[“weight”].ejes de valores[1, 0].hist(w_ipw, bins=40, color=”steelblue”, edgecolor=”white”) ejes[1, 0].set_title( f”Distribución de peso IPW\n” f”min={w_ipw.min():.2f} mediana={np.median(w_ipw):.2f} max={w_ipw.max():.2f}” ) ejes[1, 0].set_xlabel(“peso”); ejes[1, 0].set_ylabel(“count”) edades = sample_df[“age”].values bins = np.linspace(18, 90, 31) ejes[1, 1].hist(objetivo_df[“age”]bins=bins, densidad=True, alpha=0.45, color=”green”, label=”Target (truth)”) ejes[1, 1].hist(edades, bins=bins, densidad=True, alpha=0.45, color=”red”, label=”Muestra (sesgada)”) ejes[1, 1].hist(edades, bins=bins, densidad=True, alpha=0.45, color=”blue”, pesos=w_ipw, label=”Muestra (ponderada por IPW)”) ejes[1, 1]Ejes .set_title(“Distribución de edades: corrección de sesgo por IPW”)[1, 1].set_xlabel(“Edad”); ejes[1, 1].set_ylabel(“densidad”); ejes[1, 1].legend() plt.tight_layout() plt.savefig(“balance_diagnostics.png”, dpi=110, bbox_inches=”tight”) plt.show() print(“\n” + “=” * 60) print(” AVANZADO – control de la variación con max_de”) print(“=” * 60) print(“max_de=1.5 recorta los pesos extremos para que el efecto del diseño se mantenga ≤ 1.5,”) print(“cambiando un poco de sesgo por intervalos de confianza más ajustados.\n”) ajustado_trim = sample_with_target.adjust(method=”ipw”, max_de=1.5) print(adjusted_trim.summary()) out = ajustado_ipw.to_df() out.to_csv(“balance_weighted_sample.csv”, index=False) print(“\nMuestra ponderada guardada → balance_weighted_sample.csv”) print(“Gráfico de diagnóstico guardado → balance_diagnostics.png”) print(“\nPrimeras 5 filas de salida ponderada:”) print(out.head()) err_naive = abs(sample_df[“happiness”].mean() – verdad) err_ipw = abs(resultado_medios[“IPW”] – verdad) print(“\n” + “=” * 60) print(” RESUMEN DE REDUCCIÓN DE SESGO”) print(“=” * 60) print(f”Error del estimador ingenuo: {err_naive:.3f}”) print(f”Error del estimador IPW: {err_ipw:.3f}”) print(f”Reducción del sesgo: {(1 – err_ipw / max(err_naive, 1e-9)) * 100:.1f}%”)
higo, ejes = plt.subplots(2, 2, tamaño de higo=(14, 10)) colores_a = [“gray”, “#1f77b4”, “#ff7f0e”, “#2ca02c”, “#d62728″][: len(asmd_means)]