Project: Mental Health Screening Quality
Improvement
Location: Lari Hospital
Team: Lari Hospital QI Team
Date: 2025-06-18
This report presents the baseline data and early results of the Mental Health Screening QI project at Lari Hospital. The report includes descriptive statistics, screening performance, run/control charts, and recommendations.
derived_data <- read_csv("data/processed/baseline_derived.csv", show_col_types = FALSE)
summary(derived_data)
## record_id patient_id timestamp
## Min. : 1 Length:553 Min. :2025-02-14 01:14:18.00
## 1st Qu.:139 Class :character 1st Qu.:2025-02-27 23:15:48.00
## Median :277 Mode :character Median :2025-03-26 05:27:54.00
## Mean :277 Mean :2025-03-28 21:54:43.88
## 3rd Qu.:415 3rd Qu.:2025-04-23 05:47:00.00
## Max. :553 Max. :2025-05-23 01:01:48.00
##
## date_of_visit age age_group sex
## Min. :2024-11-27 Min. : 13.00 Length:553 Length:553
## 1st Qu.:2025-02-26 1st Qu.: 45.00 Class :character Class :character
## Median :2025-03-26 Median : 60.00 Mode :character Mode :character
## Mean :2025-03-25 Mean : 68.19
## 3rd Qu.:2025-04-23 3rd Qu.: 70.00
## Max. :2025-05-22 Max. :1996.00
##
## diagnoses bmh_7_screening_completed phq_2_score
## Length:553 Length:553 Min. :0.000
## Class :character Class :character 1st Qu.:0.000
## Mode :character Mode :character Median :2.000
## Mean :2.158
## 3rd Qu.:4.000
## Max. :6.000
## NA's :496
## phq_2_screening_completed gad_2_score gad_2_screening_completed
## Length:553 Min. :0.000 Length:553
## Class :character 1st Qu.:0.000 Class :character
## Mode :character Median :2.000 Mode :character
## Mean :1.946
## 3rd Qu.:3.000
## Max. :6.000
## NA's :498
## aud_c_score aud_c_screening_completed phq_9_score
## Min. : 0.000 Length:553 Min. : 0.0
## 1st Qu.: 0.000 Class :character 1st Qu.: 3.5
## Median : 0.000 Mode :character Median : 7.0
## Mean : 1.139 Mean : 7.0
## 3rd Qu.: 0.000 3rd Qu.:10.5
## Max. :11.000 Max. :14.0
## NA's :517 NA's :551
## phq_9_screening_completed gad_7_score gad_7_screening_completed
## Length:553 Min. :12 Length:553
## Class :character 1st Qu.:14 Class :character
## Mode :character Median :16 Mode :character
## Mean :16
## 3rd Qu.:18
## Max. :20
## NA's :551
## audit_10_score audit_10_screening_completed any_prior_mental_health_diagnosis
## Mode:logical Length:553 Length:553
## NA's:553 Class :character Class :character
## Mode :character Mode :character
##
##
##
##
## documented_mental_health_diagnosis blood_pressure_completed
## Length:553 Length:553
## Class :character Class :character
## Mode :character Mode :character
##
##
##
##
## blood_pressure_mm_hg weight_completed weight_kg pulse_rate_completed
## Length:553 Length:553 Min. : 0.0 Length:553
## Class :character Class :character 1st Qu.: 60.0 Class :character
## Mode :character Mode :character Median : 70.0 Mode :character
## Mean : 71.3
## 3rd Qu.: 80.0
## Max. :130.0
## NA's :190
## pulse_rate_bpm temperature_completed temperature_c scan_url
## Min. : 8.0 Length:553 Min. : 0.00 Length:553
## 1st Qu.: 71.0 Class :character 1st Qu.:36.10 Class :character
## Median : 79.0 Mode :character Median :36.40 Mode :character
## Mean : 80.7 Mean :36.15
## 3rd Qu.: 91.0 3rd Qu.:36.60
## Max. :139.0 Max. :63.90
## NA's :74 NA's :319
## clinic screened_phq2 screened_gad2 screened_audc
## Length:553 Mode :logical Mode :logical Mode :logical
## Class :character FALSE:496 FALSE:498 FALSE:517
## Mode :character TRUE :57 TRUE :55 TRUE :36
##
##
##
##
## screened_bmh7 screening_complete flagged_phq2 flagged_gad2
## Mode :logical Mode :logical Mode :logical Mode :logical
## FALSE:474 FALSE:523 FALSE:35 FALSE:36
## TRUE :79 TRUE :30 TRUE :22 TRUE :19
## NA's :496 NA's :498
##
##
##
## flagged_audc any_flagged vitals_complete mh_documented
## Mode :logical Mode :logical Mode :logical Mode :logical
## FALSE:31 FALSE:35 FALSE:347 FALSE:435
## TRUE :5 TRUE :30 TRUE :206 TRUE :118
## NA's :517 NA's :488
##
##
##
## prior_mh_known new_mh_identified
## Mode :logical Mode :logical
## FALSE:443 FALSE:540
## TRUE :104 NA's :13
## NA's :6
##
##
##
desc <- read_csv("data/processed/baseline_descriptive_summary.csv", show_col_types = FALSE)
kable(desc, caption = "Descriptive Statistics Summary") %>%
kable_styling(full_width = FALSE)
| domain | total_patients | avg_age | age_sd | screened_phq2 | screened_gad2 | screened_audc | screened_bmh7 | complete_screening | flagged_phq2 | flagged_gad2 | flagged_audc | any_flagged | complete_vitals | missing_vitals | mh_documented | new_mh_identified |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| demographics | 553 | 68.18807 | 142.7476 | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA |
| screening | NA | NA | NA | 57 | 55 | 36 | 79 | 30 | NA | NA | NA | NA | NA | NA | NA | NA |
| flagging | NA | NA | NA | NA | NA | NA | NA | NA | 22 | 19 | 5 | 30 | NA | NA | NA | NA |
| vitals | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | 206 | 347 | NA | NA |
| mental_health | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | 118 | 0 |
sex_dist <- read_csv("data/processed/baseline_sex_distribution.csv", show_col_types = FALSE)
kable(sex_dist, caption = "Sex Distribution") %>%
kable_styling(full_width = FALSE)
| Sex | Count |
|---|---|
| Female | 395 |
| Male | 158 |
kable(read_csv("data/processed/cross_tab_sex.csv", show_col_types = FALSE), caption = "Cross-tabulation by Sex") %>%
kable_styling(full_width = FALSE)
| sex | total_patients | screened_phq2 | screened_gad2 | screened_audc | screened_bmh7 | complete_screening | any_flagged | mh_documented |
|---|---|---|---|---|---|---|---|---|
| Female | 395 | 37 | 37 | 25 | 51 | 22 | 18 | 77 |
| Male | 158 | 20 | 18 | 11 | 28 | 8 | 12 | 41 |
kable(read_csv("data/processed/cross_tab_age.csv", show_col_types = FALSE), caption = "Cross-tabulation by Age Group") %>%
kable_styling(full_width = FALSE)
| age_group | total_patients | screened_phq2 | screened_gad2 | screened_audc | screened_bmh7 | complete_screening | any_flagged | mh_documented |
|---|---|---|---|---|---|---|---|---|
| 18-35 | 57 | 5 | 3 | 2 | 6 | 1 | 3 | 35 |
| 36-50 | 115 | 12 | 11 | 6 | 14 | 6 | 4 | 37 |
| 50+ | 362 | 39 | 41 | 28 | 57 | 23 | 23 | 45 |
| <18 | 19 | 1 | 0 | 0 | 2 | 0 | 0 | 1 |
kable(read_csv("data/processed/cross_tab_sex_age.csv", show_col_types = FALSE), caption = "Cross-tabulation by Sex and Age Group") %>%
kable_styling(full_width = FALSE)
| sex | age_group | total_patients | screened_phq2 | screened_gad2 | screened_audc | screened_bmh7 | complete_screening | any_flagged | mh_documented |
|---|---|---|---|---|---|---|---|---|---|
| Female | 18-35 | 41 | 3 | 2 | 2 | 3 | 1 | 2 | 21 |
| Female | 36-50 | 91 | 10 | 9 | 5 | 12 | 5 | 4 | 23 |
| Female | 50+ | 250 | 23 | 26 | 18 | 35 | 16 | 12 | 32 |
| Female | <18 | 13 | 1 | 0 | 0 | 1 | 0 | 0 | 1 |
| Male | 18-35 | 16 | 2 | 1 | 0 | 3 | 0 | 1 | 14 |
| Male | 36-50 | 24 | 2 | 2 | 1 | 2 | 1 | 0 | 14 |
| Male | 50+ | 112 | 16 | 15 | 10 | 22 | 7 | 11 | 13 |
| Male | <18 | 6 | 0 | 0 | 0 | 1 | 0 | 0 | 0 |
Expand Screening Coverage
Train clinicians on all four tools and improve triage workflow
prompts.
Maintain Balancing Metrics
Use frozen medians and baseline means as ongoing benchmarks.
Enhance Clinical Follow-up
Monitor outcomes of flagged cases and improve referral linkage.
chart_summary <- tribble(
~`QI Domain`, ~`Chart Title`, ~`Variable(s)`, ~`Estimation Method`, ~`Chart Type`, ~`Output File`,
"Screening", "BMH-7 Screening", "screened_bmh7", "proportion", "Control Chart", "bmh7_run_chart_frozen_median.png",
"Balancing", "Vitals Completion", "vitals_complete", "mean", "Control Chart", "balancing_run_charts.png",
"Balancing", "MH Documentation", "mh_documented", "mean", "Control Chart", "balancing_run_charts.png",
"Balancing", "Screening Completion", "screening_complete", "mean", "Control Chart", "balancing_run_charts.png",
"Balancing", "Any Flagged", "any_flagged", "mean", "Control Chart", "balancing_run_charts.png",
"Summary", "Multi-Metric Annotated", "Composite", "Visual summary (PHQ-2, Vitals, Flagged, BMH-7)", "Annotated Chart", "multi_qi_summary_annotated.png",
"Summary", "Faceted Weekly Charts", "All tools", "Facet by variable", "Run Charts", "faceted_run_charts_bmh7ref_clean.png"
)
kable(chart_summary, caption = "Summary of Charts by QI Domain") %>%
kable_styling(full_width = FALSE)
| QI Domain | Chart Title | Variable(s) | Estimation Method | Chart Type | Output File |
|---|---|---|---|---|---|
| Screening | BMH-7 Screening | screened_bmh7 | proportion | Control Chart | bmh7_run_chart_frozen_median.png |
| Balancing | Vitals Completion | vitals_complete | mean | Control Chart | balancing_run_charts.png |
| Balancing | MH Documentation | mh_documented | mean | Control Chart | balancing_run_charts.png |
| Balancing | Screening Completion | screening_complete | mean | Control Chart | balancing_run_charts.png |
| Balancing | Any Flagged | any_flagged | mean | Control Chart | balancing_run_charts.png |
| Summary | Multi-Metric Annotated | Composite | Visual summary (PHQ-2, Vitals, Flagged, BMH-7) | Annotated Chart | multi_qi_summary_annotated.png |
| Summary | Faceted Weekly Charts | All tools | Facet by variable | Run Charts | faceted_run_charts_bmh7ref_clean.png |
The Mental Health Screening QI project has yielded structured baseline data and performance benchmarks. Visual analytics and chart-based targets now guide implementation teams toward targeted improvements across screening, documentation, and follow-up care.