class: center, middle, inverse, title-slide .title[ # Supercharge Your QI Program With Run Charts ] .subtitle[ ## R/Medicine 2022 | August 25 ] .author[ ### Robert L. Lobato, MD, MS ] .institute[ ### Chief, Division of Multispecialty Anesthesiology
University of Nebraska Medical Center ] --- # The Goal of QI is to Refine a Process ### Three Fundamental Steps -- 1. **Reduce variation** in how a process is performed by establishing a standardized practice using evidence-based guidelines -- 2. Deploy the standardized practice in a test environment and **measure improvement** -- 3. Expand adoption and **sustain improvements** over time --- # The Goal of QI is to Refine a Process <br> -- .center[ ## 1. How do you know that your QI program is working? ] <br> -- .center[ ## 2. How do you communicate your progress to stakeholders? ] --- class: title-slide-section-white, middle, hide-logo .center[ # Run Charts<span style="color:#666666"> are an answer<br>to both these questions</span> ] --- background-image: url("images/concept_run_chart.png") background-position: 50% 90% background-size: 70% # What Are Run Charts? .center[ ### A graphical method for visualizing **process variation**<br>and identifying trends or **changes in performance** ] ??? ggpomological theme by Garrick Aden-Buie --- # What Are Run Charts? ### Developed in the 1920s by Walter Shewhart of Bell Labs -- - Manufacturing ??? Toyota 1950s. Toyota Production System (TPS) -- - Business Operations (1990s) ??? Institute for Healthcare Improvement -- # <img src="images/berwick.jpg" width="70%" style="display: block; margin: auto;" /> --- background-image: url("images/basic_run_chart.png") background-position: 50% 100% background-size: 70% # How Do We Construct a Run Chart? -- 1. Plot an **outcome of interest** against a **relevant time interval** -- 2. Calculate and plot the **median** for the sample ??? It sounds too simple to be useful, right? Can use graph paper, Excel, or R! --- background-image: url("images/basic_run_chart.png") background-position: 50% 100% background-size: 70% # How Can Run Charts Improve QI? -- 1. Illustrating **variation** in an existing process -- 2. Detecting **changes in performance** over time --- background-image: url("images/basic_run_chart_lower_variation.png") background-position: 50% 100% background-size: 70% # Variation ### Difference between an ideal and an observed process -- - How consistent is a process? -- - Graphically, **dispersion around a central tendency** --- background-image: url("images/basic_run_chart_lower_variation_example.png") background-position: 50% 100% background-size: 70% # Why is Variation Important? -- 1. **Variation** can result from differences in any part of a process -- 2. QI seeks to **minimize variation** wherever possible --- background-image: url("images/basic_run_chart_with_shift.png") background-position: 50% 100% background-size: 70% # Detecting a Change in Performance -- - Pre-define number of **consecutive events** above or below the median that constitute a **run** -- - When a run is identified, a **new median** is calculated ??? Tremendously simple, but amazingly powerful --- background-image: url("images/basic_run_chart_with_shift.png") background-position: 50% 100% background-size: 70% # Defining a Run - Pre-specified number of **consecutive events** above or below the median -- - Specific to each individual QI program, based on **"meaningful change"** ??? Depends (in part) on the frequency of observations --- class:center,middle # Example from Clinical Practice --- # University of Nebraska Medical Center<br>Department of Anesthesiology .pull-left.w65[ - Level 1 trauma center in Omaha - Nebraska's only anesthesiology training program - Anesthesiologists, CRNAs, and anesthesiology residents - ~25,000 adult anesthetics per year ] .pull-right.w30[ ![](images/unmc_dusk.jpg)<!-- --> ] ??? The clinical example I want to use comes from my clinical work at UNMC --- background-image: url("images/nausea.png") background-position: 85% 50% background-size: 20% class:highlight-last-item # Post Operative Nausea and Vomiting<br>(PONV) - Common phenomenon after anesthesia -- - Important patient-centered outcome -- - Associated with increased healthcare cost -- - Well-recognized risk factors -- - Evidence-based society guidelines for<br>**preventative treatment** ??? Excellent candidate for a QI program --- # PONV as a CMS MIPS Measure <img src="images/MIPS_430.png" width="90%" /> **CMS:** Center for Medicare and Medicaid Services<br> **MIPS:** Merit-Based Incentive Payment System (Part of the Quality Payment Program) --- # UNMC MIPS 430 Performance
academic_year
surgery_month
success_rate
2021
2020-07-01
89.2%
2021
2020-08-01
88.8%
2021
2020-09-01
89.6%
2021
2020-10-01
92.3%
2021
2020-11-01
92.5%
2021
2020-12-01
89.7%
2021
2021-01-01
93.1%
2021
2021-02-01
90.9%
2021
2021-03-01
93.0%
mean
—
—
91.00%
median
—
—
90.87%
??? Outcome of interest. Relevant time interval. Job for a Run Chart. --- # {runcharter}<span style="color:#666666"> by John MacKintosh</span> .pull-left.w75[ ![](images/mackintosh_talk_screencap.png)<!-- --> ### R/Medicine 2020 Lightning Talk ] .pull-right.w20[ <br> <br> ![](images/mackintosh_talk_qr.png)<!-- --> ] --- # .pull-left[ ```r library(runcharter) runchart_output <- ponv_data_baseline %>% runcharter( * datecol = surgery_month, yval = success_rate, grpvar = plot_group, med_rows = 9, runlength = 3, direction = "both" ) ``` ] .pull-right[ <br> ## Variable containing <br>**time interval** ] --- # .pull-left[ ```r library(runcharter) runchart_output <- ponv_data_baseline %>% runcharter( datecol = surgery_month, * yval = success_rate, grpvar = plot_group, med_rows = 9, runlength = 3, direction = "both" ) ``` ] .pull-right[ <br> ## Variable containing <br>**outcome of interest** ] --- # .pull-left[ ```r library(runcharter) runchart_output <- ponv_data_baseline %>% runcharter( datecol = surgery_month, yval = success_rate, grpvar = plot_group, * med_rows = 9, runlength = 3, direction = "both" ) ``` ] .pull-right[ <br> ## Variable containing <br>**number of observations**<br>used to calculate<br>initial baseline ] --- # .pull-left[ ```r library(runcharter) runchart_output <- ponv_data_baseline %>% runcharter( datecol = surgery_month, yval = success_rate, grpvar = plot_group, med_rows = 9, * runlength = 3, direction = "both" ) ``` ] .pull-right[ <br> ## Variable containing <br>**number of consecutive events** that define a run ] --- # .pull-left[ ```r library(runcharter) runchart_output <- ponv_data_baseline %>% runcharter( datecol = surgery_month, yval = success_rate, grpvar = plot_group, med_rows = 9, runlength = 3, * direction = "both" ) ``` ] .pull-right[ <br> ## Analyze for shifts <br>**above** and **below** the baseline ] --- # .pull-left[ ```r library(runcharter) runchart_output <- ponv_data_baseline %>% runcharter( datecol = surgery_month, yval = success_rate, * grpvar = plot_group, med_rows = 9, runlength = 3, direction = "both" ) ``` ] .pull-right[ <br> ## Variable containing <br>**group**<br>(to be used for faceting) ] --- # <span style="color:black">{runcharter}</span> Output .pull-left.w65[ ``` ## $runchart ``` ![](index_files/figure-html/unnamed-chunk-13-1.png)<!-- --> ``` ## ## $sustained ## plot_group median start_date end_date extend_to run_type ## 1: 1 0.9087302 2020-07-01 2021-03-01 2021-04-01 baseline ``` ] -- .pull-right.w30[ <br> 1. ggplot run chart <br> <br> 2. Calculation of medians<br>(with rebasing) ] --- class: full, hide-logo <img src="index_files/figure-html/unnamed-chunk-14-1.png" width="100%" style="display: block; margin: auto;" /> ??? Very nice plot. Sensible number of decimal places. Identification of dates. Faceting label. --- # Baseline Performance on MIPS 430 <br> <br> .pull-left.w60[ ![](index_files/figure-html/unnamed-chunk-15-1.png)<!-- --> ] .pull-right.w35[ - Stable process - **"Common cause"** variation ] ??? From a QI point of view we see --- # Adding <span style="color:black">{ggplot}</span> Detail to Run Charts ```r *runchart_output$runchart + # <- this is a ggplot object facet_null() + theme_ipsum_rc() + scale_y_continuous(labels = scales::percent_format(accuracy = 1)) + scale_x_date(date_labels = "%b %Y") + theme(panel.grid.minor = element_blank(), panel.grid.major = element_blank()) + labs(title = "MIPS 430 Success Rate by Month", subtitle = "Prevention of PONV - Combination Therapy") ``` --- # Adding <span style="color:black">{ggplot}</span> Detail to Run Charts ```r runchart_output$runchart + * facet_null() + # <- remove faceting * theme_ipsum_rc() + # <- apply a theme * scale_y_continuous(labels = scales::percent_format(accuracy = 1)) + # <- reformat axes * scale_x_date(date_labels = "%b %Y") + # <- reformat axes * theme(panel.grid.minor = element_blank(), * panel.grid.major = element_blank()) + * labs(title = "MIPS 430 Success Rate by Month", # <- add title & subtitle * subtitle = "Prevention of PONV - Combination Therapy") # <- add title & subtitle ``` --- class: full, hide-logo <img src="index_files/figure-html/runchart-baseline-detail-1.png" width="100%" style="display: block; margin: auto;" /> --- # Department-Wide QI Program # -- - Large-group education through departmental **Grand Rounds** -- - Included as a quarterly metric in our **Value-Based Quality Incentive** program --- # First Quarter Performance -- ![](index_files/figure-html/runchart-initial-1.png)<!-- --> --- ```r runchart_output_initial$runchart + facet_null() + theme_ipsum_rc() + scale_y_continuous(labels = scales::percent_format(accuracy = 1)) + scale_x_date(date_labels = "%b %Y") + theme(panel.grid.minor = element_blank(), panel.grid.major = element_blank()) + labs(title = "MIPS 430 Success Rate by Month", subtitle = "Prevention of PONV - Combination Therapy") + * annotate("rect", xmin = ymd("2020-07-01"), xmax = ymd("2021-04-05"), * ymin = -Inf, ymax = Inf, alpha = 0.15) + * geom_vline(xintercept = ymd("2021-04-05")) + * annotate("text", x = ymd("2020-11-15"), y = 0.89, * label = "Historical Data", family = "Roboto Condensed") + * annotate("text", x = ymd("2021-04-10"), y = 0.89, * hjust = 0, color = "#AD122A", parse=TRUE, * label = "bold('Start of QI Project')", family = "Roboto Condensed") ``` ### _ggplot annotation layer geoms using custom fonts, colors, and parsed formatting._ -- # Super cool! --- class: full, hide-logo <img src="index_files/figure-html/runchart-initial-detail-1.png" width="100%" style="display: block; margin: auto;" /> --- class: center, middle <img src="https://media.giphy.com/media/s4VoCsFz8prlhSFCeS/giphy.gif" width="75%" /> --- # Second Quarter Performance -- <img src="index_files/figure-html/runchart-intermed-1.png" width="90%" style="display: block; margin: auto;" /> --- class: center, middle <img src="https://media.giphy.com/media/dXXhq8duJGAa5MYcBm/giphy.gif" width="50%" /> --- class: full, hide-logo <img src="index_files/figure-html/runchart-intermed-with-ellipse-1.png" width="100%" style="display: block; margin: auto;" /> ??? geom_mark_ellipse from {ggforce}. Draw attention to a subset of points in a plot --- class: # Sustainability Challenge .center[ <img src="images/sustainability.png" width="80%" /> ] --- # Department-Wide QI Program <span style="color:black">Part II</span> # -- - Large-group education through departmental **Grand Rounds** - Included as a quarterly metric in our **Value-Based Quality Incentive** program <br> <br> -- - Metric review at **Monthly Quality Conference** -- - Individual-clinician level quarterly reports of **Metric Success Rate** --- # Clinician-Level Performance Report .center[ <img src="images/performance_report.png" width="70%" /> ] --- # Third and Fourth Quarter Performance --- class: full, hide-logo <img src="index_files/figure-html/runchart-complete-1.png" width="100%" style="display: block; margin: auto;" /> ??? Increased intensity of feedback restored our performance gain. New run identified in spring 2022. New median rebased --- background-image: url("images/final_runchart_wide.gif") background-position: 50% 90% background-size: 45% # <span style="color:black">Supercharging QI with</span> Run Charts ??? Accessible to diverse audience. No math involved Algorithmic identification of runs is tremendously persuasive. Communicate with your audience more effectively. Themes, fonts, shading, annotation. Animation! -- - **Intuitive interpretation** of progress and setbacks -- - Display both **performance change** and **process variation** over time -- - {runcharter} output customizable to **increase stakeholder engagement** --- class: center # Thank You! .pull-left[ ### _R/Medicine 2022_ ### R Core Team ### R Foundation ### R Consortium ### Linux Foundation ] .pull-right[ ### John MacKintosh {runcharter} ### {ggplot}, {tidyverse}, {gt} ### Bob Rudis {hrbrthemes} ### Thousands of contributors! ]