Единый DGP для DML vs RCT vs IV vs DiD
Бизнес-событие во всех дизайнах одно: первая успешная оплата ЖКХ в приложении. Сначала генерируется один структурный мир клиентов и их потенциальные исходы, затем к нему применяются разные механизмы назначения воздействия.
- RCT / ITT: эффект случайного промо на PnL.
- IV / LATE: эффект первой оплаты для клиентов-комплаеров; промо служит инструментом.
- DML: эффект органического начала использования при selection on observables.
- DiD: динамика PnL после staggered adoption относительно ещё не начавших / never-treated.
Названия y, d, z, propensity и oracle-полей следуют соглашениям causalis.dgp. Сам генератор общий, потому что готовые DGP в пакете создают независимые миры и не позволяют честно сравнивать дизайны на одних клиентах.
Параметры сценария
Базовый сценарий удовлетворяет ключевым предпосылкам. Для stress-тестов меняйте hidden_confounding, did_trend_violation, anticipation_strength и overlap_strength.
{'n_clients': 20000, 'periods': 24, 'seed': 42, 'pre_month': 11, 'treatment_month': 12, 'post_month': 15, 'hidden_confounding': 0.0, 'did_trend_violation': 0.0, 'anticipation_strength': 0.0, 'overlap_strength': 1.0}
Генерация датасетов
| rows | columns | |
|---|---|---|
| clients | 20000 | 7 |
| rct | 20000 | 16 |
| iv | 20000 | 18 |
| dml | 20000 | 13 |
| did | 480000 | 14 |
| true_value | |
|---|---|
| ate_exposure_horizon | 88.224 |
| att_dml_horizon | 97.973 |
| itt_rct_horizon | 58.048 |
| late_iv_horizon | 90.165 |
| first_stage_rct | 0.644 |
Быстрые sanity checks
Эти проверки не являются оценивателями исследования, но подтверждают механику DGP. Wald ratio должен быть близок к oracle LATE, difference-in-means по z — к ITT.
| estimate | oracle | |
|---|---|---|
| RCT difference-in-means (ITT) | 60.720 | 58.048 |
| IV first stage | 0.644 | 0.644 |
| IV Wald (LATE) | 94.311 | 90.165 |
| value | |
|---|---|
| rct_assignment_rate | 0.493 |
| rct_treatment_z0 | 0.042 |
| rct_treatment_z1 | 0.685 |
| dml_treatment_rate | 0.488 |
| dml_propensity_p01 | 0.065 |
| dml_propensity_p99 | 0.959 |
| did_ever_treated_rate | 0.433 |
adoption_month 12.000 1342 14.000 1699 16.000 2170 18.000 3455 never 11334 Name: count, dtype: int64
Аналитические выборки без oracle leakage
Используйте объекты *_analysis в моделях. Полные датафреймы сохраняют истину только для расчёта bias/RMSE/coverage.
{'rct': ['client_id', 'income_z', 'digital', 'loyalty', 'risk', 'products_before', 'region', 'z', 'd', 'y_pre', 'y'], 'iv': ['client_id', 'income_z', 'digital', 'loyalty', 'risk', 'products_before', 'region', 'z', 'd', 'y_pre', 'y'], 'dml_features': ['income_z', 'digital', 'loyalty', 'risk', 'products_before', 'region', 'y_pre'], 'did': ['client_id', 'income_z', 'digital', 'loyalty', 'risk', 'products_before', 'region', 'month', 'adoption_month', 'event_time', 'd', 'y']}
Сценарии нарушений
При одинаковом seed потенциальные исходы и клиентские признаки остаются теми же; меняется только соответствующий механизм назначения/нарушения.
Опциональный экспорт
Ячейка ниже намеренно не выполняется автоматически. Она сохраняет и аналитические, и oracle-версии рядом с notebook.
Проверяем
| client_id | income_z | digital | loyalty | risk | products_before | region | |
|---|---|---|---|---|---|---|---|
| 0 | 0 | 0.305 | -1.658 | 0.124 | 0.635 | 0 | 2 |
| 1 | 1 | -1.040 | 0.891 | 0.353 | 0.560 | 3 | 2 |
| 2 | 2 | 0.750 | -0.058 | 0.609 | 0.731 | 1 | 0 |
| 3 | 3 | 0.941 | -0.600 | 0.481 | 0.201 | 2 | 1 |
| 4 | 4 | -1.951 | -0.251 | 0.071 | 0.369 | 1 | 1 |
| client_id | income_z | digital | loyalty | risk | products_before | region | z | d | y_pre | y | y0_true | tau_true | d_z0_true | d_z1_true | complier_true | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 0 | 0.305 | -1.658 | 0.124 | 0.635 | 0 | 2 | 1 | 1 | 105.048 | 291.477 | 235.545 | 55.932 | 0 | 1 | 1 |
| 1 | 1 | -1.040 | 0.891 | 0.353 | 0.560 | 3 | 2 | 1 | 0 | 357.247 | 307.036 | 307.036 | 107.639 | 0 | 0 | 0 |
| 2 | 2 | 0.750 | -0.058 | 0.609 | 0.731 | 1 | 0 | 1 | 1 | 253.680 | 505.302 | 431.588 | 73.714 | 0 | 1 | 1 |
| 3 | 3 | 0.941 | -0.600 | 0.481 | 0.201 | 2 | 1 | 0 | 0 | 401.763 | 238.932 | 238.932 | 89.378 | 0 | 1 | 1 |
| 4 | 4 | -1.951 | -0.251 | 0.071 | 0.369 | 1 | 1 | 1 | 0 | 66.070 | 232.011 | 232.011 | 83.864 | 0 | 0 | 0 |
| client_id | income_z | digital | loyalty | risk | products_before | region | d | y_pre | y | y0_true | propensity_true | tau_true | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 0 | 0.305 | -1.658 | 0.124 | 0.635 | 0 | 2 | 1 | 105.048 | 291.477 | 235.545 | 0.097 | 55.932 |
| 1 | 1 | -1.040 | 0.891 | 0.353 | 0.560 | 3 | 2 | 1 | 357.247 | 414.675 | 307.036 | 0.667 | 107.639 |
| 2 | 2 | 0.750 | -0.058 | 0.609 | 0.731 | 1 | 0 | 1 | 253.680 | 505.302 | 431.588 | 0.417 | 73.714 |
| 3 | 3 | 0.941 | -0.600 | 0.481 | 0.201 | 2 | 1 | 0 | 401.763 | 238.932 | 238.932 | 0.354 | 89.378 |
| 4 | 4 | -1.951 | -0.251 | 0.071 | 0.369 | 1 | 1 | 1 | 66.070 | 315.875 | 232.011 | 0.537 | 83.864 |