@@ -427,49 +427,122 @@ <h2>Outcome Model</h2>
427
427
< h2 > 1. Create a function to run your analysis once on a sample of your data</ h2 >
428
428
< div class ="small ">
429
429
< div class ="cell " data-layout-align ="center ">
430
- < div class ="sourceCode cell-code " id ="cb2 " data-code-line-numbers ="|1-2|4-9|11-14| 16-18 "> < pre class ="sourceCode numberSource r number-lines code-with-copy "> < code class ="sourceCode r "> < span id ="cb2-1 "> < a href ="#cb2-1 "> </ a > fit_ipw < span class ="ot "> <-</ span > < span class ="cf "> function</ span > (split, ...) {</ span >
430
+ < div class ="sourceCode cell-code " id ="cb2 " data-code-line-numbers ="|1-2|5-13| 16-18|21-22 "> < pre class ="sourceCode numberSource r number-lines code-with-copy "> < code class ="sourceCode r "> < span id ="cb2-1 "> < a href ="#cb2-1 "> </ a > fit_ipw < span class ="ot "> <-</ span > < span class ="cf "> function</ span > (split, ...) {</ span >
431
431
< span id ="cb2-2 "> < a href ="#cb2-2 "> </ a > .df < span class ="ot "> <-</ span > < span class ="fu "> analysis</ span > (split)</ span >
432
432
< span id ="cb2-3 "> < a href ="#cb2-3 "> </ a > </ span >
433
433
< span id ="cb2-4 "> < a href ="#cb2-4 "> </ a > < span class ="co "> # fit propensity score model</ span > </ span >
434
434
< span id ="cb2-5 "> < a href ="#cb2-5 "> </ a > propensity_model < span class ="ot "> <-</ span > < span class ="fu "> glm</ span > (</ span >
435
- < span id ="cb2-6 "> < a href ="#cb2-6 "> </ a > exposure < span class ="sc "> ~</ span > confounder_1 < span class ="sc "> +</ span > confounder_2 < span class ="sc "> +</ span > ...</ span >
436
- < span id ="cb2-7 "> < a href ="#cb2-7 "> </ a > < span class ="at "> family =</ span > < span class ="fu "> binomial</ span > (), </ span >
437
- < span id ="cb2-8 "> < a href ="#cb2-8 "> </ a > < span class ="at "> data =</ span > .df</ span >
438
- < span id ="cb2-9 "> < a href ="#cb2-9 "> </ a > )</ span >
439
- < span id ="cb2-10 "> < a href ="#cb2-10 "> </ a > </ span >
440
- < span id ="cb2-11 "> < a href ="#cb2-11 "> </ a > < span class ="co "> # calculate inverse probability weights</ span > </ span >
441
- < span id ="cb2-12 "> < a href ="#cb2-12 "> </ a > .df < span class ="ot "> <-</ span > propensity_model < span class ="sc "> |></ span > </ span >
442
- < span id ="cb2-13 "> < a href ="#cb2-13 "> </ a > < span class ="fu "> augment</ span > (< span class ="at "> type.predict =</ span > < span class ="st "> "response"</ span > , < span class ="at "> data =</ span > .df) < span class ="sc "> |></ span > </ span >
443
- < span id ="cb2-14 "> < a href ="#cb2-14 "> </ a > < span class ="fu "> mutate</ span > (< span class ="at "> wts =</ span > < span class ="dv "> 1</ span > < span class ="sc "> /</ span > < span class ="fu "> ifelse</ span > (exposure < span class ="sc "> ==</ span > < span class ="dv "> 0</ span > , < span class ="dv "> 1</ span > < span class ="sc "> -</ span > .fitted, .fitted))</ span >
444
- < span id ="cb2-15 "> < a href ="#cb2-15 "> </ a > </ span >
445
- < span id ="cb2-16 "> < a href ="#cb2-16 "> </ a > < span class ="co "> # fit correctly bootsrapped ipw model</ span > </ span >
446
- < span id ="cb2-17 "> < a href ="#cb2-17 "> </ a > < span class ="fu "> lm</ span > (outcome < span class ="sc "> ~</ span > exposure, < span class ="at "> data =</ span > .df, < span class ="at "> weights =</ span > wts) < span class ="sc "> |></ span > </ span >
447
- < span id ="cb2-18 "> < a href ="#cb2-18 "> </ a > < span class ="fu "> tidy</ span > ()</ span >
448
- < span id ="cb2-19 "> < a href ="#cb2-19 "> </ a > }</ span > </ code > < button title ="Copy to Clipboard " class ="code-copy-button "> < i class ="bi "> </ i > </ button > </ pre > </ div >
435
+ < span id ="cb2-6 "> < a href ="#cb2-6 "> </ a > qsmk < span class ="sc "> ~</ span > sex < span class ="sc "> +</ span > </ span >
436
+ < span id ="cb2-7 "> < a href ="#cb2-7 "> </ a > race < span class ="sc "> +</ span > age < span class ="sc "> +</ span > < span class ="fu "> I</ span > (age< span class ="sc "> ^</ span > < span class ="dv "> 2</ span > ) < span class ="sc "> +</ span > education < span class ="sc "> +</ span > </ span >
437
+ < span id ="cb2-8 "> < a href ="#cb2-8 "> </ a > smokeintensity < span class ="sc "> +</ span > < span class ="fu "> I</ span > (smokeintensity< span class ="sc "> ^</ span > < span class ="dv "> 2</ span > ) < span class ="sc "> +</ span > </ span >
438
+ < span id ="cb2-9 "> < a href ="#cb2-9 "> </ a > smokeyrs < span class ="sc "> +</ span > < span class ="fu "> I</ span > (smokeyrs< span class ="sc "> ^</ span > < span class ="dv "> 2</ span > ) < span class ="sc "> +</ span > exercise < span class ="sc "> +</ span > active < span class ="sc "> +</ span > </ span >
439
+ < span id ="cb2-10 "> < a href ="#cb2-10 "> </ a > wt71 < span class ="sc "> +</ span > < span class ="fu "> I</ span > (wt71< span class ="sc "> ^</ span > < span class ="dv "> 2</ span > ), </ span >
440
+ < span id ="cb2-11 "> < a href ="#cb2-11 "> </ a > < span class ="at "> family =</ span > < span class ="fu "> binomial</ span > (), </ span >
441
+ < span id ="cb2-12 "> < a href ="#cb2-12 "> </ a > < span class ="at "> data =</ span > .df</ span >
442
+ < span id ="cb2-13 "> < a href ="#cb2-13 "> </ a > )</ span >
443
+ < span id ="cb2-14 "> < a href ="#cb2-14 "> </ a > </ span >
444
+ < span id ="cb2-15 "> < a href ="#cb2-15 "> </ a > < span class ="co "> # calculate inverse probability weights</ span > </ span >
445
+ < span id ="cb2-16 "> < a href ="#cb2-16 "> </ a > .df < span class ="ot "> <-</ span > propensity_model < span class ="sc "> |></ span > </ span >
446
+ < span id ="cb2-17 "> < a href ="#cb2-17 "> </ a > < span class ="fu "> augment</ span > (< span class ="at "> type.predict =</ span > < span class ="st "> "response"</ span > , < span class ="at "> data =</ span > .df) < span class ="sc "> |></ span > </ span >
447
+ < span id ="cb2-18 "> < a href ="#cb2-18 "> </ a > < span class ="fu "> mutate</ span > (< span class ="at "> wts =</ span > < span class ="fu "> wt_ate</ span > (.fitted, qsmk, < span class ="at "> exposure_type =</ span > < span class ="st "> "binary"</ span > ))</ span >
448
+ < span id ="cb2-19 "> < a href ="#cb2-19 "> </ a > </ span >
449
+ < span id ="cb2-20 "> < a href ="#cb2-20 "> </ a > < span class ="co "> # fit correctly bootstrapped ipw model</ span > </ span >
450
+ < span id ="cb2-21 "> < a href ="#cb2-21 "> </ a > < span class ="fu "> lm</ span > (wt82_71 < span class ="sc "> ~</ span > qsmk, < span class ="at "> data =</ span > .df, < span class ="at "> weights =</ span > wts) < span class ="sc "> |></ span > </ span >
451
+ < span id ="cb2-22 "> < a href ="#cb2-22 "> </ a > < span class ="fu "> tidy</ span > ()</ span >
452
+ < span id ="cb2-23 "> < a href ="#cb2-23 "> </ a > }</ span > </ code > < button title ="Copy to Clipboard " class ="code-copy-button "> < i class ="bi "> </ i > </ button > </ pre > </ div >
449
453
</ div >
450
454
</ div >
451
455
</ section >
452
456
< section id ="use-rsample-to-bootstrap-our-causal-effect " class ="slide level2 ">
453
457
< h2 > 2. Use {rsample} to bootstrap our causal effect</ h2 >
454
458
< div class ="cell " data-layout-align ="center ">
455
- < div class ="sourceCode cell-code " id ="cb3 " data-code-line-numbers ="|4|5 "> < pre class ="sourceCode numberSource r number-lines code-with-copy "> < code class ="sourceCode r "> < span id ="cb3-1 "> < a href ="#cb3-1 "> </ a > < span class ="fu "> library</ span > (rsample)</ span >
459
+ < div class ="sourceCode cell-code " id ="cb3 " data-code-line-numbers ="|4-8 "> < pre class ="sourceCode numberSource r number-lines code-with-copy "> < code class ="sourceCode r "> < span id ="cb3-1 "> < a href ="#cb3-1 "> </ a > < span class ="fu "> library</ span > (rsample)</ span >
456
460
< span id ="cb3-2 "> < a href ="#cb3-2 "> </ a > </ span >
457
461
< span id ="cb3-3 "> < a href ="#cb3-3 "> </ a > < span class ="co "> # fit ipw model to bootstrapped samples</ span > </ span >
458
- < span id ="cb3-4 "> < a href ="#cb3-4 "> </ a > ipw_results < span class ="ot "> <-</ span > < span class ="fu "> bootstraps</ span > (df, < span class ="dv "> 1000</ span > , < span class ="at "> apparent =</ span > < span class ="cn "> TRUE</ span > ) < span class ="sc "> |></ span > </ span >
459
- < span id ="cb3-5 "> < a href ="#cb3-5 "> </ a > < span class ="fu "> mutate</ span > (< span class ="at "> results =</ span > < span class ="fu "> map</ span > (splits, fit_ipw)) </ span > </ code > < button title ="Copy to Clipboard " class ="code-copy-button "> < i class ="bi "> </ i > </ button > </ pre > </ div >
462
+ < span id ="cb3-4 "> < a href ="#cb3-4 "> </ a > bootstrapped_nhefs < span class ="ot "> <-</ span > < span class ="fu "> bootstraps</ span > (</ span >
463
+ < span id ="cb3-5 "> < a href ="#cb3-5 "> </ a > nhefs_complete_uc, </ span >
464
+ < span id ="cb3-6 "> < a href ="#cb3-6 "> </ a > < span class ="at "> times =</ span > < span class ="dv "> 1000</ span > , </ span >
465
+ < span id ="cb3-7 "> < a href ="#cb3-7 "> </ a > < span class ="at "> apparent =</ span > < span class ="cn "> TRUE</ span > </ span >
466
+ < span id ="cb3-8 "> < a href ="#cb3-8 "> </ a > )</ span >
467
+ < span id ="cb3-9 "> < a href ="#cb3-9 "> </ a > </ span >
468
+ < span id ="cb3-10 "> < a href ="#cb3-10 "> </ a > bootstrapped_nhefs</ span > </ code > < button title ="Copy to Clipboard " class ="code-copy-button "> < i class ="bi "> </ i > </ button > </ pre > </ div >
469
+ </ div >
470
+
471
+ </ section >
472
+ < section id ="use-rsample-to-bootstrap-our-causal-effect-output " class ="slide level2 output-location-slide "> < h2 > 2. Use {rsample} to bootstrap our causal effect</ h2 > < div class ="cell output-location-slide " data-layout-align ="center ">
473
+ < div class ="cell-output cell-output-stdout ">
474
+ < pre > < code > # Bootstrap sampling with apparent sample
475
+ # A tibble: 1,001 × 2
476
+ splits id
477
+ <list> <chr>
478
+ 1 <split [1566/587]> Bootstrap0001
479
+ 2 <split [1566/555]> Bootstrap0002
480
+ 3 <split [1566/590]> Bootstrap0003
481
+ 4 <split [1566/599]> Bootstrap0004
482
+ 5 <split [1566/580]> Bootstrap0005
483
+ 6 <split [1566/574]> Bootstrap0006
484
+ 7 <split [1566/572]> Bootstrap0007
485
+ 8 <split [1566/569]> Bootstrap0008
486
+ 9 <split [1566/562]> Bootstrap0009
487
+ 10 <split [1566/581]> Bootstrap0010
488
+ # ℹ 991 more rows</ code > </ pre >
489
+ </ div >
490
+ </ div > </ section > < section id ="use-rsample-to-bootstrap-our-causal-effect-1 " class ="slide level2 ">
491
+ < h2 > 2. Use {rsample} to bootstrap our causal effect</ h2 >
492
+ < div class ="cell " data-layout-align ="center ">
493
+ < div class ="sourceCode cell-code " id ="cb5 "> < pre class ="sourceCode numberSource r number-lines code-with-copy "> < code class ="sourceCode r "> < span id ="cb5-1 "> < a href ="#cb5-1 "> </ a > < span class ="fu "> fit_ipw</ span > (bootstrapped_nhefs< span class ="sc "> $</ span > splits[[< span class ="dv "> 1</ span > ]])</ span > </ code > < button title ="Copy to Clipboard " class ="code-copy-button "> < i class ="bi "> </ i > </ button > </ pre > </ div >
494
+ < div class ="cell-output cell-output-stdout ">
495
+ < pre > < code > # A tibble: 2 × 5
496
+ term estimate std.error statistic p.value
497
+ <chr> <dbl> <dbl> <dbl> <dbl>
498
+ 1 (Intercept) 1.83 0.288 6.34 2.93e-10
499
+ 2 qsmk 3.44 0.407 8.44 7.05e-17</ code > </ pre >
500
+ </ div >
460
501
</ div >
461
502
</ section >
503
+ < section id ="use-rsample-to-bootstrap-our-causal-effect-2 " class ="slide level2 ">
504
+ < h2 > 2. Use {rsample} to bootstrap our causal effect</ h2 >
505
+ < div class ="cell " data-layout-align ="center " data-hash ="09-outcome-model_cache/revealjs/unnamed-chunk-6_c36ed8a218cdecbdeba4d712e8ce45bb ">
506
+ < div class ="sourceCode cell-code " id ="cb7 " data-code-line-numbers ="|2 "> < pre class ="sourceCode numberSource r number-lines code-with-copy "> < code class ="sourceCode r "> < span id ="cb7-1 "> < a href ="#cb7-1 "> </ a > ipw_results < span class ="ot "> <-</ span > bootstrapped_nhefs < span class ="sc "> |></ span > </ span >
507
+ < span id ="cb7-2 "> < a href ="#cb7-2 "> </ a > < span class ="fu "> mutate</ span > (< span class ="at "> boot_fits =</ span > < span class ="fu "> map</ span > (splits, fit_ipw)) </ span >
508
+ < span id ="cb7-3 "> < a href ="#cb7-3 "> </ a > </ span >
509
+ < span id ="cb7-4 "> < a href ="#cb7-4 "> </ a > ipw_results</ span > </ code > < button title ="Copy to Clipboard " class ="code-copy-button "> < i class ="bi "> </ i > </ button > </ pre > </ div >
510
+ </ div >
511
+
512
+ </ section >
513
+ < section id ="use-rsample-to-bootstrap-our-causal-effect-2-output " class ="slide level2 output-location-slide "> < h2 > 2. Use {rsample} to bootstrap our causal effect</ h2 > < div class ="cell output-location-slide " data-layout-align ="center " data-hash ="09-outcome-model_cache/revealjs/unnamed-chunk-6_c36ed8a218cdecbdeba4d712e8ce45bb ">
514
+ < div class ="cell-output cell-output-stdout ">
515
+ < pre > < code > # Bootstrap sampling with apparent sample
516
+ # A tibble: 1,001 × 3
517
+ splits id boot_fits
518
+ <list> <chr> <list>
519
+ 1 <split [1566/587]> Bootstrap0001 <tibble [2 × 5]>
520
+ 2 <split [1566/555]> Bootstrap0002 <tibble [2 × 5]>
521
+ 3 <split [1566/590]> Bootstrap0003 <tibble [2 × 5]>
522
+ 4 <split [1566/599]> Bootstrap0004 <tibble [2 × 5]>
523
+ 5 <split [1566/580]> Bootstrap0005 <tibble [2 × 5]>
524
+ 6 <split [1566/574]> Bootstrap0006 <tibble [2 × 5]>
525
+ 7 <split [1566/572]> Bootstrap0007 <tibble [2 × 5]>
526
+ 8 <split [1566/569]> Bootstrap0008 <tibble [2 × 5]>
527
+ 9 <split [1566/562]> Bootstrap0009 <tibble [2 × 5]>
528
+ 10 <split [1566/581]> Bootstrap0010 <tibble [2 × 5]>
529
+ # ℹ 991 more rows</ code > </ pre >
530
+ </ div >
531
+ </ div > </ section > < section id ="use-rsample-to-bootstrap-our-causal-effect-3 " class ="slide level2 ">
532
+ < h2 > 2. Use {rsample} to bootstrap our causal effect</ h2 >
533
+
534
+ < img data-src ="09-outcome-model_files/figure-revealjs/unnamed-chunk-7-1.png " style ="width:80.0% " class ="r-stretch quarto-figure-center "> </ section >
462
535
< section id ="pull-out-the-causal-effect " class ="slide level2 ">
463
536
< h2 > 3. Pull out the causal effect</ h2 >
464
537
< div class ="cell " data-layout-align ="center ">
465
- < div class ="sourceCode cell-code " id ="cb4 " data-code-line-numbers ="|2 "> < pre class ="sourceCode numberSource r number-lines code-with-copy "> < code class ="sourceCode r "> < span id ="cb4 -1 "> < a href ="#cb4 -1 "> </ a > < span class ="co "> # get t-statistic-based CIs</ span > </ span >
466
- < span id ="cb4 -2 "> < a href ="#cb4 -2 "> </ a > boot_estimate < span class ="ot "> <-</ span > < span class ="fu "> int_t</ span > (ipw_results, results ) < span class ="sc "> |></ span > </ span >
467
- < span id ="cb4 -3 "> < a href ="#cb4 -3 "> </ a > < span class ="fu "> filter</ span > (term < span class ="sc "> ==</ span > < span class ="st "> "exposure"</ span > )</ span > </ code > < button title ="Copy to Clipboard " class ="code-copy-button "> < i class ="bi "> </ i > </ button > </ pre > </ div >
538
+ < div class ="sourceCode cell-code " id ="cb9 " data-code-line-numbers ="|2 "> < pre class ="sourceCode numberSource r number-lines code-with-copy "> < code class ="sourceCode r "> < span id ="cb9 -1 "> < a href ="#cb9 -1 "> </ a > < span class ="co "> # get t-statistic-based CIs</ span > </ span >
539
+ < span id ="cb9 -2 "> < a href ="#cb9 -2 "> </ a > boot_estimate < span class ="ot "> <-</ span > < span class ="fu "> int_t</ span > (ipw_results, boot_fits ) < span class ="sc "> |></ span > </ span >
540
+ < span id ="cb9 -3 "> < a href ="#cb9 -3 "> </ a > < span class ="fu "> filter</ span > (term < span class ="sc "> ==</ span > < span class ="st "> "exposure"</ span > )</ span > </ code > < button title ="Copy to Clipboard " class ="code-copy-button "> < i class ="bi "> </ i > </ button > </ pre > </ div >
468
541
</ div >
469
542
</ section >
470
543
< section id ="your-turn " class ="slide level2 ">
471
544
< h2 > < em > Your Turn</ em > </ h2 >
472
- < p > </ p > < div class ="countdown " id ="timer_0c369917 " data-update-every ="1 " tabindex ="0 " style ="right:0;bottom:0; "> < div class ="countdown-controls "> < button class ="countdown-bump-down "> −</ button > < button class ="countdown-bump-up "> +</ button > </ div > < code class ="countdown-time "> < span class ="countdown-digits minutes "> 12</ span > < span class ="countdown-digits colon "> :</ span > < span class ="countdown-digits seconds "> 00</ span > </ code > </ div > < p > </ p >
545
+ < p > </ p > < div class ="countdown " id ="timer_ee2d5071 " data-update-every ="1 " tabindex ="0 " style ="right:0;bottom:0; "> < div class ="countdown-controls "> < button class ="countdown-bump-down "> −</ button > < button class ="countdown-bump-up "> +</ button > </ div > < code class ="countdown-time "> < span class ="countdown-digits minutes "> 12</ span > < span class ="countdown-digits colon "> :</ span > < span class ="countdown-digits seconds "> 00</ span > </ code > </ div > < p > </ p >
473
546
< h3 id ="create-a-function-called-ipw_fit-that-fits-the-propensity-score-model-and-the-weighted-outcome-model-for-the-effect-between-extra_magic_morning-and-avg_spostmin "> Create a function called < code > ipw_fit</ code > that fits the propensity score model and the weighted outcome model for the effect between < code > extra_magic_morning</ code > and < code > avg_spostmin</ code > </ h3 >
474
547
< h3 id ="using-the-bootstraps-and-int_t-functions-to-estimate-the-final-effect. "> Using the < code > bootstraps()</ code > and < code > int_t()</ code > functions to estimate the final effect.</ h3 >
475
548
< div class ="footer footer-default ">
0 commit comments