18.3 Megfigyeléses becslés és érzékenység

18.3.1 Cél és konkrét helyzet

Egy termékesapat e-mail kampányt vezetett be, de a kezelést nem randomizálták: a marketingrendszer a legaktívabb ügyfeleknek küldte az ajánlatot. Az elemző azt a kérdést kapja: „mennyi bevételt hoz a kampány a kontrollhoz képest?” A megfigyelési egység egy ügyfél, a kezelés T∈{0,1}T\in\{0,1\} (küldtek-e ajánlatot), a kimenet YY a 7 napos bevétel euróban, a zavaró változó XX az előzetes aktivitás (a kampány előtti megnyitások száma). A generatív folyamat ismert: az aktivitás növeli a küldés esélyét és a bevételt is; a kampány valódi hatása τ=1.0\tau=1.0 euró. A mért adatban az XX-et ismerjük, a kimenetet is, de a kezelés kiosztása nem véletlen. Előzetes becslés: a nyers átlagkülönbség felfelé torzít, mert XX pozitívan hat TT-re és YY-ra; az XX-re korrigált becslés várhatóan 1.01.0 körüli. A feladat: becsüljük meg a hatást, vizsgáljuk a közös tartományt (overlap), majd rejtsünk el egy második zavaró változót, és mutassuk meg, hogy a korrekció ekkor már nem elegendő.

18.3.2 Fogalmi magyarázat

A megfigyeléses becslés központi gondolata a hátsó ajtó intuíció (backdoor intuition). A DAG-on:

      X
     / \
    v   v
    T -> Y

Az XX egyszerre hat a kezelésre és a kimenetre. A nyers E[Y|T=1]−E[Y|T=0]E[Y|T=1]-E[Y|T=0] különbség nem csak a T→YT\to Y élen haladó hatást méri: tartalmazza az XX-en átmenő „hátsó ajtó” utat is. Ha XX-et blokkoljuk, azaz az összehasonlítást azonos XX-értékű rétegeken belül végezzük, a hátsó út megszakad. Ezt nevezzük korrekciónak (adjustment). A becsült átlagos oksági hatás (ATE, average treatment effect):

τ̂adj=ÊX[Ê(Y|T=1,X=x)−Ê(Y|T=0,X=x)]. \widehat{\tau}_{adj} = \hat E_X\!\left[\hat E(Y|T=1, X=x) - \hat E(Y|T=0, X=x)\right].

Itt E(Y|T=t,X=x)E(Y|T=t, X=x) a kimenet várható értéke a T=tT=t és X=xX=x feltétel mellett; diszkrét XX-re ezt a réteg átlagával becsüljük. Kis kontrollpélda: ha X=0X=0 mellett három kezelt ügyfél bevétele 2,3,12,3,1, akkor Ê(Y|T=1,X=0)=(2+3+1)/3=2\hat E(Y|T=1,X=0)=(2+3+1)/3=2. A feltételes várható érték tehát az a regressziós görbe, amely minden xx pontban az YY átlagát adja.

A gyakorlati becslés két fő úton történhet. A regressziós adjustment az YY modelljét illeszti a TT és XX magyarázó változókkal; a TT együtthatója a feltételes hatás becslése. A propensity score (hajlamérték) p(x)=P(T=1|X=x)p(x)=P(T=1|X=x) azt fejezi ki, mekkora eséllyel kerül valaki a kezelt csoportba az xx aktivitás mellett. A propensity score kiegyensúlyozó tulajdonsága szerint, ha XX elegendő a hátsó út blokkolásához, akkor a p(x)p(x)-re feltételesen a kezelés és a potenciális kimenetek közel függetlenek. Ezt kihasználhatjuk párosítással (matching): minden kezelt ügyfélhez hasonló score-ú kontrollt keresünk; vagy súlyozással (weighting): a kezelteket 1/p(x)1/p(x), a kontrollokat 1/(1−p(x))1/(1-p(x)) súllyal látjuk el, hogy a mintát mintegy újrasúlyozzuk a randomizált kísérlet eloszlásához. A stabilizált súlyok a marginális π=P(T=1)\pi=P(T=1) aránnyal osztanak: w1=π/p(x)w_1=\pi/p(x) és w0=(1−π)/(1−p(x))w_0=(1-\pi)/(1-p(x)), ezzel a szélsőséges súlyokat csökkentik.

A korrekció csak akkor értelmezhető, ha teljesül a pozitivitás (positivity): minden xx rétegben 0<P(T=1|X=x)<10<P(T=1|X=x)<1. Ha például minden nagyon aktív ügyfél kampányt kapott, akkor abban a rétegben nincs kontroll; a becslés ott extrapolál, és a kimenet kontrollbeli értékét már nem az adat határozza meg. Az overlap-vizsgálat a becsült propensity score eloszlását hasonlítja össze a kezelt és kontroll csoportban; ha a két hisztogram jól átfedi egymást, a pozitivitás a megfigyelt tartományon hihető.

A nem mért zavaró változó (unmeasured confounding) a leggyakoribb korlát. Legyen UU egy rejtett jellemző, amely egyszerre növeli a kezelés esélyét és a kimenetet, de az adatbázisban nem szerepel. Ekkor a DAG:

      X       U
     / \     / \
    v   v   v   v
    T ---------> Y

Az XX-re való korrekció nem blokkolja az UU-n átmenő utat. A becsült hatás torzítását közelítőleg a két rejtett él erősségének szorzata adja: ha UU egységnyi növekedése γU\gamma_U-val növeli a kezelés valószínűségét, és βU\beta_U-val a kimenetet, akkor a torzítás βUγU\beta_U\gamma_U nagyságrendű. Az érzékenységi elemzés (sensitivity analysis) azt kérdezi: mekkora rejtett UU kellene ahhoz, hogy az észlelt hatást teljesen megmagyarázza? A propensity score tehát a mért XX-eket próbálja kiegyensúlyozni, de a nem mért utat nem tudja elzárni.

18.3.3 Teljes minimális munkapélda

A következő kód a fenti folyamatot állítja elő, majd összehasonlítja a nyers és a korrigált becslést, overlap-vizsgálatot készít, végül elrejti UU-t. A kód automatikusan még nem ellenőrzött; a kimeneteket # szemléltető megjegyzéssel jelöljük, és a generatív paraméterekből levezetjük a várt irányt.

import numpy as np
import pandas as pd
import statsmodels.api as sm
import matplotlib.pyplot as plt

rng = np.random.default_rng(20261020)
n = 2000

# Mért zavaró változó: előzetes aktivitás, standard normális
X = rng.normal(0, 1, n)

# Kezelés: logit a mért X alapján
logit_score = 0.8 * X
p = 1 / (1 + np.exp(-logit_score))
T = rng.binomial(1, p, n)

# Valódi kimenet: tau=1.0 hatás, X lineáris hatása, zaj
epsilon = rng.normal(0, 1, n)
tau_true = 1.0
Y = 1.0 + tau_true * T + 1.5 * X + epsilon

df = pd.DataFrame({"X": X, "T": T, "Y": Y})

# 1) Nyers becslés
nyers = df.loc[df.T == 1, "Y"].mean() - df.loc[df.T == 0, "Y"].mean()

# 2) Regressziós adjustment
Xmat = sm.add_constant(df[["T", "X"]])
ols = sm.OLS(df["Y"], Xmat).fit()
tau_adj = ols.params["T"]
se_adj = ols.bse["T"]
ci_adj = ols.conf_int().loc["T"].to_numpy()

# 3) Propensity score becslése
logit_model = sm.Logit(df["T"], sm.add_constant(df["X"])).fit(disp=0)
df["ps"] = logit_model.predict(sm.add_constant(df["X"]))

# Overlap-vizsgálat
plt.hist(df.loc[df.T == 0, "ps"], bins=20, alpha=0.5, label="Kontroll (T=0)")
plt.hist(df.loc[df.T == 1, "ps"], bins=20, alpha=0.5, label="Kezelt (T=1)")
plt.xlabel("Becsült propensity score")
plt.ylabel("Gyakoriság")
plt.title("Overlap-vizsgálat")
plt.legend()

# 4) IPW becslés stabilizált súlyokkal
pi_hat = df["T"].mean()
w1 = pi_hat / df["ps"]
w0 = (1 - pi_hat) / (1 - df["ps"])
ipw_ate = (np.sum(w1 * df["T"] * df["Y"]) / np.sum(w1 * df["T"])
           - np.sum(w0 * (1 - df["T"]) * df["Y"]) / np.sum(w0 * (1 - df["T"])))

# 5) Rejtett U bevezetése
U = rng.normal(0, 1, n)
T2 = rng.binomial(1, 1 / (1 + np.exp(-(0.8 * X + 0.6 * U))))
Y2 = 1.0 + tau_true * T2 + 1.5 * X + 0.7 * U + rng.normal(0, 1, n)
df2 = pd.DataFrame({"X": X, "T": T2, "Y": Y2, "U": U})

# Az elemzésben U-t "elfelejtjük"; csak T2 és X szerepel
Xmat2 = sm.add_constant(df2[["T", "X"]])
ols2 = sm.OLS(df2["Y"], Xmat2).fit()
tau_hidden = ols2.params["T"]

print(f"Nyers: {nyers:.3f}")                     # szemléltető
print(f"OLS adjustment: {tau_adj:.3f}, SE={se_adj:.3f}")
print(f"IPW stabilizált: {ipw_ate:.3f}")          # szemléltető
print(f"Rejtett U melletti adjustment: {tau_hidden:.3f}")  # szemléltető

A szemléltető futásban a következőkre számítunk. A nyers becslés nagyobb, mint 1.01.0, mert a nagy aktivitású ügyfelek egyszerre kapnak gyakrabban kampányt és költenek többet. Az OLS adjustment a TT együtthatóra a generált τ=1.0\tau=1.0-hoz közeli értéket ad, és a 95%95\%-os konfidenciaintervallum a szemléltető futásban jellemzően tartalmazza az 1.01.0-t. Az IPW becslés hasonló pontbecslést produkál, de az IPW standard hibáját itt nem adjuk meg; ahhoz bootstrap vagy analitikus szendvicsbecslés kellene. Az overlap-ábra a két hisztogram jelentős átfedését mutatja, mert a propensity score a 0.050.05–0.950.95 tartományban marad. A rejtett UU változatban ezzel szemben a becsült hatás várhatóan 1.01.0 fölé tolódik, mert UU növeli a kezelés esélyét és a kimenetet is; a torzítás iránya pozitív.

18.3.4 Eredmény értelmezése

A kézi kontroll abból indul ki, hogy a generatív modellben τ=1.0\tau=1.0. Az OLS adjustment a következő feltételes modellt becsüli: E(Y|T,X)=b0+bTT+bXXE(Y|T,X)=b_0+b_TT+b_XX. Mivel az igazi kimenet lineáris, a bTb_T a feltételes hatás, és a modellben nincs TT–XX interakció, az ATE megegyezik ezzel a feltételes hatással. A nyers becslés ellenőrzése: E(Y|T=1)−E(Y|T=0)=τ+1.5(E(X|T=1)−E(X|T=0))E(Y|T=1)-E(Y|T=0)=\tau + 1.5(E(X|T=1)-E(X|T=0)), és mivel E(X|T=1)>0>E(X|T=0)E(X|T=1)>0>E(X|T=0), a nyers különbség 1.01.0-nál nagyobb. A propensity score és az OLS adjustment konzisztenciájának közös feltétele, hogy XX blokkolja a hátsó utat, a pozitivitás teljesül, és a kimeneti modell legalább közelítőleg helyes.

A rejtett UU esetben az XX-re korrigált becslés torzított, mert az UU kimaradásával a hátsó út egy része nyitva marad. A torzítás várható előjele ebben a szimulációban pozitív, mert γU=0.6\gamma_U=0.6 és βU=0.7\beta_U=0.7 egyaránt pozitív. A numerikus nagyság a véletlentől függ, de a seedelt futtatásban a tanuló ellenőrizheti, hogy a becsült érték 1.01.0-tól szisztematikusan felfelé tér el. Fontos, hogy ezt ne nevezzük „mérési” eredménynek addig, amíg a kódot helyben nem futtattuk; a fenti számok csak a generatív összefüggésekből adódó elméleti várakozások.

Érzékenységi elemzés: a propensity score súlyozás önmagában nem bizonyítja a zavarás megszüntetését. A pozitivitás ellenőrzése, a súlyok eloszlása és a súlyozás utáni kovariáns-egyensúly ellenőrzése szükséges; rejtett zavarásra külön érzékenységi forgatókönyv kell.

18.3.5 Feladatok

  1. Értelmezés. A DAG-ban X→TX\to T, X→YX\to Y és T→YT\to Y nyilak vannak. Magyarázd el, miért torzított a nyers átlagkülönbség, és miért blokkolja az XX-re való korrekció a hátsó ajtó utat. Add meg a feltételes várható értékes becslés képletét abban az esetben, amikor XX két lehetséges értéket vesz fel: x0=0x_0=0 és x1=1x_1=1.

  2. Implementálás. A fenti kódban az IPW becslés stabilizált súlyokat használ. Írd át a súlyozást úgy, hogy ne stabilizált, hanem közönséges IPW súlyokat használjon, és futtasd le a seedelt szimuláción. Milyen tulajdonságot vársz a becsült pontértéktől, és miben térhet el a stabilizált változattól? (A futtatáshoz a kódban a w1 = 1/df["ps"] és w0 = 1/(1-df["ps"]) sorokat használd.)

  3. Hibadiagnózis. Tegyük fel, hogy egy másik minta overlap-ábráján a kezelt csoport propensity score-ja mindenütt 0.950.95 felett van. Mi a probléma a pozitivitással? Melyik rétegben nincs elegendő kontroll? Adj egy olyan XX-értéket, amelynél ez bekövetkezhet a fenti generatív folyamat módosításával, és írd le, hogyan csökkenthető a hiba (például szűkítéssel vagy adatgyűjtéssel).

  4. Megváltozott feltétel. A rejtett UU szimulációban a γU=0.6\gamma_U=0.6 paramétert először csökkentsd 0.10.1-re, majd a βU=0.7\beta_U=0.7 paramétert növeld 1.51.5-re. Mindkét esetben magyarázd el, hogyan változik a rejtett confoundingból adódó torzítás nagysága. Melyik paraméterváltozás erősebb hatású, és miért?

18.3.6 Megoldások és indoklás

  1. A nyers különbség két csatornát kever: a TT oksági hatását YY-ra és az XX közös hatását. A TT és YY közötti nyers asszociáció tartalmazza az XX-en átmenő utat, mert a nagy XX-ű ügyfelek gyakrabban kapnak kezelést és gyakrabban költenek. Az XX-re való adjustment a megfigyeléseket azonos XX-rétegeken belül hasonlítja össze, így az XX szerinti összetétel már nem torzít. Diszkrét XX esetén τ̂adj=[Y‾(T=1,X=x1)−Y‾(T=0,X=x1)]P̂(X=x1)+[Y‾(T=1,X=x0)−Y‾(T=0,X=x0)]P̂(X=x0)\hat\tau_{adj}=[\bar Y(T=1,X=x_1)-\bar Y(T=0,X=x_1)]\hat P(X=x_1)+[\bar Y(T=1,X=x_0)-\bar Y(T=0,X=x_0)]\hat P(X=x_0).

  2. A nem stabilizált IPW súlyok w1=1/p(x)w_1=1/p(x) és w0=1/(1−p(x))w_0=1/(1-p(x)). A becsült ATE: τ̂IPW=(∑w1TiYi/∑w1Ti)−(∑w0(1−Ti)Yi/∑w0(1−Ti))\hat\tau_{IPW}=(\sum w_1T_iY_i/\sum w_1T_i)-(\sum w_0(1-T_i)Y_i/\sum w_0(1-T_i)). A pontbecslés várhatóan ugyancsak 1.01.0 körüli, de a nem stabilizált súlyok varianciája nagyobb, mert a nagyon kis p(x)p(x)-ű rétegek hatalmas súlyt kapnak. A feladat ellenőrző invariánsa: a becslés nem térhet el 1.01.0-tól olyan rendszeres, mint a nyers becslés; a két IPW-változat pontbecslése közel esik egymáshoz, de a súlyok eloszlása eltér.

  3. A 0.950.95 feletti propensity score azt jelenti, hogy az adott xx tartományban szinte mindenki kezelt, tehát P(T=1|X=x)≈1P(T=1|X=x)\approx1, ami sérti a pozitivitást. A kontrollréteg ott hiányzik, és a becslés a kontrollkimenetet extrapolációval pótolja. Például ha a generatív modellben a logit score 0.8X0.8X-ről 2.0X2.0X-re változik, akkor X=2X=2 esetén P(T=1|X=2)≈0.982P(T=1|X=2)\approx0.982, ami 0.950.95 felett van. A hiba csökkenthető az elemzés átfedő tartományra szűkítésével (például csak p(x)∈[0.1,0.9]p(x)\in[0.1,0.9] megfigyelésekkel), vagy további kontrollok gyűjtésével abban a rétegben.

  4. A torzítás βUγU\beta_U\gamma_U szorzattal arányos. Ha γU\gamma_U-t 0.60.6-ról 0.10.1-re csökkentjük, a torzítás hatodára esik; ha βU\beta_U-t 0.70.7-ről 1.51.5-re növeljük, a torzítás körülbelül kétszeresére nő. A két paraméter változásának hatása szimmetrikus a szorzatban, de az adott módosításoknál a γU\gamma_U csökkentés erősebb, mert 0.6→0.10.6\to0.1 hatásosabb, mint 0.7→1.50.7\to1.5. A válaszban a gyakorlati üzenet: a rejtett változó mindkét irányú erőssége számít.

18.3.7 Gyakori tévedés és önellenőrzés

Gyakori tévedés: „A propensity score korrigál minden confoundingot.” Ellenpélda a fenti szimuláció: az XX-re való propensity score adjustment vagy IPW becslés sem szünteti meg az UU hatását, mert UU nem szerepel a mért változók között. A propensity score kizárólag a mért XX-eket egyensúlyozza; a nem mért hátsó út nyitva marad. Ezért a propensity score soha nem igazolja önmagában az oksági állítást. A Függetlenség, kovariancia és függő adat alfejezetben látott kovarianciafogalom itt is segít: a TT és YY közötti asszociáció akkor is jelen van, ha TT nem oksági ok, mert egy közös ok korrelációt hoz létre. A Diagnosztika és robusztus standard error alfejezetben tárgyalt robusztus standard error a heteroszkedaszticitást kezeli, nem a zavaró változót; hiába kicsi a SE, ha a pontbecslés torzított. Végül a Duplikáció, kulcs és adatminőségi szerződés alfejezetből a megfigyelési egység ellenőrzése itt is kötelező: egy ügyfél egy sor, a kampány és a kimenet ugyanabban a sorban.

Önellenőrző kérdések: (1) Mi a különbség a mért és a nem mért confounding között? (2) Mit jelent a pozitivitás, és milyen ábra mutatja a sérülését? (3) Miért lehet egy stabilizált IPW-becslés varianciája kisebb, mint a közönséges IPW-becslésé? (4) Melyik irányba torzít a fenti szimulációban a rejtett UU, és miért?

18.3.8 Rövid összefoglaló

A megfigyeléses becslésben a nyers asszociáció keveri az oksági hatást és a közös okok hatását. A hátsó ajtó út azonosítása után a mért zavaró változóra való adjustment a rétegek közötti összehasonlítást teszi lehetővé. A pozitivitás és az overlap-vizsgálat azt ellenőrzi, hogy minden rétegben van-e kezelt és kontroll megfigyelés. A propensity score párosításra és súlyozásra használható, de nem blokkolja a nem mért utat. Az érzékenységi elemzés a rejtett változó erejét kérdezi, és a szimulált példa megmutatja, hogy egy rejtett UU a korrigált becslést is torzíthatja. A következő alkalmazás a kísérleti eredmény tudományos közlése, ahol ugyanezeket a korlátokat expliciten jelenteni kell.