{ "cells": [ { "cell_type": "markdown", "id": "3291a381", "metadata": {}, "source": [ "# Weighting with MAIC / entropy balancing\n", "\n", "Every matcher elsewhere in `pybalance` (genetic, LP, propensity) works by **selecting a subset**\n", "of the pool. `pybalance.weighting` instead **reweights every pool patient**, so nothing is\n", "dropped -- some patients just count for more (or less) than others. This is the standard approach\n", "for **Matching-Adjusted Indirect Comparison (MAIC)** (Signorovitch et al., 2010): reweighting a\n", "trial's patient-level data (\"IPD\") so its weighted covariate moments match a comparator's\n", "**published, aggregate-only** statistics (e.g. a Table 1 of means and proportions), enabling an\n", "indirect treatment comparison when the comparator's own patient-level data isn't available.\n", "\n", "- `MAICWeighter` -- the classic MAIC formulation: matches the disclosed **first moments** (means,\n", " category rates, and the rate above a disclosed median/quantile).\n", "- `EntropyBalanceWeighter` -- the general form MAIC is a special case of: optionally *also*\n", " balances the **variance** of numeric features whose target discloses a mean and a std.\n", "\n", "The notebook mirrors the aggregate-matching demo: the same three use cases, each disclosing a bit\n", "more or something different about the target:\n", "1. **means only** (plus a categoric proportion);\n", "2. **means and stds**, which adds a variance constraint;\n", "3. **medians and other quantiles instead of means**, plus a soft **max**.\n", "\n", "As there, only disclosed statistics are constrained. Features the target says nothing about (here\n", "`height` and `country`) are left free, but we keep them in the `MatchingData` so we can still see\n", "how reweighting changes them. A last section covers what happens when the target lies outside the\n", "pool's support.\n", "\n", "Both weighters also work with a patient-level target, and both return an ordinary `MatchingData`,\n", "just with every pool row now carrying a fitted weight column." ] }, { "cell_type": "code", "execution_count": 1, "id": "bd729133", "metadata": {}, "outputs": [], "source": [ "import logging\n", "\n", "import matplotlib.pyplot as plt\n", "import pandas as pd\n", "\n", "from pybalance.sim import (\n", " generate_toy_dataset,\n", " get_demo_aggregate_target_path,\n", " load_demo_aggregate_target,\n", ")\n", "from pybalance.utils import AggregateTarget, MatchingData, MatchingHeaders\n", "from pybalance.visualization import plot_aggregate_target_match\n", "from pybalance.weighting import (\n", " EntropyBalanceWeighter,\n", " MAICWeighter,\n", " weighted_balance_table,\n", ")\n", "\n", "%matplotlib inline\n", "\n", "# show convergence / effective-sample-size diagnostics logged during fit()\n", "logging.basicConfig(level=logging.INFO, format=\"%(message)s\", force=True)" ] }, { "cell_type": "markdown", "id": "ba2df1a5", "metadata": {}, "source": [ "## A patient-level (synthetic) pool\n", "\n", "MAIC needs patient-level data only for the **pool** (our \"IPD\"). `generate_toy_dataset` returns an\n", "entirely simulated one (no real patients); with `n_target=0` it generates no target patients at\n", "all, since the target will come from summary statistics instead -- as in the aggregate-matching\n", "demo." ] }, { "cell_type": "code", "execution_count": 2, "id": "8ee6493e", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ageheightweightgenderhaircolorcountrybinary_0binary_1binary_2binary_3patient_id
069.436489155.18926079.1445330.01400110
128.771438175.27060297.7345611.00500111
262.640154136.64864085.1700550.01200012
368.907932189.95995290.7055490.01300113
449.571169133.78710976.7081931.02300014
\n", "
" ], "text/plain": [ " age height weight gender haircolor country binary_0 \\\n", "0 69.436489 155.189260 79.144533 0.0 1 4 0 \n", "1 28.771438 175.270602 97.734561 1.0 0 5 0 \n", "2 62.640154 136.648640 85.170055 0.0 1 2 0 \n", "3 68.907932 189.959952 90.705549 0.0 1 3 0 \n", "4 49.571169 133.787109 76.708193 1.0 2 3 0 \n", "\n", " binary_1 binary_2 binary_3 patient_id \n", "0 0 1 1 0 \n", "1 0 1 1 1 \n", "2 0 0 1 2 \n", "3 0 1 1 3 \n", "4 0 0 1 4 " ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "m = generate_toy_dataset(n_pool=1000, n_target=0, seed=7)\n", "pool = m.get_population(\"pool\").drop(columns=[m.population_col])\n", "pool.head()" ] }, { "cell_type": "markdown", "id": "caa419ae", "metadata": {}, "source": [ "## Specifying means only\n", "\n", "An `AggregateTarget` is the target's sample size `n` plus whatever summary statistics are disclosed\n", "-- a published Table 1:\n", "\n", "- `numeric`: per feature, e.g. `{\"mean\": ...}`;\n", "- `categoric`: per feature, `{level: rate}` -- the proportion of each category.\n", "\n", "Here the target discloses the mean `age` and `weight` and the proportion of each `gender`." ] }, { "cell_type": "code", "execution_count": 3, "id": "76a8e1e3", "metadata": {}, "outputs": [ { "data": { "text/html": [ "AggregateTarget (n=250)
\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
featuretypestatvalue
agenumericmean64.00
weightnumericmean80.00
gendercategoric00.35
gendercategoric10.65
" ], "text/plain": [ "AggregateTarget(n=250)\n", "feature type stat value\n", " age numeric mean 64.00\n", " weight numeric mean 80.00\n", " gender categoric 0 0.35\n", " gender categoric 1 0.65" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "my_target = AggregateTarget(\n", " n=250,\n", " numeric={\n", " \"age\": {\"mean\": 64.0},\n", " \"weight\": {\"mean\": 80.0},\n", " },\n", " categoric={\"gender\": {0: 0.35, 1: 0.65}},\n", ")\n", "my_target" ] }, { "cell_type": "markdown", "id": "98242a9e", "metadata": {}, "source": [ "To reweight, wrap the pool and the target in a `MatchingData` and hand it to `MAICWeighter`.\n", "`match()` fits (if needed) and returns a `MatchingData` with every pool patient retained, plus a\n", "new `sample_weight` column (the default `weight_col`; note it's *not* called `\"weight\"`, since\n", "`weight` here is itself a genuine covariate -- `MAICWeighter` refuses to silently clobber a\n", "matching feature and raises if `weight_col` collides with one).\n", "\n", "The `headers` say which pool columns we want to look at. They may include features the target does\n", "not disclose -- here `height` and `country`. Those are left unconstrained by the weighter, but\n", "reported in the results.\n", "\n", "`weighted_balance_table()` compares each balanced feature's target moment to both the\n", "**unweighted** and **weighted** pool moment -- the \"weighted\" column should land right on target." ] }, { "cell_type": "code", "execution_count": 4, "id": "a46240a0", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "MAICWeighter converged in 6 iterations. Effective sample size: 377.7 / 1000 pool patients.\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
featuremomenttargetunweighted_poolweighted_pool
0gender_1.0mean0.650.5170000.650000
1country_1meanNaN0.1080000.095055
2country_2meanNaN0.2240000.219909
3country_3meanNaN0.2740000.301231
4country_4meanNaN0.2840000.303890
5country_5meanNaN0.1100000.079916
6agemean64.0055.52010764.000000
7weightmean80.0088.01651080.000000
8heightmeanNaN160.308334156.103230
\n", "
" ], "text/plain": [ " feature moment target unweighted_pool weighted_pool\n", "0 gender_1.0 mean 0.65 0.517000 0.650000\n", "1 country_1 mean NaN 0.108000 0.095055\n", "2 country_2 mean NaN 0.224000 0.219909\n", "3 country_3 mean NaN 0.274000 0.301231\n", "4 country_4 mean NaN 0.284000 0.303890\n", "5 country_5 mean NaN 0.110000 0.079916\n", "6 age mean 64.00 55.520107 64.000000\n", "7 weight mean 80.00 88.016510 80.000000\n", "8 height mean NaN 160.308334 156.103230" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "headers = MatchingHeaders(numeric=[\"age\", \"weight\", \"height\"], categoric=[\"gender\", \"country\"])\n", "\n", "matching_data = MatchingData(pool=pool, target=my_target, headers=headers)\n", "weighter = MAICWeighter(matching_data, verbose=True)\n", "matched = weighter.match()\n", "\n", "weighted_balance_table(weighter)" ] }, { "cell_type": "markdown", "id": "45ac4b0c", "metadata": {}, "source": [ "`age`, `weight` and `gender` land right on their targets in the weighted column. `height` and the\n", "`country` levels have no target (`NaN`) -- nothing constrains them -- but we can still see how they\n", "moved as a side effect of reweighting.\n", "\n", "The **effective sample size (ESS)**, $\\left(\\sum_i w_i\\right)^2 / \\sum_i w_i^2$, summarizes how\n", "\"spread out\" the weights are: it equals the pool size when all weights are equal, and shrinks\n", "towards 1 as more and more of the total weight concentrates on fewer patients. A large drop from\n", "the raw pool size is the standard MAIC red flag that the reweighting is relying heavily on a\n", "small, possibly unrepresentative, slice of the pool -- worth showing alongside any MAIC result." ] }, { "cell_type": "code", "execution_count": 5, "id": "4aadf68a", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Effective sample size: 377.7 / 1000 pool patients\n", "Converged: True\n", "Weight summary (sums to target n=250 by default):\n" ] }, { "data": { "text/plain": [ "count 1000.000000\n", "mean 0.250000\n", "std 0.321042\n", "min 0.002645\n", "25% 0.060622\n", "50% 0.144954\n", "75% 0.304432\n", "max 3.993364\n", "Name: sample_weight, dtype: float64" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "print(f\"Effective sample size: {weighter.effective_sample_size():.1f} / {len(pool)} pool patients\")\n", "print(f\"Converged: {weighter.diagnostics['converged']}\")\n", "print(f\"Weight summary (sums to target n={my_target.n} by default):\")\n", "matched.get_population(matched.pool_name)[\"sample_weight\"].describe()" ] }, { "cell_type": "markdown", "id": "c5a2a58e", "metadata": {}, "source": [ "Since the target here is an `AggregateTarget`, it has no patient-level rows for\n", "`plot_numeric_features`/`plot_categoric_features` to draw a distribution for -- as of this version,\n", "passing one logs a warning and shows nothing useful. Use `plot_aggregate_target_match()` instead:\n", "one panel per disclosed constraint, showing where the pool lands before vs. after weighting\n", "relative to the disclosed value, in its own units. Pass `weights=` to compare the *weighted* pool." ] }, { "cell_type": "code", "execution_count": 6, "id": "647ae506", "metadata": {}, "outputs": [ { "data": { "image/png": "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IiIiIiKiEMbAABEREREREVEIY2CAiIiIiIiIKIQxMEBEREREREQUwhgYICIiIiIiIgphDAwQERERERERhTAGBoiIiIiIiIhCGAMDRERERERERCGMgQEiIiIiIiKiEMbAABEREREREVEIY2CAiIiIiIiIKIQxMEBEREREREQUwhgYICIiIiIiIgphDAwQEVG0ee+992T69Ok8wkQhqkaNGnLo0KHY3g0iimXff/+99OvXL7Z3g7xgYICIiGwbMGCATJ482fb2u3btkuPHj/MIE4WodevWyfXr12N7N4golh07dkx2794d27tBXsTz9iAREZFVixYtJGnSpFF2UHD1oECBAvLCCy/wQBMRERHFEgYGiIjItiJFikTp0cLVg0SJEvEbICIiIopFnEoQ4i5evCjPPPOM3urXry99+vTR+6wOHz4sL7/8sjRp0kQ+//xz+e6775zmCF27dk0GDx6sj3fo0EGHDRKRf9ixY4c0btzY8feKFSu0vO/bt89RfqtVqyYXLlxwbLN69Wrp3LmzNGrUSAYNGiQ3b970OpVg3Lhx0rRpU+nSpYv8+eef4eYU379/X4YPH+6oI/7++2+9f+zYsfLbb7/JxIkTdZ+ef/75aD0WRBRxefVW/pEzZOrUqW7Ls+nbb791vP5ff/0V7pDbef2hQ4fqa/z444/8yoiiyeO07/fv3y+1a9eW7du3S9euXeXZZ5/VeuHBgweObf755x/H66NMoy1gZef1t23bJt26ddPXp+jHwECIS5YsmQwcOFBvr732ms4FRifh4cOH+vj58+elbNmyEjduXD2Rnz59Wrp37+6YI4QT+lNPPaUNg06dOkn58uWlWbNm2vkgotiXL18+WbZsmezdu1f/njNnjgYLli5dqn+vWbNG5/2lTZtW/54wYYK0adNGSpUqpSf7nTt3Sp06dcQwDH0cZf3o0aOO1//ggw/k008/1XJfvXp1Pbmj4W+dU4wGx+XLl/X14sWLp693584dPekXLFhQn4c6qFevXjF8dIhCS0TlNaLyj5whaAO4K8+Ajv6HH34ozz33nLYl2rVr59RRsPP6r776qgYq8W/FihVj5TgRBbvHbd+jU//LL79o36FmzZrSunVr7fwj4A8ow3h9lG08/8SJE/q4ye7rIyiAuqR3796xcpxCjkFk8eDBAyN79uzGhg0b9O+PP/7YqFixotMx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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig = plot_aggregate_target_match(matching_data, matched, weights=weighter.weight_col)" ] }, { "cell_type": "markdown", "id": "b54c007a", "metadata": {}, "source": [ "## Specifying means and standard deviations\n", "\n", "A Table 1 sometimes discloses a standard deviation alongside a mean. `EntropyBalanceWeighter` is the\n", "general form `MAICWeighter` is a (mean-only) special case of: pass `match_variance=True` to\n", "*additionally* constrain the weighted variance of every numeric feature whose target discloses a\n", "`std` (categoric features are never variance-constrained -- their variance is already fixed by\n", "their matched rate). The variance is taken around the disclosed mean, so a std needs its mean.\n", "\n", "Typing targets out by hand gets long, so `pybalance.sim` ships ready-made ones, the same as in the\n", "aggregate-matching demo: `load_demo_aggregate_target(use_case)` returns the packaged\n", "`AggregateTarget` (and `generate_aggregate_target(use_case)` derives the same thing from a toy\n", "dataset -- or from your own patient-level `MatchingData`).\n", "\n", "| `use_case` | disclosed statistics |\n", "|---|---|\n", "| `means` | `age` and `weight` means, `gender` rates |\n", "| `means_std` | `age` and `weight` means and stds, `gender` rates |\n", "| `quantiles` | `age` quartiles and `weight` median (instead of means), `gender` rates |\n", "\n", "Load `means_std` and reweight. Displaying the target shows exactly what it discloses; the table now\n", "has a `variance` row for `age` and `weight` next to their means." ] }, { "cell_type": "code", "execution_count": 7, "id": "899d528b", "metadata": {}, "outputs": [ { "data": { "text/html": [ "AggregateTarget (n=100)
\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
featuretypestatvalue
agenumericmean50.795973
agenumericstd15.019030
weightnumericmean82.079040
weightnumericstd18.721164
gendercategoric0.00.550000
gendercategoric1.00.450000
" ], "text/plain": [ "AggregateTarget(n=100)\n", "feature type stat value\n", " age numeric mean 50.795973\n", " age numeric std 15.019030\n", " weight numeric mean 82.079040\n", " weight numeric std 18.721164\n", " gender categoric 0.0 0.550000\n", " gender categoric 1.0 0.450000" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "EntropyBalanceWeighter converged in 6 iterations. Effective sample size: 639.1 / 1000 pool patients.\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
featuremomenttargetunweighted_poolweighted_pool
0gender_1.0mean0.4500000.5170000.450000
1country_1meanNaN0.1080000.108157
2country_2meanNaN0.2240000.216864
3country_3meanNaN0.2740000.258550
4country_4meanNaN0.2840000.311152
5country_5meanNaN0.1100000.105278
6agemean50.79597555.52010750.795975
7agevariance225.571251171.687210225.571241
8weightmean82.07904188.01651082.079041
9weightvariance350.482008273.742310350.481995
10heightmeanNaN160.308334157.499874
\n", "
" ], "text/plain": [ " feature moment target unweighted_pool weighted_pool\n", "0 gender_1.0 mean 0.450000 0.517000 0.450000\n", "1 country_1 mean NaN 0.108000 0.108157\n", "2 country_2 mean NaN 0.224000 0.216864\n", "3 country_3 mean NaN 0.274000 0.258550\n", "4 country_4 mean NaN 0.284000 0.311152\n", "5 country_5 mean NaN 0.110000 0.105278\n", "6 age mean 50.795975 55.520107 50.795975\n", "7 age variance 225.571251 171.687210 225.571241\n", "8 weight mean 82.079041 88.016510 82.079041\n", "9 weight variance 350.482008 273.742310 350.481995\n", "10 height mean NaN 160.308334 157.499874" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "target_b = load_demo_aggregate_target(\"means_std\")\n", "display(target_b)\n", "\n", "weighter_b = EntropyBalanceWeighter(\n", " MatchingData(pool=pool, target=target_b, headers=headers), match_variance=True, verbose=True\n", ")\n", "weighter_b.match()\n", "\n", "weighted_balance_table(weighter_b)" ] }, { "cell_type": "markdown", "id": "d37a97b1", "metadata": {}, "source": [ "## Specifying medians and quantiles instead of means\n", "\n", "Published Table 1s often report a **median** (\"age, median: 41\") or other **quantiles** (\"age, IQR:\n", "35-52\") instead of a mean for a skewed covariate. A **quantile** `(q, value)` means\n", "P(raw <= value) = q, and a median is the single quantile 0.5: `{\"age\": {\"median\": 41.0}}` is\n", "exactly `{\"age\": {\"quantile\": [(0.5, 41.0)]}}`. The disclosed value is the cutpoint: the weighter\n", "dichotomizes the raw column there and matches the resulting rate, so you never compute the 0/1\n", "column yourself. Here `age` discloses its quartiles and `weight` only a median.\n", "\n", "A target like this is easiest to keep in a file, and that is what `load_demo_aggregate_target` has\n", "been reading all along. Here is the packaged `quantiles` file:" ] }, { "cell_type": "code", "execution_count": 8, "id": "a6788f5d", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "/Users/gmema/src/matching-fork/venv/lib/python3.12/site-packages/pybalance/sim/data/aggregate_target_quantiles.csv\n", "\n", "feature,statistic,parameter,value\n", ",n,,100\n", "age,quantile,0.25,41.37572755384545\n", "age,median,,53.71747134991201\n", "age,quantile,0.75,63.69799477706703\n", "weight,median,,82.66384310636546\n", "gender,rate,0.0,0.55\n", "gender,rate,1.0,0.45\n", "\n" ] } ], "source": [ "path = get_demo_aggregate_target_path(\"quantiles\")\n", "print(path, end=\"\\n\\n\")\n", "print(open(path).read())" ] }, { "cell_type": "markdown", "id": "65b957df", "metadata": {}, "source": [ "The file has one row per disclosed statistic, in four columns (`feature`, `statistic`, `parameter`,\n", "`value`): `n`, then `mean` / `std` / `median` / `min` / `max` rows for numeric features, `quantile`\n", "rows (with the proportion `q` in `parameter`) and `rate` rows (with the category level in\n", "`parameter`) for categoric ones. `AggregateTarget.from_csv(path)` reads it and `to_csv()` writes\n", "it, so a published Table 1 can be transcribed into a spreadsheet and loaded directly.\n", "\n", "Now load it and reweight. `MAICWeighter` matches the **rate above each disclosed quantile** -- the\n", "`age_q0.25_1.0`, `age_q0.5_1.0`, ... rows below are the indicators \"age is above its disclosed\n", "quartile / median\", whose target rate is `1 - q`. There is no mean for `age` or `weight`, so the\n", "table has no raw-feature rows to compare for them." ] }, { "cell_type": "code", "execution_count": 9, "id": "551306e0", "metadata": {}, "outputs": [ { "data": { "text/html": [ "AggregateTarget (n=100)
\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
featuretypestatvalue
agenumericquantile_0.2541.375728
agenumericquantile_0.553.717471
agenumericquantile_0.7563.697995
weightnumericquantile_0.582.663843
gendercategoric0.00.550000
gendercategoric1.00.450000
" ], "text/plain": [ "AggregateTarget(n=100)\n", "feature type stat value\n", " age numeric quantile_0.25 41.375728\n", " age numeric quantile_0.5 53.717471\n", " age numeric quantile_0.75 63.697995\n", " weight numeric quantile_0.5 82.663843\n", " gender categoric 0.0 0.550000\n", " gender categoric 1.0 0.450000" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "MAICWeighter converged in 6 iterations. Effective sample size: 830.9 / 1000 pool patients.\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
featuremomenttargetunweighted_poolweighted_pool
0gender_1.0mean0.450.5170000.450000
1country_1meanNaN0.1080000.110618
2country_2meanNaN0.2240000.223352
3country_3meanNaN0.2740000.265532
4country_4meanNaN0.2840000.290569
5country_5meanNaN0.1100000.109929
6age_q0.25_1.0mean0.750.8360000.750000
7age_q0.5_1.0mean0.500.6000000.500000
8age_q0.75_1.0mean0.250.3390000.250000
9weight_q0.5_1.0mean0.500.6220000.500000
10heightmeanNaN160.308334158.667453
\n", "
" ], "text/plain": [ " feature moment target unweighted_pool weighted_pool\n", "0 gender_1.0 mean 0.45 0.517000 0.450000\n", "1 country_1 mean NaN 0.108000 0.110618\n", "2 country_2 mean NaN 0.224000 0.223352\n", "3 country_3 mean NaN 0.274000 0.265532\n", "4 country_4 mean NaN 0.284000 0.290569\n", "5 country_5 mean NaN 0.110000 0.109929\n", "6 age_q0.25_1.0 mean 0.75 0.836000 0.750000\n", "7 age_q0.5_1.0 mean 0.50 0.600000 0.500000\n", "8 age_q0.75_1.0 mean 0.25 0.339000 0.250000\n", "9 weight_q0.5_1.0 mean 0.50 0.622000 0.500000\n", "10 height mean NaN 160.308334 158.667453" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "target_c = AggregateTarget.from_csv(path)\n", "display(target_c)\n", "\n", "weighter_c = MAICWeighter(MatchingData(pool=pool, target=target_c, headers=headers), verbose=True)\n", "weighter_c.match()\n", "\n", "weighted_balance_table(weighter_c)" ] }, { "cell_type": "markdown", "id": "03ecc4b0", "metadata": {}, "source": [ "### A soft maximum\n", "\n", "Trials also report ranges (\"weight, max: 100\"). `min` and `max` are simply the 0th and 100th\n", "quantile, so they can be added to any numeric feature: `{\"weight\": {\"median\": 82.7, \"max\": 100.0}}`,\n", "or a `min`/`max` row in the CSV. As in the matching demo they are **soft**. For a weighter there is\n", "a concrete reason: weights are strictly positive, so *exactly* zero weight on patients above a max\n", "cannot be reached. Instead the weight above the max is penalized (`limit_penalty`, 0.01 by default;\n", "larger values enforce it more tightly) and shrinks to a small remainder, while the quartiles and the\n", "median are still matched exactly.\n", "\n", "Here we take use case 3's target and add a ceiling on `weight`:" ] }, { "cell_type": "code", "execution_count": 10, "id": "c6d07cfe", "metadata": {}, "outputs": [ { "data": { "text/html": [ "AggregateTarget (n=100)
\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
featuretypestatvalue
agenumericquantile_0.2541.375728
agenumericquantile_0.553.717471
agenumericquantile_0.7563.697995
weightnumericquantile_0.582.663843
weightnumericmax100.000000
gendercategoric0.00.550000
gendercategoric1.00.450000
" ], "text/plain": [ "AggregateTarget(n=100)\n", "feature type stat value\n", " age numeric quantile_0.25 41.375728\n", " age numeric quantile_0.5 53.717471\n", " age numeric quantile_0.75 63.697995\n", " weight numeric quantile_0.5 82.663843\n", " weight numeric max 100.000000\n", " gender categoric 0.0 0.550000\n", " gender categoric 1.0 0.450000" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "Detected constant feature(s) in target population: weight_q1.0_0.0,weight_q1.0_1.0.\n", "MAICWeighter converged in 7 iterations. Effective sample size: 653.8 / 1000 pool patients.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Share of the pool above 100kg: 27.1% unweighted, 0.8% weighted\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
featuremomenttargetunweighted_poolweighted_pool
0gender_1.0mean0.450.5170000.450000
1country_1meanNaN0.1080000.117517
2country_2meanNaN0.2240000.221034
3country_3meanNaN0.2740000.270855
4country_4meanNaN0.2840000.278525
5country_5meanNaN0.1100000.112069
6age_q0.25_1.0mean0.750.8360000.750000
7age_q0.5_1.0mean0.500.6000000.500000
8age_q0.75_1.0mean0.250.3390000.250000
9weight_q0.5_1.0mean0.500.6220000.500000
10weight_q1.0_1.0mean0.000.2710000.007701
11heightmeanNaN160.308334156.765991
\n", "
" ], "text/plain": [ " feature moment target unweighted_pool weighted_pool\n", "0 gender_1.0 mean 0.45 0.517000 0.450000\n", "1 country_1 mean NaN 0.108000 0.117517\n", "2 country_2 mean NaN 0.224000 0.221034\n", "3 country_3 mean NaN 0.274000 0.270855\n", "4 country_4 mean NaN 0.284000 0.278525\n", "5 country_5 mean NaN 0.110000 0.112069\n", "6 age_q0.25_1.0 mean 0.75 0.836000 0.750000\n", "7 age_q0.5_1.0 mean 0.50 0.600000 0.500000\n", "8 age_q0.75_1.0 mean 0.25 0.339000 0.250000\n", "9 weight_q0.5_1.0 mean 0.50 0.622000 0.500000\n", "10 weight_q1.0_1.0 mean 0.00 0.271000 0.007701\n", "11 height mean NaN 160.308334 156.765991" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "numeric = {feature: dict(stats) for feature, stats in target_c.numeric.items()}\n", "numeric[\"weight\"][\"max\"] = 100.0 # soft ceiling: no patient heavier than 100kg\n", "\n", "target_d = AggregateTarget(n=target_c.n, numeric=numeric, categoric=target_c.categoric)\n", "display(target_d)\n", "\n", "weighter_d = MAICWeighter(MatchingData(pool=pool, target=target_d, headers=headers), verbose=True)\n", "weighter_d.match()\n", "\n", "above = (pool[\"weight\"] > 100).to_numpy()\n", "share = weighter_d.weights[above].sum() / weighter_d.weights.sum()\n", "print(f\"Share of the pool above 100kg: {above.mean():.1%} unweighted, {share:.1%} weighted\")\n", "\n", "weighted_balance_table(weighter_d)" ] }, { "cell_type": "markdown", "id": "250491e7", "metadata": {}, "source": [ "`plot_aggregate_target_match` -- the per-constraint plot from the matching demo -- takes the weights\n", "too: pass the name of the weight column and the \"after\" dot is the *weighted* pool, compared with the\n", "unweighted one before. Each panel is one disclosed constraint in its own units (e.g. the 25th, 50th\n", "and 75th percentile of `age`). A disclosed max is plotted as the weighted fraction of patients at or\n", "below it, `P(x <= 100)`, since weights stay positive and the maximum *value* never moves: it rises\n", "from 73% to about 99%, but not all the way to the dashed line at 1." ] }, { "cell_type": "code", "execution_count": 11, "id": "b31ca676", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAABA8AAAIpCAYAAADNZRHKAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjExLjIsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvgI3uAAAAAAlwSFlzAAAPYQAAD2EBqD+naQAA+RpJREFUeJzsnQW8FcX7/4cupZSSEEUaJASlFAERUdJCRFFRFESl7PgqFgaiYmGLhYSkYIGYGGCQEgYIKKFIN+z/9R7/c357zj15uXHuPZ/363Xgnt05u7OzO8/OPPNEHs/zPCOEEEIIIYQQQggRgbyRdgghhBBCCCGEEEJIeSCEEEIIIYQQQoiYyPJACCGEEEIIIYQQUZHyQAghhBBCCCGEEFGR8kAIIYQQQgghhBBRkfJACCGEEEIIIYQQUZHyQAghhBBCCCGEEFGR8kAIIYQQQgghhBBRkfJACCGEyOVs3brVNGnSxIwdOza7q5LU5NR2atmypRk5cmSWXEdOaKPQ9hBCCJExSHkghEhqZs+ebQeq55xzTnZXJWno3bu3GTBgQI45bmaxceNG+2yMHz/e5HQy+1r2799vvv/+e7NhwwaT6m2dme2UXVDnP/74I0uuIye0UWh75JZneurUqbbOa9euze6qCCFSlPzZXQEhhIjG008/bX7++Wc7GPz888/NaaedlvINtnTpUlOyZMkcc9zMYt++ffa5YBKQ08nsa+G+zps3z1SpUsWkelunAod7v1OBnPhMb9q0ydZ5z5492V0VIUSKIssDIUTSsn79evPee++ZYcOGmapVq5qXXnopu6skRI4kf/78dsWybNmy2V0VkQXofgshhMgMpDwQQiQtr732milQoIC58sorzdVXX20mTpxotmzZErbs6tWrzbXXXmtatWplzj//fPPll1+azz77zE6YFi9enK6yr7zyit22e/du88Ybb1jXidatWwf2//777+bGG280bdu2Naeeeqq5/vrrzW+//ZambjNnzjTnnnuuLTNw4EC70nXHHXeYLl26BJW75ZZb7Pn4nHLKKaZjx47mwQcfNNu2bQuUOeOMM6wlxnfffRcoG+rSEW+9/MQ6bjx1g4suusgMHjzY3qfbbrvNnH766eb+++8PrPThh8y5+IwaNcocOnQoon/yxx9/bF0puE9nnnmmefTRR+29gAULFgTqx3ZXN/6OxxXmiiuusG3TrVs389xzz5kDBw4E9lMn7jf3rEWLFqZ79+5mzJgxdrsDs2HOhxnxkiVLzKWXXmqvo0+fPuaXX35Jc84vvvjCnpP24L7TJviOx3Mt/nNR9rLLLjPNmze3zy00a9Ys8Bvqe+GFF5px48bF9FOP9xriaeto1+fgmeR3O3bsiHp//PX64YcfTM+ePe0z0Ldv37BtG8/9SqRcLHbu3Gnb/6GHHkqzz/M82zfoA4m0TSIuA0888USaPhRvXIJ46xKrj4Qj3vaNtw7R+n+i7RFKPM90PP0qVt/866+/rMx37cg1YTnAb77++uugYyEfX3jhBVuO85133nn2nefgHjhZStu6urlzCSFEluAJIUQScujQIe+EE07wrrjiCvt948aNXsGCBb2nnnoqTdlffvnFO/roo73GjRt7EyZM8N577z2vW7du3qBBgzzE3Ndff52usvfdd5/dduutt9r9H330kXfdddfZfbNnz/aKFSvmdejQwZs0aZL3wQcfeOedd55XokQJ78cffwwc4/nnn7fHuPrqq72PP/7Ye+2117y2bdt6Xbp08Y499tig6/j111+9efPm2c9XX33lvfzyy7YNTj75ZG///v22zE8//eTVrl3bbnNlFyxYEDhGvPUKJdZx46kb1K1b1zvzzDPth2ufMWOGN2LECHs/zznnHO+II47wnnjiCVvPu+++2xs8eLBXqFAhb+DAgUH1ue2227z8+fN7N954o223sWPHetWrV/dOOeUUb/fu3d727dvtsWnbm266KVC31atXR32ubr75Zi9v3rz2Ps6cOdObNm2aN2DAAG/IkCGBMj169LDP2gMPPGDr+dBDD9k6nn/++fY6YOXKlfbc1L9Tp07e5MmTvenTp3v16tXzKlSo4O3cuTNwPOrJObmWTz75xN4Trr1NmzZ2f6xrceeizrTru+++67300kv2eYT58+cHfsPx7733Xq9w4cL2f8emTZvsMR5//PHAtnivIVb9Yl2fo2vXrvYY//77b9R75OrFfeF6qRef5s2beyVLlvQWL14cVD6e+xVvuXDtFA5kRpkyZbx9+/YFbZ8zZ479/ZtvvplQ28QDdURu0L9Hjhxpr+HOO++0sim0D4W7jnjrEquPRGqjeNo33jrE6v+Jtkco8ciPePpVtL75559/ehUrVrRy9Z133vHef/9920ZDhw61v+G7g77W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ySfZXY2UR8oDIYQQQgghhBBZxjXXXGM++OCDuMvPmzfPbNy4MVPrJGIj5YEQQgghhBBCiCzj6quvNg0bNsyw41111VXm448/zrDjifBIeSCEEEIIIYQQIss46aSTTPny5TPsePPnzzcbNmzIsOOJ8Eh5IOLizDPPNKeffrrp0KGDueGGG8yaNWuC9mNGNGjQINOlSxdz1113mSlTplgNoGPfvn3m8ccfN+eff765+OKLzeTJk9XyQuRQli5dauUBH/r8fffdZ3bv3h1U5vvvv7f+ifT5559/3jz66KPm6aefDpIZt956q+ncubNdfVi4cGE2XIkQIiN4++23rTxo06aN6dGjh3nttdfSlBk/fry54IILzGWXXWZmzZplevXqZb788svA/h9++MH079/fdOrUydx8883m77//1s0RIon48MMP7fva8frrr9s+v2XLFvt95cqV5qyzzjKHDh0KlHn33Xdtn+/WrZsZOXKkOXDgQES3BfY99NBDdlwxYMAA880331i5smPHjkCZXbt2mXvuuceOHZAXbj5y9913m19++cU88MAD9jfXX399prdHqiLlgYiLO++803bWwYMHmzx58piTTz7Z7Ny5M6AYaNmypfnzzz9N3759Tf78+a2gQAMInueZ9u3bm5kzZ9rBQseOHc3AgQPNiy++qNYXIgdSqVIlKw/4XHnlleaLL74wF154YWD/zz//bE477TRbDlnAfvdih/Xr15t69erZAUG/fv3MCSecYE499VSzZMmSbLwqIUR6adWqlZUH9HMm/wzgH3vsscD+V155xVx77bXmjDPOMF27drVjiokTJwYUBEwg2rVrZ4477jhbbuvWraZZs2Zmz549uilCJAnVqlUzr776qtm+fbv9/uabb5qffvrJzJkzx35///337Zwgb97/ppcsJt5yyy1WwcBiwtSpU+2YwL/IwHjA0adPH/POO++Y3r17m8aNG5uLLrrIfPbZZ0EKBxYdjjjiCDt2YN7RvXt3u50xCFYM5557rpVFHEtkEp4Q6aBVq1beW2+9Zf/m/ypVqnj79+8P7L/qqqu8Bg0a2L+nTJniVahQwdu9e3dg/7Rp07zjjz9ebS9ELmDnzp1eoUKFvHXr1tnvffv29S6++OLA/oMHD3o1atTwBg4caL8PGjTI6969e9AxhgwZ4vXp0yeLay6EyAxmzZrlVa9e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akLPnj0D3yPV4+WXXw7cC66Z9vj111+Drq1t27Ze9erVvZNOOsl7+umnvU8//dRqGblH3Cu0+9xzt6r0888/23agjbmfnNNpJO+88077vKB15Jz9+/ePeA3Tp0/3Tj75ZG/VqlURtb2sBMS7OhvreC+99JJd3RLJBavayIyzzz7b9jGeOValpkyZ4p1wwgn2WStSpIj38MMPB/1u9OjRVntNf+bZ79ixo7dt27bAfrTc/I79VapU8c4666yA5QEafladHMgi10/Qih9xxBH2eQmtI32OfsFKK8//ihUr4rpGnkWeyZ07dwa06pwnT548gfPOnDkz7npceOGFtm24Jq6ZlWBkCf2R9uKanZUD2vkbbrjByi32IWuGDBli933zzTfe8ccf7xUvXjxw3tWrV4e9R/TrJUuW2GvZvXt31Os9dOiQPR+yOB649717907z7sHagXOL5IUxAX3JvU/de4UP739WinkeHJHeEchmnmv6Ku9EnvPHH3884nkpT3+m7/PcU/7ZZ58N7I/2nnK/v+CCC6y8wZKSfePHj/eOPvpo+z6kHowr6D8wceJEu+rF73iX8ps///wz0Ab07z59+ljZwOo1/ZH+BbyP2X/KKafYax4zZkwaS4NwlgfRzhkL3tccb/ny5YFt4eoBru83btzY3psHHngg6P7ym8suu8y2CeWQOT169AiMp7iXrVq1CrJyiDRGizRODIUxJ79DZjLW5Hf+5ygctHu0Z8bP1Vdfbcc+ofC8xCu3RNbB/IH3HP2AZ6pgwYLeQw89ZPsc70L6HeMGf/9Zu3atd/rpp3vlypWz71PGtfQpB++yY4891lqr8uEd5B87Yi143333BcpzPp7XFi1a2GNiMee34qGOXbp0se9UN27xW7bEAnl20003BVnoYYlAHTnv+eefH3c9sASkvzImRq5x3YwnkCXITMYy9HUHsop2pO70I/6n37m+kj9/fitHOS9WnOHg+FOnTg18f++996xF0KEI/fb666+P27qQOSfjJayR/Nxzzz32epOdlFMeIETpAOvWrbPf/YNbHjD2+TtXJLcFOuS0adPs93379nlNmzb1HnzwwYjnpLwbCGDugtBACQB0BEwimSS6gTjKBWfy6n7/1ltvBY6JUDj11FO9LVu2BK7DPeQIH0yDdu3aZb8vXrzYDqaXLl1qvzMIooPyEgUG10xof/jh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sPn444/Ntm3bzBNPPBHxeOn5jRBCCCGEECL38Pbbb1vlAf+zWLl27Vo7J+jdu3egzB9//GG6dOliLr30Ulvm888/N2PGjDHDhw/P1roLkQokrDygM//www/mwQcfDLsfBcB5551n8uf/zyOiWLFipnPnzmb69OkRj5me3wghhBBCCCFyDz///LOpUqWKadeunf1+9NFHm65du5ply5YFyuDmjLXBXXfdZQoUKGAXM/v372+efvpp43leNtZeiNxPQsqDX375xQwaNMi89dZbplChQmn279mzx7ogVK1aNWg733/99dewx0zPb2Dv3r1WE+n/AEJDH7WBngG9PIUQQgiRs8AtevPmzWb06NHW6uCbb74xr776alB8Nba1bNnS5MmTJ7CtdevWZv369TZ2mhAiCQIm7tu3z3boO++809SrVy9smd27dwcsB/wceeSRgX0Z8RvANGnYsGFptm/fvt3ky5cvjisSIvdCPxBCCCGEyEnUrVvXjBo1ylx99dU2jgFzgW7dupmbbropUGbTpk3m+OOPD/pdmTJlAvtCFyTdoiMfR+iioxCpjJdAH4hbefDhhx+aRYsWme+//95cfvnldtuCBQvsRJ3vI0aMsNkRiHa6ZcuWoN+iQYyUOeGII45I+Ddw2223WaHiFwKVK1e2SgdlaRCpzsGDB7O7CkIIIYQQCTF27FirOJg2bZo544wzrDKgR48e1p2ZIImAxUHoOOfAgQP2/0hZF7ToKETGLDrGrTxo0KCBef7554O2/fTTT9bX6PTTTzeFCxe2f9esWdMsWbIkqNzixYsjWiuk5zeA20Q41wkEit+MSYhURH1ACCGEEDmNV155xXTq1MkqDpxFAVbPxEDAnblatWrmmGOOsSne/bjvFSpUCHtcLToKkTGLjnErDwhe4iwOHBMnTrRKA//2nj17mmeffdZ2UtKsrFy50sycOdOaIDmmTJli0zxSLt7fCCGEEEIIIXIvpGbctWtX0DYyKvhdnE877TQbuB2X6oIFC9ptzCtwZUCxEA4tOgqRMYuO6UrVGI0bb7zR+is1atTIRkdt3ry51SD6FQxYLJC1IZHfCCGEEEIIIXIvvXr1Mu+//7555plnbPDDL7/80tx6662mTZs2pnz58rbMlVdeaZUBV111lVm+fLl1dcA6+o477sju6guR64nb8iAcgwcPThOcsEiRIubjjz82c+fOtXlYSaPSpEmToDIEPqlRo0ZCvxFCCCGEEELkXi688EJz6NAh89xzz5mHH37YlCxZ0nTo0MG6LjhKly5t5syZY26++WbrznDUUUdZa+U+ffpka92FSAUOS3ngcrCGM30ghQqfcDRs2NB+EvmNEEIIIYQQIndDdjc+0ahdu7aZPn16ltVJCJFJbgtCCCGEEEIIIYTIXUh5IIQQQgghhBBCiKhIeSCEEEIIIYQQQoioSHkghBBCCCGEEEKIzAuYKIQQQghxuOzYscNMmDDBrFixwtSrV88GSwvN5vTVV1+ZDz74wOTPn9906dLFpncWQgghRNYhywMhhBBCZBvLli0zderUMS+//LIpXry4+fzzz0337t2DyowYMcKceeaZVsmwfv1606xZM/P6669nW52FEEKIVESWB0IIIYTIFjzPMz169LDpm6dOnWrTNsOvv/4aKIOy4I477jDPP/+8ufzyy+22ihUrmoEDB5oLLrjAFClSRHdPCCGEyAJkeSCEEEKIbOHLL780CxcuNHfddVdAcQDVqlUL/P3+++/b/y+88MLAtt69e5stW7aYTz/9NItrLIQQQqQusjwQQgghRLYwf/58azlQpUoV65qwdetWc+KJJ5pzzz03EPOAOAjly5c3RYsWDfyO8gUKFDArV640HTt2THPcvXv32o9j27ZtAUsHPkKkMuoDQoj0IuWBEEIIIbIFlAUoAdq2bWtjGpQoUcLcfPPNZtSoUeaTTz6x+3bt2mWOPPLINL9lG/vCMXz4cDNs2LA027dv354mEKMQqQb9QAgh0oOUB0IIIYTIFlAAYBVw5513mp49e9ptV155pTnuuOPMxIkT7TbK4KIQunKK4iGcUgFuu+02M2TIkMB3zlG5cmVbHgWFEKnMwYMHs7sKQogcipQHQogs5bLLLrMp1/y0b9/ePPfcc0HbXnzxRTNmzBg7QWjRooW57777TNmyZXW3hMhF1K1b1/5/0kknBbYxyaev//bbb/Y7mRg2bNhgFQglS5a023BXYALEvnAUKlTIfkIhroI/toIQqYj6gBAivShgohAiS1m3bp0544wzbL5297n77ruDyjz55JNm8ODBpl+/fmb06NFm+fLlVsFw4MAB3S0hchFt2rSx8QxmzZoV2LZ48WKbYaFBgwb2OzENChcubF566aVAmWeffdYcc8wxplWrVtlS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QvxfXxCSCULkBHlA/V577TVrpRwuODpWyi1btrQZ1nBZWLx4sc28EC6FezznkruzSHUOJSATpDwQQuRa5MYkxH/IlUkyQYicIg+YzI8ePdqcdNJJYfd37drVpnIn+PqePXtshgWsFNKDxglCmIRkgpQHQohci9yYhPi/viAkE4TICfKAdO0EQIwGqRsJ4H64aJwghElIJuRVgwkhhBBCCCGEECIaUh4IIYQQQgghhBAiKlIeCCGEEEIIIYQQIipSHgghhBBCCCGEECIqUh4IIYQQQgghhBAiKlIeCCGEEEIIIYQQIipSHgghhBBCCCGEECIqUh4IIYQQQgghhBAiKlIeCCGEEEIIIYQQIipSHgghhBBCCCGEECIqUh4IIYQQQgghhBAiKlIeCCGEEEIIIYQQIipSHgghhBBCCCGEECIqUh4IIYQQQgghhBAiKvmj7xZCCCGEyDzefvttc+jQoaBtTZo0MbVq1UqojBBCCCEyFykPhBBCCJFt9O7d27Ru3dpUqFAhsK1MmTJBioF4ygghhBAic5HyQAghhBDZyk033WTOOuuswy4jhBBCiMxDygMhhBBCZCs//fST2bFjhznuuONMw4YNTb58+dJVRgghhBCZh5QHQgghhMg28uTJY8aNG2eqVKlivv32W+uaMGHCBHPCCSckVMbP3r177cexbds2+z9xE0JjJwiRaqgPCCGyVHmwfft2888//5iKFSuaAgUKBO3btGmT2bBhQ9A2Vgdq164d87isKPz111+mUqVKpkiRIumpmhBCCCFyEDNnzjTt27cPjANwTbj00kvN119/nVAZP8OHDzfDhg1Ls50xyp49ezLtWoTICTCOF0KI9JDH8zwv3sLz5883t9xyi1mwYIEpVqyYVSDccMMN5oEHHrCrAnD//febBx980Bx//PGB3xUvXtzMnTs36rE57pNPPmmOOuoo8++//9qXPv6N8cKqQokSJczWrVvt+YRIZVK9P6T69QuRk/vE1KlTTbdu3czff/9txwTpKRPO8qBy5cp2fJHs1y9EZkN/KFWqVI6QB5lFTpKJQiRTf0jI8uCHH36wioFTTjnFfkchcPrpp5u6deuaXr16BcqdeOKJ5ptvvon7uK+88op55plnzFdffWVOOukk89FHH5mzzz7b1KtXz3Ts2DGRKgohhBAiB8PiBERTHsQqU6hQIfsJJW/e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q9q//vpr0H4GpfRV+jafm266yWzdutXu27Jli30uf//9d2stw988s7Bp06ZAXz/ttNOsfEBOhLpNfPrpp7Y/oHj44IMPAhNkVin4LZY4L774ol3NzE28+eabgX6NMrZfv35m7dq1gf1PPfWU3YZliCt3zTXX2EHBE088Edi2ffv2gHvDOeecY9usV69edrDmB9mNPLj11lvtveY+ChEO3GN4XniWUAoyQQ21iLn22mvtfsYKPKuY0wNjCt450KlTJ/uMuoHsggULTM+ePe27jn49efLksG4T77//vjnrrLOsy8M///xj9/HuO/fcc+077/zzzzefffZZrrt5AwcOtO2FWTeuSvfee2+QW2jv3r2t5eeXX35py/EdmQz0ebbRNoDcQOYypmJsxbH9YzInuz/66CNzySWXmMaNG9uxnRCh0Lcff/xxc+aZZ9p31dNPP52mzNy5c82FF15o+yeyw73L3XiU9w1jAp65k08+ObAPGYAsQCYgG0LfW7hNMBZ+8skn7bPepUsXu53xAO8z5hXNmjWz44XcuNBGe9NmyELkKfMzx8GDB+0+2oz7w9+835mX7fONGx5++OGAUpcxGe9/2g35sH///sDxkN2cD9nKWIJzMrbLsXgiQ6hYsaJXoEAB77bbbvO++uor76677rLf582bFyhz++23ezVr1vTGjx/vffvtt97dd9/tHXHEEd6qVavs/pUrV3pdu3b1OnXq5C1atMhbvXq13X7ttdd6lSpV8iZOnOjNnj3bO/XUU7369et7Bw4cCDp/kSJFvPvvv9+ec926dd7u3bu9xo0be+eee673ySefeJ999pl31lln2d8fOnQo19x5rpP24sO1Dx8+3CtYsKD9Djt27PDmzp3L7Mh755137Hba/PLLL/datmwZ+O22bdu8L774witZsqT32GOP2Xv01ltveWXLlvVeeumlwPkGDBhg72337t1tmy5btiwbr14kI/RlnrfSpUvbZ+fzzz+3/ZB+yvMI9N/TTjvN69ixo/fxxx/bZ48yDRs29Pbv32/381wec8wx3rBhw+zff//9t91O/2/durWVBxMmTLBlkBOh52f766+/7i1YsMDbsmWLt2LFClsn5NPXX3/tTZkyxTvhhBO8O++808tN0E6uX9Oul156qVe1alUrK2DDhg3ek08+aWWmK4dMqFu3rjdo0KDAtoMHD3qPPPKI/S2yAJnw0EMP2d8tWbIkcD5+h8y54447vO+++85bs2ZNNl69SEZefPFFL3/+/F6tWrW8GTNmeO+//75Xp04d+8538NyUK1fOGzp0qB1HvPfee169evW86667zu7funWr9+GHH9q+PXPmTPuM8kz//vvvXrFixbz+/ft7X375pTdy5Ej7PDLWCD1/kyZN7Ln5LXKGd2KZMmW8F154wT7fzz33nB2XIJNyE4ynXL+m7U4++WSvR48egf2//fabd8kll1iZTBm+M56gren7bPvll1/s2Omcc86x8veDDz6w9wn5Ur169YB82bRpk/0d7Uq7//TTT97mzZuz8epFMtKrVy/bJ5EBjCVfffVVr3jx4t7jjz8eKMOzyjv7qaeesv3zlVde8UqVKmXnA/Dnn3/acT9yg2d06dKldvu4ceO8QoUK2WMhE6655horI5AV/vMzluV/3pOMD4CxxIknnuhNnjzZ++abb7wbb7zR1oH3Zm6CtqLN6J9vvPGGbUPkn4N9zNmQx26M8MwzzwTmF3z++usv29+rVKni9evXz7YjMrpp06ZWnjgYp+XNm9eO3aZPn25/u3fvXi+nIuVBBsGkgEm/HyaX3bp1s38zmUdILFy4MKgMLyE6puOyyy6zHdn/wsuXL599STl4UBm88kLzn5/f+nn++eftC82vZNi+fbsVKAiT3MxFF11kJwGOf//9177M/cocBEKHDh2Cfte8eXPv3nvvDdrGy58Jll95gEJhz549mXoNIufiJu8jRowIbON5KV++vPfEE08EXu4VKlQIeoHwNy9pJg2OY4891j6DDvp90aJFvX/++SewjckIcuKPP/4IOj+DET89e/b0+vTpE7SNSULhwoWD5ERuAyUAihSUJQ4GRgym/Jx00klW+ehA4YKsRfnjBxl91VVXBSkP/JNAIUKhD9Mn58+fH9iGUo9tDF6ByT8KRD+8sxh0otwGBv/8hj7u6Nu3r9esWbOg39100032/R96fibFDibCjB1QMPpBCXbGGWfk6puI0p/2oI87Bg4caMdk/vESZVC0OpgYMMFzSmBAdjJ5ePPNN4OUB/5JoBCh8B45+uijA0onQKnNNvc+rl27tjdq1Kig3z366KNWCejgPU8/9kPfv/XWW4O2MaFFVvjPf/zxxwe9+5cvX27ljVu8dLDQhpIiNzN69Gi7eOOnQYMGtr0d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O+00K1MaN26cIeXD9T2/KX5WtUUs1qxZY77//vuoZahrixYtzMknn2wVJ8jf5s2b2wlXiRIl0pRHntA206dPD2zz349Y+wE5hTLwkUceOcwrFMnM6tWrbRaizJYHRYsWNXnzRl4jIgvSrbfeav9mMsxYKRqbN2+2fYAVcfoE/ZsJ7sKFC63yKxZ//vmn+fzzz4PcmLKiLeKBa4i1wv/dd9+Z008/3aav7Nixo+2nKBOwpogG720U/7/99pvZuHFj0AIC4wAUtA7SW/tBoUgK3WRQugohhMXLpRx77LHec889F/g+a9Ysj8v9448/7PdatWp5b7zxRmD/999/73Xs2NH766+/Atvuvfde74477ojrfHv27PEmTpzode3a1StcuLB3xhlneIsWLcrQa3r00Ue9unXrpjlv8eLFvddffz2w7ZlnnvHKlSvnHTx4MOZ+x9VXX+317ds34rlD2wtor48//ti78cYbvc6dO3t33nmnt3v3bu+9997zLrzwQq9Hjx7ep59+GvSb3r17e+3atfM6dOjgXXvttd6yZcsSvgex6hqr7tdcc42XL18+r2nTprYujzzySMy6uev98ssvvZtvvtnr1KmT98svv3irVq3yrrvuOu+8886z94fz+Ou7c+dOb/jw4XZ/nz59vM8++8xu37dvn9esWTP7THJOPtOnT496HRzjyiuvDLvvxBNP9F5++eW420Skj6VLl9p7z7Pav39/79xzz/U2bdoUuIeuH2zZssWW37Fjh3fyySd7efPmDZT58MMP7b7t27d7999/vz3GVVdd5X311VdRz02/4NlDxlx//fWB59OdP0+ePN4pp5xi/2ZbKF9//bUtwzPruOCCC7zzzz8/7PkSLR/K+vXr7fO9Zs2aqG0Rrf0itTkgW+izvXr18iZMmODdeuut3vjx4wO/W716tZVNtNfAgQMD1zFv3jyvZs2aXsmSJQPnde8FP48//rhXuXJl78CBA/Y78rJq1areiBEjIrZXsWLFIrZHrP2wefNm22a//vprjNYVycLYsWOtzOf9z/P4v//9z4433LPFu/DZZ58NvG/p59WrV/eOOuqoQBn6CnDfhwwZYp/ZwYMHB/pOJHiW+/Xr53Xr1s2e1/Ubzt+kSRMvf/789vjUKxY8m/SjaPAuO+GEE7xDhw7Z7/SNChUqeE8//XRcbfXOO+941apVC3yP1BbR2i9SmwPvQOQT73g3nli+fHngd59//nmgve677z77foaXXnrJK1u2rHfcccfZcyLnwsF9ufjiiwPfuV/01/nz50e85v3799t78dFHH3mFChXyJk+eHNSe55xzTtQ2mzRpkpVDQgiRLORay4NQnBkvmnO07b///nuQaS8raRUqVLCr/FgosLKNKXgsjTgrSW+88YYZP368XRVnBRizM47lB3PicKvGDsz22rVrl/B1sQrGChmWCQ7+HjBggA1IhHl/tP3EEICKFSvaFYFIhLYXsILINVH3pk2bWr9KLDvKlStnV88WLVpktfOc55hjjrG/ueaaa6wp9P79+611CKt6y5cvN+XLl4/7HsSqa6y6s2IyZswYa7lQu3btuOrmrpdrYhUW88KCBQuaJk2a2BUb7jv7sXBhZQL27t1rj0Ebsx/zTlxH3nzzTXsPaCNWLdzKD3VJL7QJqxoic2H1eObMmWb9+vVm0KBB9rli9djdQ1aRuL88H6xSFSpUyJq48gy7MnXr1rXPGXEJGjZsaJ8NVsKxIGFFLlx8ACyFKMtxOR7mxfSX+fPnW59mjo01Dc82ljnhLBCQVTVr1jTHHntsYBvPYaRAoomWD4XnEWsf178itUW09uP34docVyTMpm+//XZbxxdffNG2ybBhwwIuAqyQ0qf79Oljvv76a9veBJA77rjjbAA5ZIg771FHHRX2+pHJxFoBVnD5zvZILg9YduEmxwom57vuuuuC7kWs/aVKlTJFihSxbcd9FckPq8e8p3imeL65b2XLlg08W6w0s0KNGwHuk1iH0cd/+OGHQBksWVj5xrKHdzPPLM8zzwjv2HDP56effmpXo3Fr5NyvvPKKOeWUU8yCBQtsv+rVq5ftB5wDC4SMgGefvums+Ogbbdu2tdupdyx4rv3v4khtQf0jtV+kNie2yujRo62FXoECBex22o7xDzBOo98iMwgqi4sC8ox2xpICOcIYrnfv3lZWRbp+VwfgvMhbtkeKM0O9sEKlruFgTNGlSxdTsmRJK18Yl/itRXi3835gXMJ1CSFEtuOliOXBsGHDrGad1S+05ayosRLkZ9euXV79+vXtCjGrUrFWgtEYs4I9aNAguzoWje+++86u0kf6+FfbE7E8eP/9963m262OAasPbGOVPNZ+B6vvLVq0CHveSO2FFt1v0fDYY495pUuXttYHjtq1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9v9kM8/NKtx1M0lItomCENmJZELyyYQdO3ZYBYCrFyvB//zzT9h6MuFDscDkD+XCHXfcYT799FPTqFGjQBnGQdznSNf59ttvm6uvvjrp2kFkPakqD4QQ6SfXKA+EEEIIIXIapUuXNps2bQp837Jlizn66KPDli1ZsqS5//77A99vv/12G0DxlVdeietcq1atMt99952ZMmVKBtRcCCFEqqEoKUIIIYQQ2cRJJ51kPvnkExs4EWbNmmW3xUP+/Plt8Lt4efnll82FF15oihUrlu76CiGESF1keSCEEEIIkU107NjRuh+cddZZpmbNmmbMmDFmzpw5gfg1zzzzjLnzzjvt97lz5wYUDStWrDDTp0+3ygbHI488YgPG7ty501oo1K5d25x33nl238GDB81rr71mJkyYkE1XKoQQIqcjywMhhBBCiGyCNItffPGF6d69u6lQoYIN/OwsD7Aq2LNnT6AsCgC+HzhwwLRq1cr8/PPPpmnTpoH9e/futbEMBg4caMu5+DewYcMG079/f9OsWbMsvkIhhBC5hVyTqpHgQSVKlDCLFi2y/oMi9XjjjTfMRx99ZO//DTfcYPNlh4MVmeeee84sWLDADtQYZFWsWDHmPnJkE6GaZ+z44483/fr1M+XLlzfJyObNm039+vVtnVMxKJaTB6l6/UKEkup9ItWvXwg/6g9CiPQiywORKxg/frx5+umnrS8nE/qePXsGrbj4GTRokFm4cKG5/PLLbVCqSy65JOAzGm3fVVddZQoUKGB69+5tJ+ecK5fo3oQQQgghhBAiKop5IHIFb775po063blzZ/v56quvrB8ovqR+mOzPnj3bmohiUdCuXTub6/rLL7+0JqCR9p166qnWV9QFmTrttNOsZQPptCJFxRZCCCGEEEKI3IIsD0Su4NdffzV169YNfOfv3377LWxO41KlSplly5bZ71gQrF+/3v4+2j7wR6fGJ/XYY4+V4kAIIYQQQgiREsjyQOQKdu/ebYoUKRL4zt/ELwjHPffcY6677jobt2DHjh2matWq9vex9jmIcI2Vw+jRozP5qoQQQogY4D6XJ4+aSQghRKYj5YHIFZQtW9ZGknbBDfn7lFNOCVsWtwbcDrBMwPWANFZVqlSJuQ+WLFlirr76avPUU0/ZgIRCCCFElisL1s43Zt6LxiybYcy+ncYULGZMrXOMadrXmEpN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tQOnvXZamh9aX9tNmDAhuN/HHnvM9xhef/314LrPPvus77ovvvhicF397reu9uWtq7/ht66OccGCBRleJugcV69e/ajlhQsXDgwZMiTiNvv27Qs0atTIvV+ZM2eOO86FCxemWu+qq64KzJ49O7BmzZrAm2++GShWrFigf//+UY+FMoEygTIhepmga4d7ZgCxIPMAwHEJb/nTc7/W4GHDhgV/V/9mpSsrW+Grr76yc889N83rhBo8eLBvunM4Hd+2bdvStK5awUPX9WvFD9+vX8t8+H79Wtu1n9B1/c6vji+t+5W07jd83WO1XGldbx2/VnFRBovX4q6WZT9qmfaO41j7VT95b91I+81VIH2t1t766tPv7Vct2X5C1z3WwIF6PZZ19Tf86Bj9WvTjKVImgJZFu2769+9vFSpUcGOc+Hn33XeDv1977bW2YcMG69evnz3yyCMuYyMcZcJ/USb8F2WCpamcBYBoUhRBsASgm0+lS+pmKr2pzUCiyYzrQf2bmzVr5rov1KtXL7i8efPmVrNmTRszZkya9qOKsW7+NXL6zTffHNM6uhEKvRnS+9dI799//72VKFHiqPXptvBfydxtofPszrb38N6o2x+1v1wF7J2m7+TIbgsKHmgmg4wsE5588kkbMmSIbdq0KbhM/0/9H1577bWIXZkaNmxoy5YtC55PfaYU7NBn4rrrrrMXX3wx4t9SFwcFErVtjRo1jnqdMiE1ujIdQZnw3yCKAvLcMwNILzIPAMREFRHdkCobwAseqIIyb9483/EOwq1YscJVFk866aSY11FlLtLI6zq+QoUKHfMY0rJOLOuG3rDnhHVDx1WI57rpGewyPetG+7+ndd2zTjrLTccYPstCJLlTcttZZc466v+vCn+klu9I0rNuaHAgHut6wZmMpGCipmpcvHixGzBRNICiNG3aNOI2s2bNShUs+umnn6xFixYuOKAyJpqlS5e691SqVKmIr1MmREeZEP0zkixlApkHAGLFbAsAYqIbUGUBqLVRlQUFDu655x43H3unTp2C67Vq1Sr4XK2Effr0sZUrV7oWRlUArr/+ejdTgwZFTOs6QDy0q9QuTZUE0XqXVbqME+/jnHPOca2ZKgc0PePq1avdbCy6bpWN5NFMCcoi8oJQoTMoeEEp/fQqdprmURkI6qqgLAtNA6kBVFWuaJBWIF4oEwDAH8ED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7Nixw/2sVKlSVh8KkK2ui2LFilmyoTwAol8blAkAkrk8ABC7lECCNE0ePnzY1qxZY0WKFLGUlBRLlJYiBUNWrVplRYsWzerDSUiJeo51WeumoHz58pYrV/L1TkrE8iCRP6/ZSaKeY8oEygTEJhHLhGQvDwDELmEyD1T4VaxY0RKRvqwS5Qsru0rEc5zMrQmJXB4k6uc1u0nEc0yZQJmA2CVamZDM5QGA2BFuBAAAAAAAvggeAAAAAAAAXwQPsrH8+fPbww8/7H6CcwxQJlDuAtwncC8GAFklYQZMBAAAAAAAGYPMAwAAAAAA4IvgAQAAAAAA8EXwIE4+/PBDW7lyZVz29ffff9vHH39s48aNs4MHD8Zlnzhi7ty59u6779qcOXM4JcgwO3fudNfvrl274rK/5cuX26RJk+yzzz6Ly/5wxP79++2LL76w8ePH2x9//MFpQYb597//bZMnT47b/r7//nv3Xfbzzz/HbZ8w27Rpk33yySeu/N6zZw+nBADCEDyIk9tuu82+/PLL496PbgSqV69uzz//vL3//vt26NChuBwfzG6//XZr3769u+H66aef3LmOx/8MCLdu3Trr1KmTbdiw4bhPzqhRo6xJkyb21ltv8XmNowMHDrjzes8997jAzKpVq1xw5pdffonnnwGczz//3Hr16hWXs9GlSxfr2LGjTZw40RYvXswZjpNff/3VTj31VHv22Wfd/deOHTtcEEEBBQDAEXn+8xPZxNtvv21nn322yzxA/Bw+fNhGjx7tWn4uuugit6xv3762aNEia9myJaca2dbLL79sAwYMsHvvvTerDyWh/PDDD7Zw4UJXQShYsKBb9o9//MOuuuoqq127dlYfHhCRspneeecd9/k944wzOEtxpAykOnXq2LRp04IZZAoCz5o1y0488UTONQAQPMiYFke1aBcqVMjOOussy5Ur11GtXbNnz7atW7darVq1XJaBZ+rUqS6dXtkGinZXqFDBzjnnnOCX2Lfffmt79+61M88808qVK3dUt4l69epZvnz57Mcff3Tb6kZYNm/e7FIc8+TJY6effrqVKlUqoT78Opc6d95Udmo50LnwrF+/3gVj9u3b586vWhF0fpYtW+b+XzrXonOt5bJkyRKXKq7nOmc6d5558+bZ7t273XLdVOj3yy67LNPfN3IGfc70WapSpYqddtppR72+bds2VyZIw4YNrUyZMsGU+v/7v/9z6fRqEdPnVJ+5mjVrutfXrl3rKhCq+DZv3twKFy4c3KfKi48++sjatWvn0qX191XRqFy5sntdXawWLFjgyoJGjRoFK8+JQu9X16kULVrUnXfvvYuCBso20HX9wQcfuGVly5a1LVu2uPPilQlXXnml5c2b15XJOtfqUlajRo2jggsqf6pWrWrFihVz6+m8NmvWLFPfM3IGdUWcP3++/fXXXxG/y0VZMPr8lixZ0l2fup8QbaMWcfnuu+/st99+s0suucRKlCjhlikLQZ/9k046yZo2bWq5c+cO7lPlgF5v1aqVK29Ufqh8KFCggHtdf+/PP/+0U045xRo0aGApKSmWSL755ht3/vS+dH5U1nrnTWbMmOHusdRVQdd/6dKlbc2aNe616dOn2++//+7W1/n2ylh9/+v/qfNVvnz54L68svvSSy919xi6n9A61apVy4J3DgDxReZBHCmt+MEHH7T69eu7vvW6yddN5QknnOBe1xe3KplFihRxN7L6Am/Tpo29+uqr7gtNX16qKGj2TN0g6KZBFdqvvvrKOnToYJUqVXJfXtpu8ODBdtddd6XqNqEb2hUrVrgvRd0UKHigfffu3dsaN27sbiR0Y6suEddee60lClW+vBsqBVd0fnQOFFBRMEWp414mh7opqHKgwI7OVei2CjroZq1z584u2KLzp5szVTCUseBVPnROZ86c6W4atEyVBoIHiETXpSr+Chx8/fXXduutt9rQoUODr0+YMMF69uzpbix1E6/P7pNPPmm33HKLC3bps6mWRnWz0WdVAQKVK88995zLRlAFQRVeVTZUGfaCjV63ibZt27q/r2Cabm4rVqzouu+o6462VWBt48aNbltdM4lC1613XSu4qIpDnz59bODAgW6ZuiboGldQwFtP/wOdS5XTylQSXdc6typPRTf/Cs6q/Bg7dmwwqKgsJlVIVEHTfi644AKCBziKKpz67Oi7WA0Luk948803XbaL57777rNXXnkleG2rQq/rVQHC1atX26effurWU+u4ygMFIBS00veW7jcUtNJnWPcKWldBMa/bxP333+8aLPT3VRZcfPHF7pguv/xyV1FWkE3ZePpeU1BN+00Uut69sY50Tesc6dx717bKZ5UbOh8qE9S4o0CMd9+g86LAioIHU6ZMseuuu87dc+l+ToGcBx54IJgdtn37dlf+6v5O+1CZoCAmwQMACSGAuKhQoUKgfPnygXXr1rnnf//9d6BixYqBJ554wj0/ePBgoEaNGoHBgwcHt9m0aVOgcuXKgTFjxgSXdevWLdClS5fg83379gWqVq0auOOOO4LLxo0bF8iTJ09g6dKlqf5+zZo1A1u3bg0u++mnnwKFCxcOzJs3L7hs+vTpgRNOOCGwevXqhP3P79y5M1C7du3A888/H1y2ZcuWgD7uc+bMCS7r06dP4JJLLkm1be/evQMtW7YM7Nmzxz0/fPhwoGvXroH27dsH17n99tsDKSkpgW+//TZT3g9ynhUrVrjPmz5fBw4ccMu+++4797nRT2+dQoUKBb7++uvgdrNnzw4UKFAgsHz58uCyk08+OfDyyy8Hn+u61/U/ceLE4LJbb701UK1aNVdehP79Tp06BQ4dOhRcb/jw4YFatWq568Hz4IMPBho0aBBIZEuWLHHndeHChcFlkyZNcuc/VOPGjVOV0d6y+++/P/h8x44d7hwOGzYsuKxu3bquvN+wYUOGvg/kXLqGdU0OGjQouEyftVKlSgW2b9/unr/xxhvunsC7j5BnnnkmUKVKleB1vHLlSrcfXeOeV155JVC0aNHAb7/9FvwO1OdW313hf3/kyJGpjqtDhw7unkP3KLJ///7AeeedF7jrrrsCiWz06NGBsmXLBt+36D23adMm1bWuczZr1qzgsjVr1rj7qilTpgSXLVq0KFCwYMHgvZbKAW3Xtm3bYPkPAImCzIM4UiTaSzlWytuNN97oWhb79+/v0uEUgVbrnwY5UnaBHopEa7Tv66+/PuI+FSlXa5ZaGT3//Oc/XYbDe++9l2q5/n5oS8Ebb7zhIuWKpqv1UX9P1OqgKPwVV1xhiUIthUq7VIuCWmyVpaEsC7WyppXOz2uvveZacJTy7f2PlFbqpTZ7lJWgliDAjwbj81qn1SKozACVCfpd/ZbVWq0sAbUsetenrmG1lId2aQql8kPZLkqp96jVa+TIka5VPPRzeccdd6TqOjVmzBjXCqY0XO/zrb+nNGq1coam8eZ0akFUxobOrzIM1JVA5WmkriPRKEtJrcM33XRTqnJbWUoqt+++++7gumppTLQuYYgvffcqE9Cjz8/DDz/ssgI0mK+uT2UuqhXc+6wpc1HdjJSVqAymSJRmrwEUVS6Iujmo7Onevbv7TvPKAGU33XzzzcHtlJWjVvZHHnnEZR95f1P3Dfp8JxqVBcogUNdFlQl6rsyOaOc1EpXV+p8oI0y/i3efoIxEdS3zKNMstMsjACQCSrU40hduKH0hedN/qb+cvkSU7hZKlQe/wbm0vb7ww/tFKugQPrVY+Dr6mxoMTDe9oVq3bu1S7RKFzoMGQVQ/w7p167r3pmXh400ci86VxofQzUX4KPnqJ6rxKtT/WSL1UwXSWyYo0BV+fZ577rm+g3Npe6+S4NHYHBrvQ6+FBg8ilQkqh8L/pgKS6uubKMEDlbPqmqX0a/0PVIbqZl9jFqSHzpeoIhXaB1yVs/DgDmUCjkWNCl43RvG+20PLBAXzIl2ffjMvafsLL7zwqHsElS/qmuR9NnW/Efq9qIqzAu9qTAiftSHRxux49NFH7amnnnJdOHUePCoT0hM80P9I5yz8f6QxZbwuIh7KBACJiOBBHKnlLvy51xKl/m7qI/+///u/6Rq1V9urH78G5Qu96VAlV1+CocIHONLf1M2zN/hXonr88cddZUpzM3vnQJkcalVIDw0ap4pV165dXdaIn0QbTAqZVyZ42Um6PlUWpPf6VJmgTIFQKh9UUQhv+Y5UJmgQL91IJzK16Kr/sbK+PAoieNkdaaXzJRpjJjxgE44yAceiln59BkM/K+H3CcpOGj58eLpOprbXPUEoPVegQOP4RPuMep9vZUOcf/75CfsP1FgRyvDQ2AReUERBAGVvxlIm6F4hLeU2ZQKARJS+pln4Ump76BeRRtvV4EiiGwJV/l966aVU2yiC7VfJ1aCJ2k4phR51Y1CKvqZ09KNKgr4slXobflOhgESi0PnTCOjeF7XSlb1BpfxosKnQ86CsAg10NmrUqOCAaaE3H0B6eYPxeZUEtWB7ZYKuT436ry5NoTTYlj7D0ei61/XvtYqHptKGpsxGor+p7kwKNiTy51tlgjcrhai7glpZ01smaDA6ZWO8+OKLqdZTOa/R6oH00Gcr9LtJgyQrI0aDI3rXpyqlCjKk5/pUmaD7j9DsBJUJ6l6njKRoFFDTdRL++U7L38xJlH0hoWVCeOZAJAoSqKtJaJmg/5G6R4ZPp60yNfz/BgCJiMyDONK4AhpHQN0CdIOgSrv6G4paGDXLgUZW1xgE3sjJCjA89NBDqfovh7coKGLubacbWY20rhF/lUrv55prrnGRdaVB33nnnW50ZaUmauYApSl6UzTldBopWu9PKYPFixd3lf+0BEd0YzVkyBAbMWKESyf1WnxatmzpflcfZt2MqcKn1hvNsgCkh/owKyNAwS19LtV63aVLl+BNqDJcdB336tXLvbZ06VIXcFClInTqxVAqXzRKutKUNeOKgoFPP/2067d8rD73gwYNcv1yVSnW31YZoOnGVNn25jZPlDJBmQdKSdYNvcpMb7q7Y5UJqrx5XR1ULr/88stuHBSV1+edd56riKiipv7MN9xwQ6a8HyQGVUZ79OjhrndlBSiNXjOreFktGsPos88+c59DLVcZoLF79L2t7+xoNIuCZv9QuaAuDgqW6bnGNjmW0aNHuzJIMwNo5gF131MWX4sWLVyZkgjUnVHjlOieSNeyuiZqpoVjUeBAs9Bohhxd/ypfde+lTI2rr77ajSmjgITu/XSvpUYe3YMAQCIj8yBONNiRBkLTl69aBU8++WT3BR46NY9uNDX4ltKWNf2iWrc1aFpo4KBJkyZH9TXU1E1qRVBLl/atG4XQFk3v74f329PNiY5JlV714dc0cFpHx5CerhPZnSpBr7/+umuJVTq3Bo9TQEBBE4+mbNRNVWgKp6axUyaIWn91PnV+VcnTjZr+JzpP6kuqQadCAwfqLuJNiQdEonE39HnTwIcKaqks0HSrmvIrdAAt3biPHz/e3bArS0h9ZHWdetOCisqU8Cm+dJPar18/Vx6o4q9WNG+asNC/H15hVpBM26jyos+5pixUMEJTvCUSVfgVUNS59Cr7el6nTp3gOgqmhk6RJ6os6XrX/0llgsY5UVmgQLAqeBrIToFJBYJCAweqfIW2agLhdA3rs6XggLKLdP1pWtbQLgpKiVcwT0GEZcuWue8mBbNVjnh0TevaDh23SN9ruq7V9UDrqgKrwVNDsxP1971pCUMpE2rJkiWuQUN/W4MJ6jpIlMCBKPtC164yPBQ8VVBG71XnMTTgqkxPBU1CKSigQVYVUPEGkVQwQYMqa5wlZY6pUUf3dApSeH9P+06UMWQAIFSKplxItQQAAAAAACAEmQcAAAAAAMAXwQMAAAAAAOCL4AEAAAAAAPBF8AAAAAAAAPgieAAAAAAAAHwRPAAAAAAAAL4IHgAAAAAAAF8EDwAAAAAAgC+CBwAAAAAAwBfBAwAAAAAA4IvgAQAAAAAA8EXwAAAAAAAAmJ//B4jXjNLqpcDdAAAAAElFTkSuQmCC", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig = plot_aggregate_target_match(weighter_d.matching_data, weighter_d.match(), weights=\"sample_weight\")" ] }, { "cell_type": "markdown", "id": "c2c80b30", "metadata": {}, "source": [ "## When the target lies outside the pool's support\n", "\n", "MAIC/entropy balancing needs the target to lie within the pool's covariate support -- there must\n", "be *some* valid (possibly very uneven) weighting of the pool that reproduces the target's moments.\n", "Unlike subset-selection matching (which always terminates, just possibly with poor balance),\n", "reweighting can fail outright when this \"positivity\" assumption breaks down.\n", "\n", "The toy pool is deliberately built with **zero** `country=0` patients, while the target has a\n", "nonzero `country=0` rate. Since every pool patient's `country` is one of `{1, ..., 5}`, *any*\n", "reweighting of the pool necessarily puts 100% of its mass on those five categories -- it's\n", "mathematically impossible to also match the target's five corresponding rates, which sum to less\n", "than 100% (the rest being the unreachable `country=0`). We use the actual patient-level target here\n", "(rather than an `AggregateTarget`) to make this concrete: an `AggregateTarget` that discloses a\n", "rate for a category the pool doesn't contain at all silently drops that category from the\n", "constraint set (it has no matching one-hot column to constrain), which would mask the very\n", "infeasibility we want to demonstrate." ] }, { "cell_type": "code", "execution_count": 12, "id": "4367bfee", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "MAICWeighter did not converge within 200 iterations (max constraint violation = 0.296). Weights may not exactly balance the requested moments; consider increasing max_iter/ridge, or check for unmatchable (e.g. near-extreme or non-overlapping) covariates.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "country rate in pool: {1: 0.108, 2: 0.224, 3: 0.274, 4: 0.284, 5: 0.11}\n", "country rate in target: {0: 0.09, 1: 0.25, 2: 0.2, 3: 0.11, 4: 0.2, 5: 0.15}\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
featuremomenttargetunweighted_poolweighted_pool
0gender_1.0mean0.4500000.5170000.464052
1country_1mean0.2500000.1080000.340190
2country_2mean0.2000000.2240000.080990
3country_3mean0.1100000.2740000.143957
4country_4mean0.2000000.2840000.254031
5country_5mean0.1500000.1100000.180831
6agemean50.79597555.52010751.570918
7weightmean82.07903388.01651081.907367
8heightmean153.795044160.308334154.426966
\n", "
" ], "text/plain": [ " feature moment target unweighted_pool weighted_pool\n", "0 gender_1.0 mean 0.450000 0.517000 0.464052\n", "1 country_1 mean 0.250000 0.108000 0.340190\n", "2 country_2 mean 0.200000 0.224000 0.080990\n", "3 country_3 mean 0.110000 0.274000 0.143957\n", "4 country_4 mean 0.200000 0.284000 0.254031\n", "5 country_5 mean 0.150000 0.110000 0.180831\n", "6 age mean 50.795975 55.520107 51.570918\n", "7 weight mean 82.079033 88.016510 81.907367\n", "8 height mean 153.795044 160.308334 154.426966" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "hard_m = generate_toy_dataset(n_pool=1000, n_target=100, seed=7)\n", "hard_pool = hard_m.get_population(\"pool\").drop(columns=[hard_m.population_col])\n", "hard_target_pl = hard_m.get_population(\"target\").drop(columns=[hard_m.population_col])\n", "hard_headers = MatchingHeaders(numeric=[\"age\", \"weight\", \"height\"], categoric=[\"gender\", \"country\"])\n", "\n", "print(\"country rate in pool: \", hard_pool[\"country\"].value_counts(normalize=True).sort_index().to_dict())\n", "print(\"country rate in target:\", hard_target_pl[\"country\"].value_counts(normalize=True).sort_index().to_dict())\n", "\n", "hard_matching_data = MatchingData(pool=hard_pool, target=hard_target_pl, headers=hard_headers)\n", "\n", "hard_weighter = MAICWeighter(hard_matching_data, verbose=True)\n", "hard_weighter.match()\n", "\n", "weighted_balance_table(hard_weighter)" ] }, { "cell_type": "markdown", "id": "7d8f1d41", "metadata": {}, "source": [ "As expected, the fit reports `converged: False`. Because a valid reweighting of the pool can only\n", "ever distribute 100% of its mass across `country in {1, ..., 5}`, it's mathematically impossible\n", "to simultaneously hit the target's rates for those five categories, which sum to only 91% (the\n", "rest being the unreachable `country=0`) -- there's no weighting that can reconcile the two.\n", "Notice how the optimizer, unable to satisfy the `country` constraints, ends up trading away\n", "balance on *every other* feature too (`gender`, `age`, `weight`, `height` are all now visibly off\n", "target) while it searches for a best-effort compromise, and the effective sample size drops\n", "sharply. This is exactly the honest, \"don't silently produce a wrong answer\" behavior we want. If\n", "you hit this in practice: check for categories/ranges the target has that the pool structurally\n", "lacks, consider dropping the offending feature, or fall back to subset-selection matching (which\n", "can't invent missing categories either, but degrades more gracefully -- see the aggregate-matching\n", "demo)." ] }, { "cell_type": "code", "execution_count": 13, "id": "d7ead4e2", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Converged: False\n", "Max constraint violation: 0.296\n", "Effective sample size: 443.4 / 1000 pool patients\n" ] } ], "source": [ "print(f\"Converged: {hard_weighter.diagnostics['converged']}\")\n", "print(f\"Max constraint violation: {hard_weighter.diagnostics['max_constraint_violation']:.3f}\")\n", "print(f\"Effective sample size: {hard_weighter.effective_sample_size():.1f} / {len(hard_pool)} pool patients\")" ] }, { "cell_type": "markdown", "id": "d63bef29", "metadata": {}, "source": [ "## Takeaways\n", "\n", "- Weighting keeps **every** pool patient, unlike the subset-selection matchers elsewhere in\n", " `pybalance` -- some patients just count for more or less. `MAICWeighter` is the classic\n", " mean-only MAIC formulation; `EntropyBalanceWeighter(match_variance=True)` generalizes it to also\n", " balance disclosed variances.\n", "- Against an `AggregateTarget`, every disclosed statistic is its own constraint and nothing else is\n", " constrained: a numeric **mean**, each categoric **rate**, and the rate above each disclosed\n", " **median/quantile** (the feature is dichotomized at the disclosed value). Features and categoric\n", " levels the target doesn't disclose are left free, and `weighted_balance_table` still reports them\n", " (with no target) so you can see how reweighting moved them.\n", "- Balancing a **std** needs the mean as well, since the variance is taken around it. A std without a\n", " mean isn't a moment constraint reweighting can solve (use the subset-selection matchers).\n", "- **`min` and `max`** are soft here too: exactly zero weight above a max is out of reach for positive\n", " weights, so the weight above it is only penalized (`limit_penalty`) and shrinks, rather than\n", " vanishing.\n", "- Both weighters also work with a patient-level target.\n", "- Always check `effective_sample_size()` and `.diagnostics[\"converged\"]` alongside any fitted\n", " weights -- a low ESS or non-convergence is the signal that the reweighting is stretching thin (or\n", " failing outright) to reach the target, most often because of a genuine covariate-support mismatch\n", " between pool and target." ] } ], "metadata": { "kernelspec": { "display_name": "pybal2", "language": "python", "name": "pybal2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.12.1" } }, "nbformat": 4, "nbformat_minor": 5 }