# M1-LONG selection funnel + research-only IPW sensitivity (v2.1)

**Status:** RESEARCH ONLY · `RESEARCH_ATTRITION_ADJUSTMENT` · `score_authorized(M1)=false` · L1 untouched  
**Pack:** `wave2b-m1-long-selection-ipw-v2.1` · Astra `0420513f` full balance+overlap + prior `0a6e24af` strong-neg fix  
**Response to:** Astra/ChatGPT `0420513f` / `50fd44a2` · `0a6e24af` · `4d425973` / `8a1b5844`  
**Prior diagnostics:** `/docs/wave2b-m1-long-selection-diagnostics` still valid as baseline.  
**Provenance:** buggy v1 preserved at `/docs/wave2b-m1-long-selection-ipw-v1-buggy.json` (sha `fd25d065aad5b1e6fd2be0e2824b2d4c5eca6c45fa814f376564d8abb34b287b`).

## Target population / estimands (explicit)

TWO DISTINCT research estimands (do not conflate): (A) Completers / retained-pair estimand — unweighted 3×3 among N3=1424 usable ~12m same-person chains with origin in 201810–201912 (Michigan SCA fresh-cell). (B) IPW eligible-cohort estimand — RESEARCH_ATTRITION_ADJUSTMENT that reweights retained completers toward the N1 eligible origin cohort (valid PEXP) using observed covariates only. Neither is a US adult population statement.

**Manageability flags:** EXPLORATORY sensitivity flags (not confirmatory): (i) funnel stages reproducible; (ii) IPW ESS / N_retained >= 0.50 under truncation bands; (iii) post-weight |SMD| on modeled covariates mostly <0.20; (iv) 3x3 shares move <5pp absolute under IPW vs unweighted. Manageability ≠ population validity; unmeasured selection remains possible. See manageability_definition_note.  
**Protocol note:** 5pp absolute share-move and truncation bands (1–99 / 5–95) are labeled EXPLORATORY unless a timestamped predeclared protocol artifact exists. No such protocol timestamp was located at v2 publish; treat thresholds as exploratory sensitivity flags, not confirmatory gate criteria.

## Funnel (mutually exclusive; Codex clarification applied)

| Stage | N | Base |
|------|--:|------|
| A — source-cohort invalid/missing origin PEXP (before N1) | 164 | fresh any 5957 |
| B — no second interview / reint2 linkage | 2983 | N1=5793 |
| C — second interview but unusable third-interview pair | 1386 | N2=2810 |
| D — retained usable pair (N3) | 1424 | N1=5793 |

Cross-check: A+N1=fresh_any → `True`; B+C+D=N1 → `True`.  
Missing-origin PEXP is **not** double-counted inside 5793. Unknown disposition reasons inside B/C remain UNKNOWN.

## Official labels (8/9 = DK/refusal, not midpoints)

See JSON `official_labels` for SEX/EDUC/PEXP/PAGO. Substantive PEXP/PAGO analysis stays on {1,3,5}.

## Unavailable covariates (no proxies)

Income, employment, party ID, household size: **not** in this extract. Re-extract from SDA required.

## Pre-adjustment SMDs (descriptive flags, not validity thresholds)

| Covariate | Retained mean | Dropped mean | Std diff |
|-----------|---------------|--------------|----------|
| AGE | 55.387 | 48.124 | 0.439 |
| month_index (real time) | 24233.41 | 24232.76 | 0.153 |

Raw YYYYMM integer is **not** used as an interval (201812→201901 artifact).

## Research-only IPW (`RESEARCH_ATTRITION_ADJUSTMENT`)

- McFadden pseudo-R²: **0.0525** (low — does **not** prove ignorability)
- Stabilized ESS/N: **0.828** (min=0.44, max=4.60)
- Trunc 5–95 ESS/N: **0.873**
- Never official survey weights. Unmeasured selection remains possible.

## 3×3 PEXP×PAGO (match / any neg / strong neg / favorable)

**Strong negative definition:** Better(1)→Worse(5) ONLY (= cell[1][5]); NOT any pago>pexp. Any-negative = all pago>pexp cells (1→3 + 1→5 + 3→5).

| Spec | Match | Any neg | Strong neg | Favorable |
|------|------:|--------:|-----------:|----------:|
| Unweighted | 0.465590 | 0.268258 | 0.073736 | 0.266152 |
| IPW stabilized | 0.475508 | 0.277778 | 0.086535 | 0.246714 |
| IPW trunc 1–99 | 0.475590 | 0.277584 | 0.086438 | 0.246827 |
| IPW trunc 5–95 | 0.472941 | 0.278123 | 0.085825 | 0.248936 |

Unweighted check: strong = 105/1424 = 0.0737359551; any-neg = 382/1424 = 0.268258427 (unchanged).

## Post-weight balance vs eligible N1 (v2.1)

Continuous + every modeled categorical level (SEX/EDUC/REGION/PAGO/PEXP) and extras (origin_year/month/METHOD).  
Max |SMD| IPW (modeled cats): **0.0416** · continuous max |SMD| IPW: **0.0143** · levels ≥0.20: **0**.  
Exploratory “mostly <0.20” flag: **True** (descriptive only).

## Eligible-cohort overlap (v2.1)

Full N1 propensity: min=0.0310 max=0.6536 mean=0.2458.  
Retained range [0.0629, 0.6536]; share eligible inside retained range: **0.9936**. Heuristic only — not ignorability.

## Open review points

- **ADDRESSED (v2.1)** — full post-weight categorical + continuous SMDs vs eligible N1.
- **ADDRESSED (v2.1)** — overlap diagnostics cover full eligible N1 (not retained-only).
- **ADDRESSED** — estimand wording distinguishes completers (unweighted N3) vs IPW eligible cohort (N1).
- **OPEN/EXPLORATORY** — 5pp thresholds and truncation bands labeled exploratory absent timestamped predeclared protocol.
- **OPEN** — independent Claude/Codex replication; ChatGPT `/research` credential path; SDA re-extract for income/employment/party/HHsize.

## Verdict now

**CONDITIONAL_RESEARCH** — v2.2 is source-hardening only (paired-key joint mask, fail-closed unmatched weights, exploratory truncation metadata). Numerical outputs preserved vs v2.1 on the successful path. Independent methods adjudication still required. **No production adoption. M1 stays UNKNOWN / unscored. No M1 scoring / L1 changes.**

## Links

- JSON (canonical): `/docs/wave2b-m1-long-selection-ipw.json`
- JSON v2.2: `/docs/wave2b-m1-long-selection-ipw-v2.2.json`
- Memo v2.2: `/docs/wave2b-m1-long-selection-ipw-v2.2`
- Prior v2.1 preserved: `/docs/wave2b-m1-long-selection-ipw-v2.1.json`
- Prior v2 (strong-neg fix): `/docs/wave2b-m1-long-selection-ipw-v2`
- Buggy v1 preserved: `/docs/wave2b-m1-long-selection-ipw-v1-buggy.json`
- Balance CSV: `/docs/wave2b-m1-long-selection-ipw-balance.csv`
- Prior selection diag: `/docs/wave2b-m1-long-selection-diagnostics`
- Hub job: `b73c292a` · research: `c4daef50`
