From 23cc8e9bff9b703d34f8540ac78d01292102a6ce Mon Sep 17 00:00:00 2001 From: Viveck Date: Thu, 26 Sep 2024 10:03:09 +0100 Subject: [PATCH 1/6] added age groups and facet function --- ...measures_definition_pf_codes_conditions.py | 24 +++++++++++++++++-- lib/functions/function_plot_measures.R | 13 ++++++++++ reports/pharmacy_first_report.Rmd | 22 +++++++++++++++++ 3 files changed, 57 insertions(+), 2 deletions(-) diff --git a/analysis/measures_definition_pf_codes_conditions.py b/analysis/measures_definition_pf_codes_conditions.py index 8393ef3..15e2003 100644 --- a/analysis/measures_definition_pf_codes_conditions.py +++ b/analysis/measures_definition_pf_codes_conditions.py @@ -1,5 +1,5 @@ -from ehrql import INTERVAL, create_measures, months, codelist_from_csv -from ehrql.tables.tpp import clinical_events, practice_registrations +from ehrql import INTERVAL, create_measures, months, codelist_from_csv, case, when +from ehrql.tables.tpp import clinical_events, practice_registrations, patients measures = create_measures() measures.configure_dummy_data(population_size=1000) @@ -28,6 +28,16 @@ registration = practice_registrations.for_patient_on(INTERVAL.end_date) +age = patients.age_on(INTERVAL.start_date) +age_band = case( + when((age >= 0) & (age < 20)).then("0-19"), + when((age >= 20) & (age < 40)).then("20-39"), + when((age >= 40) & (age < 60)).then("40-59"), + when((age >= 60) & (age < 80)).then("60-79"), + when(age >= 80).then("80+"), + when(age.is_null()).then("Missing"), +) + # Select clinical events in interval date range selected_events = clinical_events.where( clinical_events.date.is_on_or_between(INTERVAL.start_date, INTERVAL.end_date) @@ -52,6 +62,16 @@ intervals=months(monthly_intervals).starting_on(start_date), ) + measures.define_measure( + name=f"count_{pharmacy_first_event}_by_age", + numerator=numerator, + denominator=denominator, + group_by={ + "age_band": age_band, + }, + intervals=months(monthly_intervals).starting_on(start_date), + ) + # Create measures for pharmacy first conditions pharmacy_first_conditions_codes = {} for codes, term in pharmacy_first_conditions_codelist.items(): diff --git a/lib/functions/function_plot_measures.R b/lib/functions/function_plot_measures.R index c8d2c68..1d7ad29 100644 --- a/lib/functions/function_plot_measures.R +++ b/lib/functions/function_plot_measures.R @@ -24,7 +24,9 @@ plot_measures <- function( title = NULL, x_label = NULL, y_label = NULL, + facet_var = NULL, color_label = NULL, + rotate_x_labels = FALSE, axis_x_text_size = 7) { # Check if the necessary columns exist in the data if (date_col %in% names(data) == FALSE) { @@ -99,5 +101,16 @@ plot_measures <- function( date_labels = "%b %Y" ) + if (!is.null(facet_var)) { + facet_sym <- sym(facet_var) + plot1 <- plot1 + facet_wrap(vars(!!facet_sym), scales = "free_x") + + } + +# Conditionally apply x-axis label rotation if rotate_x_labels is TRUE + if (rotate_x_labels) { + plot1 <- plot1 + theme(axis.text.x = element_text(angle = 45, hjust = 1)) + } + plot1 } diff --git a/reports/pharmacy_first_report.Rmd b/reports/pharmacy_first_report.Rmd index a2ba37a..3623595 100644 --- a/reports/pharmacy_first_report.Rmd +++ b/reports/pharmacy_first_report.Rmd @@ -42,6 +42,14 @@ pf_clinical_service_dict <- c( "count_consultation_service" = "Consultation Service", "count_pharmacy_first_service" = "Pharmacy First Service" ) + +# Define the custom labels for clinical services by age +pf_clinical_service_dict_by_age <- c( + "count_blood_pressure_service_by_age" = "Blood Pressure Service", + "count_contraception_service_by_age" = "Contraception Service", + "count_consultation_service_by_age" = "Consultation Service", + "count_pharmacy_first_service_by_age" = "Pharmacy First Service" +) ``` # Background @@ -75,6 +83,20 @@ plot_measures(df_measures, ) ``` +### Clinical Services by Age + +```{r, message=FALSE, warning=FALSE} + +plot_measures(df_measures, + title = "Number of consultations for each clinical service by age per month", + measure_names = names(pf_clinical_service_dict_by_age), + custom_labels = pf_clinical_service_dict_by_age, + y_label = "Number of codes for consultations", + facet_var = "age_band", + rotate_x_labels = TRUE +) +``` + ## Clinical Pathways This section focuses on the Clinical Pathways element of that Pharmacy First service. From 20e57972ef7ff3583281355b054ab2355d748480 Mon Sep 17 00:00:00 2001 From: Viveck Date: Thu, 26 Sep 2024 15:08:21 +0100 Subject: [PATCH 2/6] added age grouping to clinical conditions --- ...measures_definition_pf_codes_conditions.py | 10 ++++++++ reports/pharmacy_first_report.Rmd | 25 +++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/analysis/measures_definition_pf_codes_conditions.py b/analysis/measures_definition_pf_codes_conditions.py index 15e2003..3e61ab1 100644 --- a/analysis/measures_definition_pf_codes_conditions.py +++ b/analysis/measures_definition_pf_codes_conditions.py @@ -96,3 +96,13 @@ denominator=denominator, intervals=months(monthly_intervals).starting_on(start_date), ) + + measures.define_measure( + name=f"count_{condition_name}_by_age", + numerator=numerator, + denominator=denominator, + group_by={ + "age_band": age_band, + }, + intervals=months(monthly_intervals).starting_on(start_date), + ) diff --git a/reports/pharmacy_first_report.Rmd b/reports/pharmacy_first_report.Rmd index 3623595..1f9e2e0 100644 --- a/reports/pharmacy_first_report.Rmd +++ b/reports/pharmacy_first_report.Rmd @@ -35,6 +35,17 @@ pf_clinical_condition_dict <- c( "count_uncomplicated_urinary_tract_infection" = "UTI" ) +# Define the custom labels for clinical conditions by age +pf_clinical_condition_dict_by_age <- c( + "count_acute_otitis_media_by_age" = "Acute Otitis Media", + "count_herpes_zoster_by_age" = "Herpes Zoster", + "count_acute_sinusitis_by_age" = "Acute Sinusitis", + "count_impetigo_by_age" = "Impetigo", + "count_infected_insect_bite_by_age" = "Infected Insect Bite", + "count_acute_pharyngitis_by_age" = "Acute Pharyngitis", + "count_uncomplicated_urinary_tract_infection_by_age" = "UTI" +) + # Define the custom labels for clinical services pf_clinical_service_dict <- c( "count_blood_pressure_service" = "Blood Pressure Service", @@ -114,3 +125,17 @@ plot_measures(df_measures, y_label = "Number of codes for consultations", ) ``` + +### Clinical Conditions by Age + +```{r, message=FALSE, warning=FALSE} + +plot_measures(df_measures, + title = "Number of consultations for each clinical condition by age per month", + measure_names = names(pf_clinical_condition_dict_by_age), + custom_labels = pf_clinical_condition_dict_by_age, + y_label = "Number of codes for consultations", + facet_var = "age_band", + rotate_x_labels = TRUE +) +``` \ No newline at end of file From b92b58a2820592c808233397fb2769d6d30e4d06 Mon Sep 17 00:00:00 2001 From: Viveck Date: Fri, 27 Sep 2024 11:52:00 +0100 Subject: [PATCH 3/6] added breakdown by sex --- ...measures_definition_pf_codes_conditions.py | 26 ++++++++++- reports/pharmacy_first_report.Rmd | 46 +++++++++++++++++++ 2 files changed, 70 insertions(+), 2 deletions(-) diff --git a/analysis/measures_definition_pf_codes_conditions.py b/analysis/measures_definition_pf_codes_conditions.py index 3e61ab1..d87a3b9 100644 --- a/analysis/measures_definition_pf_codes_conditions.py +++ b/analysis/measures_definition_pf_codes_conditions.py @@ -61,7 +61,7 @@ denominator=denominator, intervals=months(monthly_intervals).starting_on(start_date), ) - + # Measures for age breakdown of clinical services measures.define_measure( name=f"count_{pharmacy_first_event}_by_age", numerator=numerator, @@ -72,6 +72,17 @@ intervals=months(monthly_intervals).starting_on(start_date), ) + # Measures for sex breakdown of clinical services + measures.define_measure( + name=f"count_{pharmacy_first_event}_by_sex", + numerator=numerator, + denominator=denominator, + group_by={ + "sex": patients.sex, + }, + intervals=months(monthly_intervals).starting_on(start_date), + ) + # Create measures for pharmacy first conditions pharmacy_first_conditions_codes = {} for codes, term in pharmacy_first_conditions_codelist.items(): @@ -96,7 +107,7 @@ denominator=denominator, intervals=months(monthly_intervals).starting_on(start_date), ) - + # Measures for age breakdown of clinical conditions measures.define_measure( name=f"count_{condition_name}_by_age", numerator=numerator, @@ -106,3 +117,14 @@ }, intervals=months(monthly_intervals).starting_on(start_date), ) + + # Measures for age breakdown of clinical conditions + measures.define_measure( + name=f"count_{condition_name}_by_sex", + numerator=numerator, + denominator=denominator, + group_by={ + "sex": patients.sex, + }, + intervals=months(monthly_intervals).starting_on(start_date), + ) diff --git a/reports/pharmacy_first_report.Rmd b/reports/pharmacy_first_report.Rmd index 1f9e2e0..e2cfdaf 100644 --- a/reports/pharmacy_first_report.Rmd +++ b/reports/pharmacy_first_report.Rmd @@ -46,6 +46,17 @@ pf_clinical_condition_dict_by_age <- c( "count_uncomplicated_urinary_tract_infection_by_age" = "UTI" ) +# Define the custom labels for clinical conditions by sex +pf_clinical_condition_dict_by_sex <- c( + "count_acute_otitis_media_by_sex" = "Acute Otitis Media", + "count_herpes_zoster_by_sex" = "Herpes Zoster", + "count_acute_sinusitis_by_sex" = "Acute Sinusitis", + "count_impetigo_by_sex" = "Impetigo", + "count_infected_insect_bite_by_sex" = "Infected Insect Bite", + "count_acute_pharyngitis_by_sex" = "Acute Pharyngitis", + "count_uncomplicated_urinary_tract_infection_by_sex" = "UTI" +) + # Define the custom labels for clinical services pf_clinical_service_dict <- c( "count_blood_pressure_service" = "Blood Pressure Service", @@ -61,6 +72,14 @@ pf_clinical_service_dict_by_age <- c( "count_consultation_service_by_age" = "Consultation Service", "count_pharmacy_first_service_by_age" = "Pharmacy First Service" ) + +# Define the custom labels for clinical services by sex +pf_clinical_service_dict_by_sex <- c( + "count_blood_pressure_service_by_sex" = "Blood Pressure Service", + "count_contraception_service_by_sex" = "Contraception Service", + "count_consultation_service_by_sex" = "Consultation Service", + "count_pharmacy_first_service_by_sex" = "Pharmacy First Service" +) ``` # Background @@ -108,6 +127,19 @@ plot_measures(df_measures, ) ``` +### Clinical Services by Sex + +```{r, message=FALSE, warning=FALSE} + +plot_measures(df_measures, + title = "Number of consultations for each clinical service by sex per month", + measure_names = names(pf_clinical_service_dict_by_sex), + custom_labels = pf_clinical_service_dict_by_sex, + y_label = "Number of codes for consultations", + facet_var = "sex", + rotate_x_labels = TRUE +) +``` ## Clinical Pathways This section focuses on the Clinical Pathways element of that Pharmacy First service. @@ -138,4 +170,18 @@ plot_measures(df_measures, facet_var = "age_band", rotate_x_labels = TRUE ) +``` + +### Clinical Conditions by Sex + +```{r, message=FALSE, warning=FALSE} + +plot_measures(df_measures, + title = "Number of consultations for each clinical condition by sex per month", + measure_names = names(pf_clinical_condition_dict_by_sex), + custom_labels = pf_clinical_condition_dict_by_sex, + y_label = "Number of codes for consultations", + facet_var = "sex", + rotate_x_labels = TRUE +) ``` \ No newline at end of file From 170181de74d0a69ac2e513f12ea4958d47304454 Mon Sep 17 00:00:00 2001 From: Viveck Date: Fri, 27 Sep 2024 15:47:31 +0100 Subject: [PATCH 4/6] added breakdown by IMD --- ...measures_definition_pf_codes_conditions.py | 36 +++++++++++++- reports/pharmacy_first_report.Rmd | 47 +++++++++++++++++++ 2 files changed, 82 insertions(+), 1 deletion(-) diff --git a/analysis/measures_definition_pf_codes_conditions.py b/analysis/measures_definition_pf_codes_conditions.py index d87a3b9..25ddfce 100644 --- a/analysis/measures_definition_pf_codes_conditions.py +++ b/analysis/measures_definition_pf_codes_conditions.py @@ -1,5 +1,5 @@ from ehrql import INTERVAL, create_measures, months, codelist_from_csv, case, when -from ehrql.tables.tpp import clinical_events, practice_registrations, patients +from ehrql.tables.tpp import clinical_events, practice_registrations, patients, addresses measures = create_measures() measures.configure_dummy_data(population_size=1000) @@ -28,6 +28,7 @@ registration = practice_registrations.for_patient_on(INTERVAL.end_date) +# Age bands for age breakdown age = patients.age_on(INTERVAL.start_date) age_band = case( when((age >= 0) & (age < 20)).then("0-19"), @@ -38,6 +39,17 @@ when(age.is_null()).then("Missing"), ) +# IMD groupings for IMD breakdown +imd = addresses.for_patient_on(INTERVAL.start_date).imd_rounded +imd_quintile = case( + when((imd >=0) & (imd < int(32844 * 1 / 5))).then("1 (most deprived)"), + when(imd < int(32844 * 2 / 5)).then("2"), + when(imd < int(32844 * 3 / 5)).then("3"), + when(imd < int(32844 * 4 / 5)).then("4"), + when(imd < int(32844 * 5 / 5)).then("5 (least deprived)"), + otherwise="unknown" +) + # Select clinical events in interval date range selected_events = clinical_events.where( clinical_events.date.is_on_or_between(INTERVAL.start_date, INTERVAL.end_date) @@ -83,6 +95,17 @@ intervals=months(monthly_intervals).starting_on(start_date), ) + # Measures for IMD breakdown of clinical services + measures.define_measure( + name=f"count_{pharmacy_first_event}_by_imd", + numerator=numerator, + denominator=denominator, + group_by={ + "imd": imd_quintile, + }, + intervals=months(monthly_intervals).starting_on(start_date), + ) + # Create measures for pharmacy first conditions pharmacy_first_conditions_codes = {} for codes, term in pharmacy_first_conditions_codelist.items(): @@ -128,3 +151,14 @@ }, intervals=months(monthly_intervals).starting_on(start_date), ) + + # Measures for imd breakdown of clinical conditions + measures.define_measure( + name=f"count_{condition_name}_by_imd", + numerator=numerator, + denominator=denominator, + group_by={ + "imd": imd_quintile, + }, + intervals=months(monthly_intervals).starting_on(start_date), + ) \ No newline at end of file diff --git a/reports/pharmacy_first_report.Rmd b/reports/pharmacy_first_report.Rmd index e2cfdaf..fc51df1 100644 --- a/reports/pharmacy_first_report.Rmd +++ b/reports/pharmacy_first_report.Rmd @@ -57,6 +57,17 @@ pf_clinical_condition_dict_by_sex <- c( "count_uncomplicated_urinary_tract_infection_by_sex" = "UTI" ) +# Define the custom labels for clinical conditions by IMD +pf_clinical_condition_dict_by_imd <- c( + "count_acute_otitis_media_by_imd" = "Acute Otitis Media", + "count_herpes_zoster_by_imd" = "Herpes Zoster", + "count_acute_sinusitis_by_imd" = "Acute Sinusitis", + "count_impetigo_by_imd" = "Impetigo", + "count_infected_insect_bite_by_imd" = "Infected Insect Bite", + "count_acute_pharyngitis_by_imd" = "Acute Pharyngitis", + "count_uncomplicated_urinary_tract_infection_by_imd" = "UTI" +) + # Define the custom labels for clinical services pf_clinical_service_dict <- c( "count_blood_pressure_service" = "Blood Pressure Service", @@ -80,6 +91,14 @@ pf_clinical_service_dict_by_sex <- c( "count_consultation_service_by_sex" = "Consultation Service", "count_pharmacy_first_service_by_sex" = "Pharmacy First Service" ) + +# Define the custom labels for clinical services by IMD +pf_clinical_service_dict_by_imd <- c( + "count_blood_pressure_service_by_imd" = "Blood Pressure Service", + "count_contraception_service_by_imd" = "Contraception Service", + "count_consultation_service_by_imd" = "Consultation Service", + "count_pharmacy_first_service_by_imd" = "Pharmacy First Service" +) ``` # Background @@ -140,6 +159,20 @@ plot_measures(df_measures, rotate_x_labels = TRUE ) ``` + +### Clinical Services by IMD + +```{r, message=FALSE, warning=FALSE} + +plot_measures(df_measures, + title = "Number of consultations for each clinical service by IMD per month", + measure_names = names(pf_clinical_service_dict_by_imd), + custom_labels = pf_clinical_service_dict_by_imd, + y_label = "Number of codes for consultations", + facet_var = "imd", + rotate_x_labels = TRUE +) +``` ## Clinical Pathways This section focuses on the Clinical Pathways element of that Pharmacy First service. @@ -184,4 +217,18 @@ plot_measures(df_measures, facet_var = "sex", rotate_x_labels = TRUE ) +``` + +### Clinical Conditions by IMD + +```{r, message=FALSE, warning=FALSE} + +plot_measures(df_measures, + title = "Number of consultations for each clinical condition by IMD per month", + measure_names = names(pf_clinical_condition_dict_by_imd), + custom_labels = pf_clinical_condition_dict_by_imd, + y_label = "Number of codes for consultations", + facet_var = "imd", + rotate_x_labels = TRUE +) ``` \ No newline at end of file From c6e1aa70cfdabf3e976dac5806cf60da16fccb95 Mon Sep 17 00:00:00 2001 From: Viveck Date: Mon, 30 Sep 2024 11:56:06 +0100 Subject: [PATCH 5/6] added region breakdown --- ...measures_definition_pf_codes_conditions.py | 22 ++++++++ reports/pharmacy_first_report.Rmd | 50 ++++++++++++++++++- 2 files changed, 71 insertions(+), 1 deletion(-) diff --git a/analysis/measures_definition_pf_codes_conditions.py b/analysis/measures_definition_pf_codes_conditions.py index 25ddfce..9b05082 100644 --- a/analysis/measures_definition_pf_codes_conditions.py +++ b/analysis/measures_definition_pf_codes_conditions.py @@ -106,6 +106,17 @@ intervals=months(monthly_intervals).starting_on(start_date), ) + # Measures for region breakdown of clinical services + measures.define_measure( + name=f"count_{pharmacy_first_event}_by_region", + numerator=numerator, + denominator=denominator, + group_by={ + "region": registration.practice_nuts1_region_name, + }, + intervals=months(monthly_intervals).starting_on(start_date), + ) + # Create measures for pharmacy first conditions pharmacy_first_conditions_codes = {} for codes, term in pharmacy_first_conditions_codelist.items(): @@ -161,4 +172,15 @@ "imd": imd_quintile, }, intervals=months(monthly_intervals).starting_on(start_date), + ) + + # Measures for region breakdown of clinical conditions + measures.define_measure( + name=f"count_{condition_name}_by_region", + numerator=numerator, + denominator=denominator, + group_by={ + "region": registration.practice_nuts1_region_name, + }, + intervals=months(monthly_intervals).starting_on(start_date), ) \ No newline at end of file diff --git a/reports/pharmacy_first_report.Rmd b/reports/pharmacy_first_report.Rmd index fc51df1..afd31b1 100644 --- a/reports/pharmacy_first_report.Rmd +++ b/reports/pharmacy_first_report.Rmd @@ -68,6 +68,17 @@ pf_clinical_condition_dict_by_imd <- c( "count_uncomplicated_urinary_tract_infection_by_imd" = "UTI" ) +# Define the custom labels for clinical conditions by region +pf_clinical_condition_dict_by_region <- c( + "count_acute_otitis_media_by_region" = "Acute Otitis Media", + "count_herpes_zoster_by_region" = "Herpes Zoster", + "count_acute_sinusitis_by_region" = "Acute Sinusitis", + "count_impetigo_by_region" = "Impetigo", + "count_infected_insect_bite_by_region" = "Infected Insect Bite", + "count_acute_pharyngitis_by_region" = "Acute Pharyngitis", + "count_uncomplicated_urinary_tract_infection_by_region" = "UTI" +) + # Define the custom labels for clinical services pf_clinical_service_dict <- c( "count_blood_pressure_service" = "Blood Pressure Service", @@ -99,6 +110,14 @@ pf_clinical_service_dict_by_imd <- c( "count_consultation_service_by_imd" = "Consultation Service", "count_pharmacy_first_service_by_imd" = "Pharmacy First Service" ) + +# Define the custom labels for clinical services by region +pf_clinical_service_dict_by_region <- c( + "count_blood_pressure_service_by_region" = "Blood Pressure Service", + "count_contraception_service_by_region" = "Contraception Service", + "count_consultation_service_by_region" = "Consultation Service", + "count_pharmacy_first_service_by_region" = "Pharmacy First Service" +) ``` # Background @@ -173,9 +192,24 @@ plot_measures(df_measures, rotate_x_labels = TRUE ) ``` + +### Clinical Services by Region + +```{r, message=FALSE, warning=FALSE} + +plot_measures(df_measures, + title = "Number of consultations for each clinical service by region per month", + measure_names = names(pf_clinical_service_dict_by_region), + custom_labels = pf_clinical_service_dict_by_region, + y_label = "Number of codes for consultations", + facet_var = "region", + rotate_x_labels = TRUE +) +``` + ## Clinical Pathways -This section focuses on the Clinical Pathways element of that Pharmacy First service. +This section focuses on the Clinical Pathways element of the Pharmacy First service. ## Clinical Condition @@ -231,4 +265,18 @@ plot_measures(df_measures, facet_var = "imd", rotate_x_labels = TRUE ) +``` + +### Clinical Conditions by Region + +```{r, message=FALSE, warning=FALSE} + +plot_measures(df_measures, + title = "Number of consultations for each clinical condition by region per month", + measure_names = names(pf_clinical_condition_dict_by_region), + custom_labels = pf_clinical_condition_dict_by_region, + y_label = "Number of codes for consultations", + facet_var = "region", + rotate_x_labels = TRUE +) ``` \ No newline at end of file From 32322e483fbdf24b453b5974f1fd78777bb3950f Mon Sep 17 00:00:00 2001 From: Viveck Date: Tue, 1 Oct 2024 14:40:53 +0100 Subject: [PATCH 6/6] Remove unknown sex from population --- ...measures_definition_pf_codes_conditions.py | 40 +++++++++++++++---- 1 file changed, 32 insertions(+), 8 deletions(-) diff --git a/analysis/measures_definition_pf_codes_conditions.py b/analysis/measures_definition_pf_codes_conditions.py index 9b05082..ccc7c9a 100644 --- a/analysis/measures_definition_pf_codes_conditions.py +++ b/analysis/measures_definition_pf_codes_conditions.py @@ -1,5 +1,5 @@ from ehrql import INTERVAL, create_measures, months, codelist_from_csv, case, when -from ehrql.tables.tpp import clinical_events, practice_registrations, patients, addresses +from ehrql.tables.tpp import clinical_events, practice_registrations, patients, addresses, ethnicity_from_sus measures = create_measures() measures.configure_dummy_data(population_size=1000) @@ -41,13 +41,14 @@ # IMD groupings for IMD breakdown imd = addresses.for_patient_on(INTERVAL.start_date).imd_rounded +max_imd = 32844 imd_quintile = case( - when((imd >=0) & (imd < int(32844 * 1 / 5))).then("1 (most deprived)"), - when(imd < int(32844 * 2 / 5)).then("2"), - when(imd < int(32844 * 3 / 5)).then("3"), - when(imd < int(32844 * 4 / 5)).then("4"), - when(imd < int(32844 * 5 / 5)).then("5 (least deprived)"), - otherwise="unknown" + when((imd >=0) & (imd < int(max_imd * 1 / 5))).then("1"), + when(imd < int(max_imd * 2 / 5)).then("2"), + when(imd < int(max_imd * 3 / 5)).then("3"), + when(imd < int(max_imd * 4 / 5)).then("4"), + when(imd <= max_imd).then("5"), + otherwise="Missing" ) # Select clinical events in interval date range @@ -65,7 +66,7 @@ numerator = condition_events.count_for_patient() # Define the denominator as the number of patients registered - denominator = registration.exists_for_patient() + denominator = registration.exists_for_patient() & patients.sex.is_in(["male", "female", "intersex"]) measures.define_measure( name=f"count_{pharmacy_first_event}", @@ -73,6 +74,7 @@ denominator=denominator, intervals=months(monthly_intervals).starting_on(start_date), ) + # Measures for age breakdown of clinical services measures.define_measure( name=f"count_{pharmacy_first_event}_by_age", @@ -117,6 +119,17 @@ intervals=months(monthly_intervals).starting_on(start_date), ) + # Measures for ethnicity code breakdown of clinical services + measures.define_measure( + name=f"count_{pharmacy_first_event}_by_ethnicity", + numerator=numerator, + denominator=denominator, + group_by={ + "ethnicity": ethnicity_from_sus.code, + }, + intervals=months(monthly_intervals).starting_on(start_date), + ) + # Create measures for pharmacy first conditions pharmacy_first_conditions_codes = {} for codes, term in pharmacy_first_conditions_codelist.items(): @@ -183,4 +196,15 @@ "region": registration.practice_nuts1_region_name, }, intervals=months(monthly_intervals).starting_on(start_date), + ) + + # Measures for region breakdown of clinical conditions + measures.define_measure( + name=f"count_{condition_name}_by_ethnicity", + numerator=numerator, + denominator=denominator, + group_by={ + "ethnicity": ethnicity_from_sus.code, + }, + intervals=months(monthly_intervals).starting_on(start_date), ) \ No newline at end of file