✅ This will get us the point estimate
❌ This will get NOT us the correct confidence intervals
(on a sample of your data)
fit_ipw <- function(split, ...) {
.df <- analysis(split)
# fit propensity score model
propensity_model <- glm(
qsmk ~ sex +
race + age + I(age^2) + education +
smokeintensity + I(smokeintensity^2) +
smokeyrs + I(smokeyrs^2) + exercise + active +
wt71 + I(wt71^2),
family = binomial(),
data = .df
)
# calculate inverse probability weights
.df <- propensity_model |>
augment(type.predict = "response", data = .df) |>
mutate(wts = wt_ate(.fitted, qsmk, exposure_type = "binary"))
# fit correctly bootstrapped ipw model
lm(wt82_71 ~ qsmk, data = .df, weights = wts) |>
tidy()
}# Bootstrap sampling with apparent sample
# A tibble: 1,001 × 2
splits id
<list> <chr>
1 <split [1566/556]> Bootstrap0001
2 <split [1566/574]> Bootstrap0002
3 <split [1566/606]> Bootstrap0003
4 <split [1566/578]> Bootstrap0004
5 <split [1566/585]> Bootstrap0005
6 <split [1566/584]> Bootstrap0006
7 <split [1566/581]> Bootstrap0007
8 <split [1566/599]> Bootstrap0008
9 <split [1566/575]> Bootstrap0009
10 <split [1566/593]> Bootstrap0010
# ℹ 991 more rows
# Bootstrap sampling with apparent sample
# A tibble: 1,001 × 3
splits id boot_fits
<list> <chr> <list>
1 <split [1566/580]> Bootstrap0001 <tibble [2 × 5]>
2 <split [1566/581]> Bootstrap0002 <tibble [2 × 5]>
3 <split [1566/571]> Bootstrap0003 <tibble [2 × 5]>
4 <split [1566/571]> Bootstrap0004 <tibble [2 × 5]>
5 <split [1566/574]> Bootstrap0005 <tibble [2 × 5]>
6 <split [1566/580]> Bootstrap0006 <tibble [2 × 5]>
7 <split [1566/575]> Bootstrap0007 <tibble [2 × 5]>
8 <split [1566/564]> Bootstrap0008 <tibble [2 × 5]>
9 <split [1566/560]> Bootstrap0009 <tibble [2 × 5]>
10 <split [1566/576]> Bootstrap0010 <tibble [2 × 5]>
# ℹ 991 more rows
{survey}{survey}{propensity}This takes into account that you fit the propensity score model.
Inverse Probability Weight Estimator
Estimand: ATE
Propensity Score Model:
Call: glm(formula = qsmk ~ sex + race + age + I(age^2) + education +
smokeintensity + I(smokeintensity^2) + smokeyrs + I(smokeyrs^2) +
exercise + active + wt71 + I(wt71^2), family = binomial(),
data = nhefs_complete_uc)
Outcome Model:
Call: lm(formula = wt82_71 ~ qsmk, data = nhefs_complete_uc, weights = wts)
Estimates:
estimate std.err z ci.lower ci.upper conf.level p.value
diff 3.4405 0.48723 7.06145 2.4856 4.3955 0.95 1.648e-12 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
{propensity}This takes into account that you fit the propensity score model.
Slides by Dr. Lucy D’Agostino McGowan