{
"cells": [
{
"cell_type": "markdown",
"id": "7da024e1",
"metadata": {},
"source": [
"# Matching a pool to an aggregate target\n",
"\n",
"`AggregateConstraintSatisfactionMatcher` selects a subset of a patient-level pool so that its\n",
"moments match a target known only through **summary statistics** -- e.g. a published trial's\n",
"Table 1 (means, proportions, sometimes standard deviations) -- rather than patient-level rows.\n",
"\n",
"The notebook builds up over three use cases, each disclosing a bit more or something different\n",
"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",
"Features the target says nothing about (here `height` and `country`) are not constrained, but we keep\n",
"them in the `MatchingData` so we can still see how matching changes them.\n",
"\n",
"The patient-level pool is synthetic (`pybalance.sim.generate_toy_dataset`); no patient-level target\n",
"rows are ever used."
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "9030954f",
"metadata": {},
"outputs": [],
"source": [
"import logging\n",
"\n",
"import matplotlib.pyplot as plt\n",
"import pandas as pd\n",
"\n",
"from pybalance.lp import AggregateConstraintSatisfactionMatcher\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 (\n",
" AggregateTarget,\n",
" MatchingData,\n",
" MatchingHeaders,\n",
" aggregate_target_constraints,\n",
")\n",
"from pybalance.visualization import (\n",
" plot_aggregate_target_match,\n",
" plot_fractional_difference,\n",
")\n",
"\n",
"%matplotlib inline\n",
"\n",
"# show the matcher's CP-SAT solver output\n",
"logging.basicConfig(level=logging.INFO, format=\"%(message)s\", force=True)"
]
},
{
"cell_type": "markdown",
"id": "95d67ba9",
"metadata": {},
"source": [
"## A patient-level (synthetic) pool\n",
"\n",
"An aggregate-target match only needs patient-level data for the **pool**. `generate_toy_dataset`\n",
"returns an entirely simulated one (no real patients); with `n_target=0` it generates no target\n",
"patients at all, since the target will come from summary statistics instead."
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "0c9b9271",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
age
\n",
"
height
\n",
"
weight
\n",
"
gender
\n",
"
haircolor
\n",
"
country
\n",
"
binary_0
\n",
"
binary_1
\n",
"
binary_2
\n",
"
binary_3
\n",
"
patient_id
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
69.436489
\n",
"
155.189260
\n",
"
79.144533
\n",
"
0.0
\n",
"
1
\n",
"
4
\n",
"
0
\n",
"
0
\n",
"
1
\n",
"
1
\n",
"
0
\n",
"
\n",
"
\n",
"
1
\n",
"
28.771438
\n",
"
175.270602
\n",
"
97.734561
\n",
"
1.0
\n",
"
0
\n",
"
5
\n",
"
0
\n",
"
0
\n",
"
1
\n",
"
1
\n",
"
1
\n",
"
\n",
"
\n",
"
2
\n",
"
62.640154
\n",
"
136.648640
\n",
"
85.170055
\n",
"
0.0
\n",
"
1
\n",
"
2
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
1
\n",
"
2
\n",
"
\n",
"
\n",
"
3
\n",
"
68.907932
\n",
"
189.959952
\n",
"
90.705549
\n",
"
0.0
\n",
"
1
\n",
"
3
\n",
"
0
\n",
"
0
\n",
"
1
\n",
"
1
\n",
"
3
\n",
"
\n",
"
\n",
"
4
\n",
"
49.571169
\n",
"
133.787109
\n",
"
76.708193
\n",
"
1.0
\n",
"
2
\n",
"
3
\n",
"
0
\n",
"
0
\n",
"
0
\n",
"
1
\n",
"
4
\n",
"
\n",
" \n",
"
\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": "9c593d47",
"metadata": {},
"source": [
"## Specifying means only\n",
"\n",
"An `AggregateTarget` is the target's sample size `n` plus whatever summary statistics are disclosed:\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": "c29763c3",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"AggregateTarget (n=250)
\n",
" \n",
"
\n",
"
feature
\n",
"
type
\n",
"
stat
\n",
"
value
\n",
"
\n",
" \n",
" \n",
"
\n",
"
age
\n",
"
numeric
\n",
"
mean
\n",
"
64.00
\n",
"
\n",
"
\n",
"
weight
\n",
"
numeric
\n",
"
mean
\n",
"
80.00
\n",
"
\n",
"
\n",
"
gender
\n",
"
categoric
\n",
"
0
\n",
"
0.35
\n",
"
\n",
"
\n",
"
gender
\n",
"
categoric
\n",
"
1
\n",
"
0.65
\n",
"
\n",
" \n",
"
"
],
"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": "b460b1bd",
"metadata": {},
"source": [
"To match, wrap the pool and the target in a `MatchingData` and hand it to\n",
"`AggregateConstraintSatisfactionMatcher`, which solves for the subset of the pool whose statistics\n",
"come closest to every disclosed constraint.\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 matcher, but\n",
"reported in the results, so we can see what matching does to them."
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "fa4427b6",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"Scaling features by factor 240.00 in order to use integer solver with <= 0.5782% loss.\n",
"Solving for match population with pool size = 250 and target size = 250 (aggregate), optimizing balance (no max_mismatch cap).\n",
"Matching on 4 dimensions ...\n",
"Building model variables and constraints ...\n",
"Calculating bounds on feature variables ...\n",
"Applying size constraints on pool ...\n",
"Solving with 1 workers ...\n",
"Initial balance score: 0.3308\n",
"=========================================\n",
"Solution 1, time = 0.00 m\n",
"Objective:\t631500.0\n",
"Balance (aggregate_beta):\t0.0418\n",
"Patients (pool):\t250\n",
"Patients (target):\t250 (aggregate)\n",
" \n",
"=========================================\n",
"Solution 2, time = 0.00 m\n",
"Objective:\t39750.0\n",
"Balance (aggregate_beta):\t0.0060\n",
"Patients (pool):\t250\n",
"Patients (target):\t250 (aggregate)\n",
" \n",
"=========================================\n",
"Solution 3, time = 0.01 m\n",
"Objective:\t32250.0\n",
"Balance (aggregate_beta):\t0.0058\n",
"Patients (pool):\t250\n",
"Patients (target):\t250 (aggregate)\n",
" \n",
"=========================================\n",
"Solution 4, time = 0.01 m\n",
"Objective:\t31750.0\n",
"Balance (aggregate_beta):\t0.0056\n",
"Patients (pool):\t250\n",
"Patients (target):\t250 (aggregate)\n",
" \n",
"=========================================\n",
"Solution 5, time = 0.01 m\n",
"Objective:\t31000.0\n",
"Balance (aggregate_beta):\t0.0054\n",
"Patients (pool):\t250\n",
"Patients (target):\t250 (aggregate)\n",
" \n",
"=========================================\n",
"Solution 6, time = 0.01 m\n",
"Objective:\t30500.0\n",
"Balance (aggregate_beta):\t0.0053\n",
"Patients (pool):\t250\n",
"Patients (target):\t250 (aggregate)\n",
" \n",
"=========================================\n",
"Solution 7, time = 0.01 m\n",
"Objective:\t30250.0\n",
"Balance (aggregate_beta):\t0.0052\n",
"Patients (pool):\t250\n",
"Patients (target):\t250 (aggregate)\n",
" \n",
"=========================================\n",
"Solution 8, time = 0.02 m\n",
"Objective:\t29750.0\n",
"Balance (aggregate_beta):\t0.0052\n",
"Patients (pool):\t250\n",
"Patients (target):\t250 (aggregate)\n",
" \n",
"Status = OPTIMAL\n",
"Number of solutions found: 8\n"
]
}
],
"source": [
"headers = MatchingHeaders(numeric=[\"age\", \"weight\", \"height\"], categoric=[\"gender\", \"country\"])\n",
"\n",
"matching_data = MatchingData(pool=pool, target=my_target, headers=headers)\n",
"matcher = AggregateConstraintSatisfactionMatcher(\n",
" matching_data, time_limit=60, num_workers=1, verbose=True\n",
")\n",
"matched = matcher.match()"
]
},
{
"cell_type": "markdown",
"id": "94d15563",
"metadata": {},
"source": [
"`matched` is a new `MatchingData` holding the selected subset. `describe()` puts the original pool,\n",
"the matched pool and the target side by side. `age`, `weight` and `gender` move onto their targets;\n",
"`height` and `country` have no target (`NaN`), but we can still see how they shifted as a side effect."
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "e9bf0e01",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
\n",
"
pool
\n",
"
pool_matched
\n",
"
target
\n",
"
\n",
" \n",
" \n",
"
\n",
"
population size
\n",
"
N
\n",
"
1000.000
\n",
"
250.000
\n",
"
250.00
\n",
"
\n",
"
\n",
"
gender
\n",
"
0.0
\n",
"
0.483
\n",
"
0.352
\n",
"
0.35
\n",
"
\n",
"
\n",
"
1.0
\n",
"
0.517
\n",
"
0.648
\n",
"
0.65
\n",
"
\n",
"
\n",
"
country
\n",
"
1.0
\n",
"
0.108
\n",
"
0.112
\n",
"
NaN
\n",
"
\n",
"
\n",
"
2
\n",
"
0.224
\n",
"
0.232
\n",
"
NaN
\n",
"
\n",
"
\n",
"
3
\n",
"
0.274
\n",
"
0.288
\n",
"
NaN
\n",
"
\n",
"
\n",
"
4
\n",
"
0.284
\n",
"
0.268
\n",
"
NaN
\n",
"
\n",
"
\n",
"
5
\n",
"
0.110
\n",
"
0.100
\n",
"
NaN
\n",
"
\n",
"
\n",
"
age
\n",
"
mean
\n",
"
55.520
\n",
"
64.110
\n",
"
64.00
\n",
"
\n",
"
\n",
"
std
\n",
"
13.110
\n",
"
10.530
\n",
"
NaN
\n",
"
\n",
"
\n",
"
weight
\n",
"
mean
\n",
"
88.020
\n",
"
80.140
\n",
"
80.00
\n",
"
\n",
"
\n",
"
std
\n",
"
16.550
\n",
"
16.120
\n",
"
NaN
\n",
"
\n",
"
\n",
"
height
\n",
"
mean
\n",
"
160.310
\n",
"
156.200
\n",
"
NaN
\n",
"
\n",
"
\n",
"
std
\n",
"
19.500
\n",
"
18.850
\n",
"
NaN
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" pool pool_matched target\n",
"population size N 1000.000 250.000 250.00\n",
"gender 0.0 0.483 0.352 0.35\n",
" 1.0 0.517 0.648 0.65\n",
"country 1.0 0.108 0.112 NaN\n",
" 2 0.224 0.232 NaN\n",
" 3 0.274 0.288 NaN\n",
" 4 0.284 0.268 NaN\n",
" 5 0.110 0.100 NaN\n",
"age mean 55.520 64.110 64.00\n",
" std 13.110 10.530 NaN\n",
"weight mean 88.020 80.140 80.00\n",
" std 16.550 16.120 NaN\n",
"height mean 160.310 156.200 NaN\n",
" std 19.500 18.850 NaN"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"(\n",
" matching_data\n",
" .describe(quantiles=[])\n",
" .join(\n",
" matched.describe(quantiles=[]),\n",
" rsuffix='_matched'\n",
" )[['pool', 'pool_matched', 'target']]\n",
")"
]
},
{
"cell_type": "markdown",
"id": "3cea0810",
"metadata": {},
"source": [
"To check just the disclosed constraints, `aggregate_target_constraints` lists each one next to the\n",
"value the pool achieves, and `plot_aggregate_target_match` draws it: one panel per constraint, with\n",
"the dashed line at the disclosed target, a shaded band around it, and the pool's value before and\n",
"after matching. A successful match moves the \"after\" dot onto the dashed line."
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "fd8829f8",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"constraints = aggregate_target_constraints(matching_data).merge(\n",
" aggregate_target_constraints(matched),\n",
" on=[\"feature\", \"constraint\", \"target\"],\n",
" suffixes=(\"_before\", \"_after\"),\n",
")\n",
"display(constraints.round(3))\n",
"\n",
"fig = plot_aggregate_target_match(matching_data, matched)"
]
},
{
"cell_type": "markdown",
"id": "e5482c04",
"metadata": {},
"source": [
"## Specifying means and standard deviations\n",
"\n",
"Now the target also discloses a **std** for each numeric feature. The matcher then constrains each\n",
"variance toward its disclosed value, in addition to the mean.\n",
"\n",
"Typing targets out by hand gets long, so `pybalance.sim` ships ready-made ones: summaries of a toy\n",
"target population that disclose different amounts of information, to be matched against the pool\n",
"above. `load_demo_aggregate_target(use_case)` returns the packaged `AggregateTarget` and\n",
"`generate_aggregate_target(use_case)` derives the same thing from the toy dataset -- or from your own\n",
"patient-level `MatchingData`, via its `matching_data=` argument.\n",
"\n",
"| `use_case` | disclosed statistics |\n",
"|---|---|\n",
"| `means` | `age` and `weight` means, `gender` rates (what we wrote by hand above) |\n",
"| `means_std` | `age` and `weight` means and stds, `gender` rates |\n",
"| `quantiles` | `age` quartiles and `weight` median (instead of means), `gender` rates |"
]
},
{
"cell_type": "markdown",
"id": "da32c27d",
"metadata": {},
"source": [
"`match_to` repeats the steps from use case 1 -- build a `MatchingData` from the pool and a target,\n",
"then run `AggregateConstraintSatisfactionMatcher` -- so each use case below is a couple of lines."
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "2287b176",
"metadata": {},
"outputs": [],
"source": [
"def match_to(target):\n",
" \"\"\"Match `pool` to an AggregateTarget; returns (matching_data, matched).\"\"\"\n",
" matching_data = MatchingData(pool=pool, target=target, headers=headers)\n",
" matcher = AggregateConstraintSatisfactionMatcher(\n",
" matching_data, time_limit=60, num_workers=1, verbose=True\n",
" )\n",
" return matching_data, matcher.match()"
]
},
{
"cell_type": "markdown",
"id": "3bbed6fd",
"metadata": {},
"source": [
"Load the `means_std` target and match. Displaying the target shows exactly what it discloses."
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "30ce3301",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"AggregateTarget (n=100)
\n",
" \n",
"
\n",
"
feature
\n",
"
type
\n",
"
stat
\n",
"
value
\n",
"
\n",
" \n",
" \n",
"
\n",
"
age
\n",
"
numeric
\n",
"
mean
\n",
"
50.795973
\n",
"
\n",
"
\n",
"
age
\n",
"
numeric
\n",
"
std
\n",
"
15.019030
\n",
"
\n",
"
\n",
"
weight
\n",
"
numeric
\n",
"
mean
\n",
"
82.079040
\n",
"
\n",
"
\n",
"
weight
\n",
"
numeric
\n",
"
std
\n",
"
18.721164
\n",
"
\n",
"
\n",
"
gender
\n",
"
categoric
\n",
"
0.0
\n",
"
0.550000
\n",
"
\n",
"
\n",
"
gender
\n",
"
categoric
\n",
"
1.0
\n",
"
0.450000
\n",
"
\n",
" \n",
"
"
],
"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": [
"Scaling features by factor 240.00 in order to use integer solver with <= 0.5782% loss.\n",
"Scaling variance terms by factor 2 (vs. mean-term factor 240.0) so neither dominates the objective purely due to units.\n",
"Solving for match population with pool size = 100 and target size = 100 (aggregate), optimizing balance (no max_mismatch cap).\n",
"Matching on 4 dimensions ...\n",
"Building model variables and constraints ...\n",
"Calculating bounds on feature variables ...\n",
"Applying size constraints on pool ...\n",
"Applying variance constraints on 2 feature(s) with disclosed std ...\n",
"Solving with 1 workers ...\n",
"Initial balance score: 0.1899\n",
"=========================================\n",
"Solution 1, time = 0.00 m\n",
"Objective:\t4717.0\n",
"Balance (aggregate_beta):\t0.0033\n",
"Patients (pool):\t100\n",
"Patients (target):\t100 (aggregate)\n",
" \n",
"=========================================\n",
"Solution 2, time = 0.00 m\n",
"Objective:\t3567.0\n",
"Balance (aggregate_beta):\t0.0026\n",
"Patients (pool):\t100\n",
"Patients (target):\t100 (aggregate)\n",
" \n",
"=========================================\n",
"Solution 3, time = 0.00 m\n",
"Objective:\t2684.0\n",
"Balance (aggregate_beta):\t0.0035\n",
"Patients (pool):\t100\n",
"Patients (target):\t100 (aggregate)\n",
" \n",
"=========================================\n",
"Solution 4, time = 0.01 m\n",
"Objective:\t1730.0\n",
"Balance (aggregate_beta):\t0.0038\n",
"Patients (pool):\t100\n",
"Patients (target):\t100 (aggregate)\n",
" \n",
"=========================================\n",
"Solution 5, time = 0.01 m\n",
"Objective:\t1648.0\n",
"Balance (aggregate_beta):\t0.0034\n",
"Patients (pool):\t100\n",
"Patients (target):\t100 (aggregate)\n",
" \n",
"=========================================\n",
"Solution 6, time = 0.01 m\n",
"Objective:\t1387.0\n",
"Balance (aggregate_beta):\t0.0037\n",
"Patients (pool):\t100\n",
"Patients (target):\t100 (aggregate)\n",
" \n",
"=========================================\n",
"Solution 7, time = 0.02 m\n",
"Objective:\t1269.0\n",
"Balance (aggregate_beta):\t0.0037\n",
"Patients (pool):\t100\n",
"Patients (target):\t100 (aggregate)\n",
" \n",
"=========================================\n",
"Solution 8, time = 0.02 m\n",
"Objective:\t1130.0\n",
"Balance (aggregate_beta):\t0.0037\n",
"Patients (pool):\t100\n",
"Patients (target):\t100 (aggregate)\n",
" \n",
"=========================================\n",
"Solution 9, time = 0.02 m\n",
"Objective:\t909.0\n",
"Balance (aggregate_beta):\t0.0038\n",
"Patients (pool):\t100\n",
"Patients (target):\t100 (aggregate)\n",
" \n",
"=========================================\n",
"Solution 10, time = 0.02 m\n",
"Objective:\t688.0\n",
"Balance (aggregate_beta):\t0.0036\n",
"Patients (pool):\t100\n",
"Patients (target):\t100 (aggregate)\n",
" \n",
"=========================================\n",
"Solution 11, time = 0.03 m\n",
"Objective:\t524.0\n",
"Balance (aggregate_beta):\t0.0035\n",
"Patients (pool):\t100\n",
"Patients (target):\t100 (aggregate)\n",
" \n",
"=========================================\n",
"Solution 12, time = 0.04 m\n",
"Objective:\t512.0\n",
"Balance (aggregate_beta):\t0.0036\n",
"Patients (pool):\t100\n",
"Patients (target):\t100 (aggregate)\n",
" \n",
"=========================================\n",
"Solution 13, time = 0.05 m\n",
"Objective:\t436.0\n",
"Balance (aggregate_beta):\t0.0035\n",
"Patients (pool):\t100\n",
"Patients (target):\t100 (aggregate)\n",
" \n",
"=========================================\n",
"Solution 14, time = 0.05 m\n",
"Objective:\t310.0\n",
"Balance (aggregate_beta):\t0.0036\n",
"Patients (pool):\t100\n",
"Patients (target):\t100 (aggregate)\n",
" \n",
"=========================================\n",
"Solution 15, time = 0.05 m\n",
"Objective:\t264.0\n",
"Balance (aggregate_beta):\t0.0036\n",
"Patients (pool):\t100\n",
"Patients (target):\t100 (aggregate)\n",
" \n",
"=========================================\n",
"Solution 16, time = 0.08 m\n",
"Objective:\t248.0\n",
"Balance (aggregate_beta):\t0.0036\n",
"Patients (pool):\t100\n",
"Patients (target):\t100 (aggregate)\n",
" \n",
"=========================================\n",
"Solution 17, time = 0.11 m\n",
"Objective:\t187.0\n",
"Balance (aggregate_beta):\t0.0036\n",
"Patients (pool):\t100\n",
"Patients (target):\t100 (aggregate)\n",
" \n",
"=========================================\n",
"Solution 18, time = 0.15 m\n",
"Objective:\t167.0\n",
"Balance (aggregate_beta):\t0.0035\n",
"Patients (pool):\t100\n",
"Patients (target):\t100 (aggregate)\n",
" \n",
"=========================================\n",
"Solution 19, time = 0.48 m\n",
"Objective:\t165.0\n",
"Balance (aggregate_beta):\t0.0035\n",
"Patients (pool):\t100\n",
"Patients (target):\t100 (aggregate)\n",
" \n",
"=========================================\n",
"Solution 20, time = 0.54 m\n",
"Objective:\t114.0\n",
"Balance (aggregate_beta):\t0.0036\n",
"Patients (pool):\t100\n",
"Patients (target):\t100 (aggregate)\n",
" \n",
"=========================================\n",
"Solution 21, time = 0.73 m\n",
"Objective:\t110.0\n",
"Balance (aggregate_beta):\t0.0037\n",
"Patients (pool):\t100\n",
"Patients (target):\t100 (aggregate)\n",
" \n",
"=========================================\n",
"Solution 22, time = 0.76 m\n",
"Objective:\t105.0\n",
"Balance (aggregate_beta):\t0.0036\n",
"Patients (pool):\t100\n",
"Patients (target):\t100 (aggregate)\n",
" \n",
"Status = FEASIBLE\n",
"Number of solutions found: 22\n"
]
}
],
"source": [
"target_b = load_demo_aggregate_target(\"means_std\")\n",
"display(target_b)\n",
"before_b, after_b = match_to(target_b)"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "091dbfac",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
\n",
"
pool
\n",
"
pool_matched
\n",
"
target
\n",
"
\n",
" \n",
" \n",
"
\n",
"
population size
\n",
"
N
\n",
"
1000.000
\n",
"
100.00
\n",
"
100.00
\n",
"
\n",
"
\n",
"
gender
\n",
"
0.0
\n",
"
0.483
\n",
"
0.55
\n",
"
0.55
\n",
"
\n",
"
\n",
"
1.0
\n",
"
0.517
\n",
"
0.45
\n",
"
0.45
\n",
"
\n",
"
\n",
"
country
\n",
"
1.0
\n",
"
0.108
\n",
"
0.12
\n",
"
NaN
\n",
"
\n",
"
\n",
"
2
\n",
"
0.224
\n",
"
0.16
\n",
"
NaN
\n",
"
\n",
"
\n",
"
3
\n",
"
0.274
\n",
"
0.31
\n",
"
NaN
\n",
"
\n",
"
\n",
"
4
\n",
"
0.284
\n",
"
0.27
\n",
"
NaN
\n",
"
\n",
"
\n",
"
5
\n",
"
0.110
\n",
"
0.14
\n",
"
NaN
\n",
"
\n",
"
\n",
"
age
\n",
"
mean
\n",
"
55.520
\n",
"
50.91
\n",
"
50.80
\n",
"
\n",
"
\n",
"
std
\n",
"
13.110
\n",
"
15.09
\n",
"
15.02
\n",
"
\n",
"
\n",
"
weight
\n",
"
mean
\n",
"
88.020
\n",
"
82.22
\n",
"
82.08
\n",
"
\n",
"
\n",
"
std
\n",
"
16.550
\n",
"
18.82
\n",
"
18.72
\n",
"
\n",
"
\n",
"
height
\n",
"
mean
\n",
"
160.310
\n",
"
157.29
\n",
"
NaN
\n",
"
\n",
"
\n",
"
std
\n",
"
19.500
\n",
"
22.09
\n",
"
NaN
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" pool pool_matched target\n",
"population size N 1000.000 100.00 100.00\n",
"gender 0.0 0.483 0.55 0.55\n",
" 1.0 0.517 0.45 0.45\n",
"country 1.0 0.108 0.12 NaN\n",
" 2 0.224 0.16 NaN\n",
" 3 0.274 0.31 NaN\n",
" 4 0.284 0.27 NaN\n",
" 5 0.110 0.14 NaN\n",
"age mean 55.520 50.91 50.80\n",
" std 13.110 15.09 15.02\n",
"weight mean 88.020 82.22 82.08\n",
" std 16.550 18.82 18.72\n",
"height mean 160.310 157.29 NaN\n",
" std 19.500 22.09 NaN"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"(\n",
" before_b\n",
" .describe(quantiles=[])\n",
" .join(\n",
" after_b.describe(quantiles=[]), \n",
" rsuffix='_matched'\n",
" )[['pool', 'pool_matched', 'target']]\n",
")"
]
},
{
"cell_type": "markdown",
"id": "e062c05c",
"metadata": {},
"source": [
"`age` and `weight` should now land on their disclosed stds as well as their means, while `height` and\n",
"`country` are again just reported. The plots below show the fractional difference to the target before\n",
"and after matching (closer to zero is better; undisclosed features are left out), followed by\n",
"`plot_aggregate_target_match` comparing the pool before vs. after matching against each disclosed\n",
"constraint."
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "1967d13c",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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",
"text/plain": [
"
"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"fig = plot_aggregate_target_match(before_b, after_b)"
]
},
{
"cell_type": "markdown",
"id": "4c32af90",
"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, e.g. `(0.2, 70.0)` for \"80% of patients weigh more than 70kg\", and a median is\n",
"the single quantile 0.5: `{\"age\": {\"median\": 41.0}}` is exactly `{\"age\": {\"quantile\": [(0.5, 41.0)]}}`.\n",
"Either way the disclosed value is the cutpoint: the matcher dichotomizes the raw column there and\n",
"matches the resulting rate, so you never compute the 0/1 column yourself. Here `age` discloses its\n",
"quartiles (25th, 50th and 75th percentile) 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": 12,
"id": "31ba25b3",
"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": "66ef2ce8",
"metadata": {},
"source": [
"One row per disclosed statistic, in four columns:\n",
"\n",
"| `statistic` | `feature` | `parameter` | `value` |\n",
"|---|---|---|---|\n",
"| `n` | blank | blank | the target's sample size (one row, required) |\n",
"| `mean`, `std`, `median`, `min`, `max` | numeric feature | blank | the statistic |\n",
"| `quantile` | numeric feature | the proportion `q` | the cutpoint, i.e. P(feature <= value) = q |\n",
"| `rate` | categoric feature | the category level | that level's rate (levels may be omitted) |\n",
"\n",
"`AggregateTarget.from_csv(path)` reads it, so a published Table 1 can be transcribed into a\n",
"spreadsheet and loaded directly. `to_csv()` writes it:"
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "b8b4ff0d",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"feature,statistic,parameter,value\n",
",n,,250\n",
"age,mean,,64.0\n",
"weight,mean,,80.0\n",
"gender,rate,0,0.35\n",
"gender,rate,1,0.65\n",
"\n"
]
}
],
"source": [
"# `to_csv()` writes the same format -- here, use case 1's hand-written target.\n",
"print(my_target.to_csv())"
]
},
{
"cell_type": "markdown",
"id": "f85e3cd9",
"metadata": {},
"source": [
"Now load the `quantiles` file with `AggregateTarget.from_csv` and match to it. This is exactly what\n",
"`load_demo_aggregate_target` does; point `from_csv` at your own file to use your own target."
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "46d60387",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"AggregateTarget (n=100)
\n",
" \n",
"
\n",
"
feature
\n",
"
type
\n",
"
stat
\n",
"
value
\n",
"
\n",
" \n",
" \n",
"
\n",
"
age
\n",
"
numeric
\n",
"
quantile_0.25
\n",
"
41.375728
\n",
"
\n",
"
\n",
"
age
\n",
"
numeric
\n",
"
quantile_0.5
\n",
"
53.717471
\n",
"
\n",
"
\n",
"
age
\n",
"
numeric
\n",
"
quantile_0.75
\n",
"
63.697995
\n",
"
\n",
"
\n",
"
weight
\n",
"
numeric
\n",
"
quantile_0.5
\n",
"
82.663843
\n",
"
\n",
"
\n",
"
gender
\n",
"
categoric
\n",
"
0.0
\n",
"
0.550000
\n",
"
\n",
"
\n",
"
gender
\n",
"
categoric
\n",
"
1.0
\n",
"
0.450000
\n",
"
\n",
" \n",
"
"
],
"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": [
"Scaling features by factor 200.00 in order to use integer solver with <= 0.4082% loss.\n",
"Solving for match population with pool size = 100 and target size = 100 (aggregate), optimizing balance (no max_mismatch cap).\n",
"Matching on 10 dimensions ...\n",
"Building model variables and constraints ...\n",
"Calculating bounds on feature variables ...\n",
"Applying size constraints on pool ...\n",
"Solving with 1 workers ...\n",
"Initial balance score: 0.1405\n",
"=========================================\n",
"Solution 1, time = 0.00 m\n",
"Objective:\t100.0\n",
"Balance (aggregate_beta):\t0.0000\n",
"Patients (pool):\t100\n",
"Patients (target):\t100 (aggregate)\n",
" \n",
"Status = OPTIMAL\n",
"Number of solutions found: 1\n"
]
}
],
"source": [
"target_c = AggregateTarget.from_csv(path)\n",
"display(target_c)\n",
"before_c, after_c = match_to(target_c)"
]
},
{
"cell_type": "markdown",
"id": "728baab6",
"metadata": {},
"source": [
"The target has no means to compare against (`NaN`), so `describe()` alone cannot tell us whether the\n",
"quantiles matched. `aggregate_target_constraints` (and `plot_aggregate_target_match`) can: they report\n",
"each quantile as `P(x <= value)`, which should equal its disclosed `q` after matching. `describe()`\n",
"still shows how the means, stds and every undisclosed feature moved."
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "dd83703f",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"constraints = aggregate_target_constraints(before_c).merge(\n",
" aggregate_target_constraints(after_c),\n",
" on=[\"feature\", \"constraint\", \"target\"],\n",
" suffixes=(\"_before\", \"_after\"),\n",
")\n",
"display(constraints.round(3))\n",
"\n",
"fig = plot_aggregate_target_match(before_c, after_c)"
]
},
{
"cell_type": "markdown",
"id": "27d6cabb",
"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. Like every other constraint they are **soft**: the matcher minimizes\n",
"the fraction of patients above `max` (below `min`) as part of its objective, trading it off against\n",
"the rest rather than enforcing a hard bound. A limit that no pool patient violates is simply\n",
"skipped.\n",
"\n",
"Here we take use case 3's target and add a ceiling on `weight`:"
]
},
{
"cell_type": "code",
"execution_count": 17,
"id": "e110c93d",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"AggregateTarget (n=100)
\n",
" \n",
"
\n",
"
feature
\n",
"
type
\n",
"
stat
\n",
"
value
\n",
"
\n",
" \n",
" \n",
"
\n",
"
age
\n",
"
numeric
\n",
"
quantile_0.25
\n",
"
41.375728
\n",
"
\n",
"
\n",
"
age
\n",
"
numeric
\n",
"
quantile_0.5
\n",
"
53.717471
\n",
"
\n",
"
\n",
"
age
\n",
"
numeric
\n",
"
quantile_0.75
\n",
"
63.697995
\n",
"
\n",
"
\n",
"
weight
\n",
"
numeric
\n",
"
quantile_0.5
\n",
"
82.663843
\n",
"
\n",
"
\n",
"
weight
\n",
"
numeric
\n",
"
max
\n",
"
100.000000
\n",
"
\n",
"
\n",
"
gender
\n",
"
categoric
\n",
"
0.0
\n",
"
0.550000
\n",
"
\n",
"
\n",
"
gender
\n",
"
categoric
\n",
"
1.0
\n",
"
0.450000
\n",
"
\n",
" \n",
"
"
],
"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",
"Scaling features by factor 200.00 in order to use integer solver with <= 0.4082% loss.\n",
"Solving for match population with pool size = 100 and target size = 100 (aggregate), optimizing balance (no max_mismatch cap).\n",
"Matching on 12 dimensions ...\n",
"Building model variables and constraints ...\n",
"Calculating bounds on feature variables ...\n",
"Applying size constraints on pool ...\n",
"Solving with 1 workers ...\n",
"Initial balance score: 0.2187\n",
"=========================================\n",
"Solution 1, time = 0.00 m\n",
"Objective:\t100.0\n",
"Balance (aggregate_beta):\t0.0000\n",
"Patients (pool):\t100\n",
"Patients (target):\t100 (aggregate)\n",
" \n",
"Status = OPTIMAL\n",
"Number of solutions found: 1\n"
]
}
],
"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",
"before_d, after_d = match_to(target_d)"
]
},
{
"cell_type": "markdown",
"id": "6c6511a2",
"metadata": {},
"source": [
"The table lists the `max` as `P(x <= 100) (max)` with a target of 1: after matching, (almost) every\n",
"patient should be at or below 100kg, while the quartiles and the median still land on their targets.\n",
"The plot shows the same thing in the feature's own units: it fixes each quantile (25th, 50th, 75th\n",
"percentile, max) and compares the pool's value of it before and after matching with the disclosed\n",
"one. (Pass `quantiles_as=\"proportion\"` to `plot_aggregate_target_match` to fix the cutpoint instead and\n",
"plot the proportion, as in the table.) The solver may log a note that the target is constant for the\n",
"max constraint -- expected, as its target rate of patients above the max is exactly 0."
]
},
{
"cell_type": "code",
"execution_count": 18,
"id": "2cf509b4",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
feature
\n",
"
constraint
\n",
"
target
\n",
"
pool_before
\n",
"
pool_after
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
age
\n",
"
P(x <= 41.3757)
\n",
"
0.25
\n",
"
0.164
\n",
"
0.25
\n",
"
\n",
"
\n",
"
1
\n",
"
age
\n",
"
P(x <= 53.7175)
\n",
"
0.50
\n",
"
0.400
\n",
"
0.50
\n",
"
\n",
"
\n",
"
2
\n",
"
age
\n",
"
P(x <= 63.698)
\n",
"
0.75
\n",
"
0.661
\n",
"
0.75
\n",
"
\n",
"
\n",
"
3
\n",
"
weight
\n",
"
P(x <= 82.6638)
\n",
"
0.50
\n",
"
0.378
\n",
"
0.50
\n",
"
\n",
"
\n",
"
4
\n",
"
weight
\n",
"
P(x <= 100) (max)
\n",
"
1.00
\n",
"
0.729
\n",
"
1.00
\n",
"
\n",
"
\n",
"
5
\n",
"
gender
\n",
"
rate of 0.0
\n",
"
0.55
\n",
"
0.483
\n",
"
0.55
\n",
"
\n",
"
\n",
"
6
\n",
"
gender
\n",
"
rate of 1.0
\n",
"
0.45
\n",
"
0.517
\n",
"
0.45
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" feature constraint target pool_before pool_after\n",
"0 age P(x <= 41.3757) 0.25 0.164 0.25\n",
"1 age P(x <= 53.7175) 0.50 0.400 0.50\n",
"2 age P(x <= 63.698) 0.75 0.661 0.75\n",
"3 weight P(x <= 82.6638) 0.50 0.378 0.50\n",
"4 weight P(x <= 100) (max) 1.00 0.729 1.00\n",
"5 gender rate of 0.0 0.55 0.483 0.55\n",
"6 gender rate of 1.0 0.45 0.517 0.45"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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ERERGRgoICIiIiIiIiIDAwVEREREREREZGCggIiIiIiIiIgMDBQQERERERERkYGBAiIiIiIiIiIyMFBARERERERERAYGCoiIiIiIiIjIwEABERERERERERkYKCAiIiIiIiIiAwMFRERERERERGRgoICixbFjx+TKlSvc+0R+atu2bfLs2bPo3gwiimaXL1+W48ePR/dmEBGRFQYKKEKcOHFCLl265HL6QYMGyYIFC7j3ifxUjRo15Ny5c9G9GUQUzebNmydDhgyJ7s0gIiIrDBRQhFiyZIls3bo1wvYmahdQy0BERERERERRK2YUfx75qOHDh0fo+lC7ULJkSdYyEBERERERRTG2KPBT9+7dkz179hjP79+/r1oEvHz50qIP8YsXLyzed+3aNTl48KA8f/7cadeD169fy5EjR+T69et2+yS/evVKDh8+bPHe8+fPq+27ePGi2qZ//vkngr41Ednjyvlq7/zXxxyxdT7rgoODLdZviyvrxzquXr3KH5IoEt28eVOdy0FBQTbHEEBZwda5/vTpU9m+fbv6+8aNG3LgwIFQ5Qi4deuWej/OaVtcWT+2keUDIqJIpJFfOn36tBYrVizt6dOn6vno0aM1HA6rVq1Sz48dO6bFjRtXe/nypXp+7do1rXLlylq6dOm0EiVKaMmSJdMWLFhgrK958+ba0KFDjedHjhzRMmXKpOXMmVPLnTu31qpVKy1GjBjaoUOH1Ov169fX6tWrp+XIkUMrVaqUliBBAq1Xr17qtalTp2opUqTQsmbNqlWpUkVr0aJFlO4bIn/j7Hx1dv47Op/1/CRLlizq9Vy5cmmtW7d2e/1169ZV6yhfvry2aNGiKN0/RP6kd+/e6hzGuYh84Z133tEaN25svP7jjz9qSZMm1YoXL65lyJBBq1Gjhvbw4UP12r59+1TZok2bNlq+fPlUfpI2bVrt5MmTxvv79++vxY8fX70/c+bMYVp/y5YttTx58mh16tSJ0n1DRORP2KLAT+XOnVvSpUunag1h48aNUr16dfW//rxChQoSN25c9bxLly6SM2dOVau3f/9++f3336VHjx4qom/LBx98IM2aNZOzZ8/K6dOnJVu2bBISEmKRBi0H9u3bJ3v37lW1ApMnT1a1jR9++KFUrFhRfSZaFCxdujTS9weRP3N2vrpy/ts7n/X1169fXw1eeObMGcmcObPb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8UGgAAAAAAAA+AgUAAAAAAAAH4ECAAAAAABQ8JMZAgAAFIbff//dDhw4QOEjqc8BAIgGgQIA+bJlyxZLTU2NaMWSNWvWWCAQyHJf5cqVLS0tLV/7BVD49u/f787bqlWrWsmSkTcvDh48aOvWrbPy5cu758Zqv8EyMzNt3759eXoukAh0DgBANAgUAMiT1atX23XXXWfLly93DZBWrVrZhAkTrGbNmjk+p169enb00UdbuXLl/Pvuv/9+69mzZ772C6BwDR061P72t7+54F6JEiXskUcesb59+0b03Pvuu8+GDRtmV111lU2ePDlm+w127LHHhg1IAslix44dhX0IAIoZAgUA8pTC2LFjR2vUqJHNnj3bpfRefvnldu2119qnn36a63Nfeuklu/TSS2O+XwCFQ4E8dfTfe+89a926tb355pt29dVX24knnmgXXnhhrs+dOXOmCw6ce+65Md1vqFKlSrkfIFnx/QcQLSYzBBC1WbNm2apVq9yVvrJly1rFihVtyJAhrnOvTIDcKI34559/zjYEIb/7BVA4/vGPf9iVV17pOvOiv88++2x75plncn3e5s2b7cYbb7SXX37ZKlSoELP9AgCA/CNQACBqCxYscOOF69ev79+XkZHhP5YbpRefcsoprmNwyy232M6dO2Oy3+JCAZJvv/3WBUsipeDJ+vXrswVctJ8ff/wx7Gt899139ssvv8TkmIGcaHjQokWL3BChYOrQ53bO6jt6/fXX20033WQtWrSI2X4BAEBsMPQAQNR0JVBzDYSmNVaqVMk9lpPBgwfbnXfe6cYKf/XVV26YgQIFuqKY1/1qgrLgScq8cZjqiITLWihMv/76q11zzTW2detW27Vrl3Xp0sUeeOCBXJ/z2WefuQ6Vhl88/PDD7r758+dbnz59XLmo/OrUqePKUOWqztUdd9zhxnNv2rTJzj//fBs1alSeJ4FD8VUQ3399/3T+hZ63VapUybUuGDFihDtX77333pjuN6f6QIEHJnNDMuP7DyBatBwBRE2d0HBLLWlOAU06lpO//vWv/t+nnXaaPfjgg9arVy979tln7YgjjsjTfjWGWfsJ19HI7VgKw+jRo92kjK+//roLFlxxxRXWtm1bO+mkk8Juv3v3bvf+Onfu7DIItm/f7u5/7rnnXOBAk7ppxngFHKZNm+bmc1AmwdixY+2YY45xz9f+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heC5556zESNGWPfu3Sn/OJbr448/bq+88oq1adOGckaRNGXKFCtXrhyZRQVQrk2aNHH1Qa1atWL9ckBM0DaID9oGAJAzAgVxSGH7/vvv7eSTT7YGDRpke3zLli32+eefu+XOTj/9dKtcubK7f/v27fbuu+/axo0b3T6UatyyZUs79thj3eM//PCDffXVV5aWlmatWrWysmXLZklv/PDDD61z5862ePFit23r1q2tWrVq/lUN/dSoUcO9ZqlSpSxR7N27110VFL2v448/3k477TQrUaJEjuVau3ZtV5bbtm1zt+XMM8+0evXqub+/++47t63Kr2nTplnK+uuvv7affvrJzjnnHJeZsGnTJrv66qsL5b2jaNOVap2PBw8edOdj6DKnWnBm0aJF9uOPP9oJJ5zgOquezz77zGbOnOn+1ne0YsWKdvnll7vbylzSd2/r1q3WuHFjq1+/frahD6pX9D1XXaNO8fnnn+8e++2332zu3LluH3o9bZNIFi5caN9++637++ijj7b09HS/HsypXDVk7Pfff7c5c+a4+kTl1bFjR7eNbqusVW6nnnqqXx97Xn/9dffZ7tmzx5YsWeI+C20HhKJtULBoGwBA/hEoiKErr7zS1q1bZ9WrV3eNziFDhtif//xn//FnnnnGBg0a5DqlXifh2WefdR3NnTt3ug6vOhVqmK5Zs8Y14tUwvffee23kyJEuQKBOxa5du2z69Ol+x8JLb9QVMT1+0kknWaNGjaxSpUp2/fXX2yeffOJeUwEENYqnTp3qOiaJYN++fX6gQJ0fdRR0VfC9995z7z9cuWZkZNiKFStcEMF7bpUqVey4446zPn36uCuOLVq0cAEBjRF/++237ZRTTnHbvfnmm/bCCy+4gI06IuqEEChAqE8//dQmTJjgvjca5lK6dGmbNWuW1axZ0z2uwJU6owry6VzVnAbqZOr7WKFCBVuwYIH7jirYoPuOOeYYFyj4z3/+Y5deeqkLhOkcVsf3xhtvtNGjR2cZ+qCOq76/ev3mzZu7QIGCiV27dnUBzCOPPNIFDO666y4bPHhwwnyA6qzPmDHDL2OV49///ne74YYb3H3hylV1g36++OILV3+qbPTZqHz+8Ic/uHpY57lu33TTTfbYY4/5r6fyvPjii91nrKCi6mECBQhF26Dg0TYAgBgIIN9mz54dUFF269YtkJmZ6e77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",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"constraints = aggregate_target_constraints(before_d).merge(\n",
" aggregate_target_constraints(after_d),\n",
" on=[\"feature\", \"constraint\", \"target\"],\n",
" suffixes=(\"_before\", \"_after\"),\n",
")\n",
"display(constraints.round(3))\n",
"\n",
"fig = plot_aggregate_target_match(before_d, after_d)"
]
},
{
"cell_type": "markdown",
"id": "16a847f7",
"metadata": {},
"source": [
"## Takeaways\n",
"\n",
"- An `AggregateTarget` is the target's `n` plus whatever summary statistics are disclosed. Build one\n",
" by hand, load it from the standard long-format CSV (`feature,statistic,parameter,value`) with\n",
" `AggregateTarget.from_csv()`, write one with `to_csv()`, or use\n",
" `pybalance.sim.load_demo_aggregate_target` / `generate_aggregate_target` for ready-made examples.\n",
"- Every disclosed statistic is its own constraint, and only disclosed statistics are constrained: a\n",
" numeric feature needs at least one of **mean, std, median/quantile, min, max**, in any combination.\n",
" A **std** adds a variance constraint the solver actually enforces (it's quadratic in the pool values\n",
" but linear in the decision variables, so this is cheap for the CP-SAT solver); with a mean it is\n",
" the spread around that mean, without one the spread around the matched subset's own mean.\n",
"- Features in the `MatchingData` headers that the target does not disclose are left unconstrained\n",
" but still reported by `describe()`, so you can see how matching changed them.\n",
"- `AggregateTarget.categoric` rates can be **partially disclosed**: each disclosed level is a\n",
" constraint and an omitted level simply has none.\n",
"- `AggregateConstraintSatisfactionMatcher` always uses `AggregateTargetBalanceCalculator` -- there's\n",
" no `objective` to choose. `GeneticMatcher`, `PropensityScoreMatcher` and\n",
" `ConstraintSatisfactionMatcher` also accept `objective=\"aggregate_beta\"` (or a prebuilt\n",
" `AggregateTargetBalanceCalculator` instance) directly, since they already accept any\n",
" `BaseBalanceCalculator`.\n",
"- `EntropyBalanceWeighter`/`IPTWWeighter` are the remaining holdouts: they still hardcode the\n",
" mean/std `\"beta\"` objective and don't yet build an `AggregateTargetBalanceCalculator`\n",
" themselves. That's not silently wrong -- a target with a disclosed `median`/`quantile` makes\n",
" `compute_aggregate_feature_moments` raise a clear error there today, rather than matching the\n",
" wrong (raw, non-dichotomized) column."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "43862430-c092-483f-b5a9-ef11bd229e54",
"metadata": {},
"outputs": [],
"source": []
}
],
"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
}