Dev Site — You are viewing the development build. Go to Main Site

  • English
  • Français
  1. 3. Stratification
  2. 3.1 Epidemiological Stratification
  3. Incidence stratification
  • Code library for subnational tailoring
    English version
  • 1. Getting Started
    • 1.1 About and Contact Information
    • 1.2 For Everyone
    • 1.3 For the SNT Team
    • 1.4 For Analysts
    • 1.5 Producing High-Quality Outputs
  • 2. Data Assembly and Management
    • 2.1 Working with Shapefiles
      • Spatial data overview
      • Basic shapefile use and visualization
      • Shapefile management and customization
      • Merging shapefiles with tabular data
    • 2.2 Health Facilities Data
      • Fuzzy matching of names across datasets
      • Health facility coordinates and point data
    • 2.3 Routine Surveillance Data
      • Routine data extraction
      • DHIS2 data preprocessing
      • Determining active and inactive status
      • Contextual considerations
      • Missing data detection methods
      • Health facility reporting rate
      • Data coherency checks
      • Outlier detection methods
      • Imputation methods
      • Final database
    • 2.4 Stock Data
      • LMIS
    • 2.5 Population Data
      • National population data
      • WorldPop population raster
    • 2.6 National Household Survey Data
      • DHS data overview and preparation
      • Prevalence of malaria infection
      • All-cause child mortality
      • Treatment-seeking rates
      • ITN ownership, access, and usage
      • Wealth quintiles analysis
    • 2.7 Entomological Data
      • Entomological data
    • 2.8 Climate and Environmental Data
      • Climate and environment data extraction from raster
    • 2.9 Modeled Data
      • Generating spatial modeled estimates
      • Working with geospatial model estimates
      • Modeled estimates of malaria mortality and proxies
      • Modeled estimates of entomological indicators
  • 3. Stratification
    • 3.1 Epidemiological Stratification
      • Incidence overview and crude incidence
      • Incidence adjustment 1: incomplete testing
      • Incidence adjustment 2: incomplete reporting
      • Incidence adjustment 3: treatment-seeking
      • Incidence stratification
      • Prevalence and mortality stratification
      • Combined risk categorization
      • Risk categorization REMOVE?
      • Risk categorization REMOVE?
    • 3.2 Stratification of Determinants of Malaria Transmission
      • Seasonality
      • Access to Care
  • 4. Review of Past Interventions
    • 4.1 Case Management
    • 4.2 Routine Interventions
    • 4.3 Campaign Interventions
    • 4.4 Other Interventions
  • 5. Targeting of Interventions
  • 6. Retrospective Analysis
    • 6.1: Trend analysis
  • 7. Urban Microstratification

On this page

  • Overview
  • Step-by-Step Instructions
    • Step 1: Stratify crude incidence
    • Step 1.1: Stratify adjusted incidence1
    • Step 1.2: Stratify adjusted incidence 2
    • Step 1.3: Stratify adjusted incidence3
    • Step 2: Mapping all incidence estimates
  1. 3. Stratification
  2. 3.1 Epidemiological Stratification
  3. Incidence stratification

Incidence stratification

Overview

Stratification is defined as classification of geographical areas or localities according to epidemiological, ecological, social and economic determinants for the purpose of guiding malaria interventions. It can include risk stratification (i.e. classification of geographical areas or localities according to factors that determine receptivity and vulnerability to malaria transmission) and/or interventions stratification based on eligibility and other criteria (e.g. endemicity criteria). It is important to distinguish between simply mapping the spatial distribution of an indicator and stratifying it based on the specific question at hand. Stratification involves transforming an indicator into meaningful categories that align with decision-making needs in malaria response for each setting. These categories must be strategically relevant for effective sub-national planning. For example, converting a malaria risk map into categories based on WHO’s transmission continuum to guide intervention strategies would be considered malaria risk stratification.

To provide the relevant information needed for programmatic use the stratification analysis should be done at the subnational unit of operation or lower levels. In settings with high transmission, the NMP usually stratifies subnational areas such as districts, health zones, provinces or regions. As countries progress towards elimination, finer scale mapping is required, and stratification should be more specific, ideally at the level of localities or health facility catchment areas, usually using absolute case data.

Objectives
  • TBD

Step-by-Step Instructions

To skip the step-by-step explanation, jump to the full code at the end of this page.

Step 1: Stratify crude incidence

For stratification purposes, it is recommended that the calculated incidence is aggregated by year at the operational administrative level.

  • R
  • Python
# create string values for the categories
ann_inc_data <- ann_inc_data %>%
  arrange(adm1, adm2, adm2, year) %>%
  mutate(crudeinc_cat = case_when(crudeinc <5 ~ "<5",
                                  crudeinc <= 50 ~ "5-50",
                                  crudeinc <=100 ~ "50-100",
                                  crudeinc <=250 ~ "100-250",
                                  crudeinc <=450 ~ "250-450",
                                  crudeinc <=750 ~ "450-750",
                                   TRUE ~ ">750"))

Step 1.1: Stratify adjusted incidence1

Categorize adjusted incidence1 based on agreed cut-offs

  • R
  • Python
# create numerical values for the categories
ann_inc_data <- ann_inc_data %>%
  mutate(adjinc1_cat = case_when(adjinc1 <5 ~ "<5",
                                  adjinc1 <= 50 ~ "5-50",
                                  adjinc1 <=100 ~ "50-100",
                                  adjinc1 <=250 ~ "100-250",
                                  adjinc1 <=450 ~ "250-450",
                                  adjinc1 <=750 ~ "450-750",
                                   TRUE ~ ">750"))

Step 1.2: Stratify adjusted incidence 2

Categorize adjusted incidence1 based on agreed cut-offs

  • R
  • Python
# create numerical values for the categories
ann_inc_data <- ann_inc_data %>%
  mutate(adjinc2_cat = case_when(adjinc2 <5 ~ "<5",
                                  adjinc2 <= 50 ~ "5-50",
                                  adjinc2 <=100 ~ "50-100",
                                  adjinc2 <=250 ~ "100-250",
                                  adjinc2 <=450 ~ "250-450",
                                  adjinc2 <=750 ~ "450-750",
                                   TRUE ~ ">750"))

Step 1.3: Stratify adjusted incidence3

Categorize adjusted incidence1 based on agreed cut-offs

  • R
  • Python
# create numerical values for the categories
ann_inc_data <- ann_inc_data %>%
  mutate(adjinc3_cat = case_when(adjinc3 <5 ~ "<5",
                                  adjinc3 <= 50 ~ "5-50",
                                  adjinc3 <=100 ~ "50-100",
                                  adjinc3 <=250 ~ "100-250",
                                  adjinc3 <=450 ~ "250-450",
                                  adjinc3 <=750 ~ "450-750",
                                   TRUE ~ ">750"))

Step 2: Mapping all incidence estimates

Once all incidence estimates are calculated, district-level trends and maps of the crude and adjusted incidence estimates need to be visually examined by NMPs. Discussions should be held to weigh the benefits and limitations of each adjustment until a consensus is reached on the best incidence metric to be used for intervention targeting.

Countries are highly encouraged to review the standard approach provided here and adapt the equations and sources of data as they see fit for their context.

  • Step 2.1: Join incidence data with shapefile
  • Step 2.2: Set color scheme to be used for all plots
  • Step 2.3: Set year variables
  • Step 4: Mapping for Crude incidence
  • Step 4.1: Mapping for adjusted incidence1
  • Step 4.2: Mapping for adjusted incidence2
  • Step 4.3: Mapping for adjusted incidence3

Join incidence dataset with shapefile

  • R
  • Python
inc_maps <- shp_adm3 %>%  # assuming this is the shapefile at adm3 in sf format
  left_join(ann_inc_data, by = c("adm1", "adm2", "adm3")) # this joins the data to the shapefile

We use the same set of colors for the different categories so we can better compare the changes after each adjustment and each year and make decisions

  • R
  • Python
colors <- c("white", "lightblue", "lightsteelblue", "royalblue", "red", "darkred", "maroon")

Since we have multiple years, we automate the plotting for the different years

  • R
  • Python
years <- unique(inc_maps$year)

Plot maps for crude incidence for each year and save

  • R
  • Python
for (yr in years) {

  year <- inc_maps %>%
    filter(year == yr)

  crude <- ggplot(year) +
    geom_sf(aes(fill = factor(crudeinc_cat)), color = "gray") +
    geom_sf(data = adm1_coords, fill = NA, color = "black", size = 0.3) + # adding adm1 layer
    scale_fill_manual(values = colors,
                      name = "Cases per 1000",
                      labels = c("<5", "5-50", "50-100", "100-250", "250-450", "450-750", ">750"),
                      drop = FALSE) +
    labs(title = paste("Crude Incidence", yr),
         subtitle = "Country") +
    theme_minimal() +
    theme(legend.position = "right",
          plot.title = element_text(size = 14),
          plot.subtitle = element_text(size = 12))

  # print plot
  print(inc1)

  # Save the plot
  ggsave(filename = paste0("gph/crude_", yr, ".png"), plot = crude, width = 8, height = 6, dpi = 300)
}

Plot maps for adjusted incidence1 for each year and save

  • R
  • Python
for (yr in years) {

  year <- inc_maps %>%
    filter(year == yr)

  inc1 <- ggplot(year) +
    geom_sf(aes(fill = factor(adjinc1_cat)), color = "gray") +
    geom_sf(data = adm1_coords, fill = NA, color = "black", size = 0.3) + # adding adm1 layer
    scale_fill_manual(values = colors,
                      name = "Cases per 1000",
                      labels = c("<5", "5-50", "50-100", "100-250", "250-450", "450-750", ">750"),
                      drop = FALSE) +
    labs(title = paste("Adjusted Incidence1", yr),
         subtitle = "Country") +
    theme_minimal() +
    theme(legend.position = "right",
          plot.title = element_text(size = 14),
          plot.subtitle = element_text(size = 12))

  # print plot
  print(inc1)

  # Save the plot
  ggsave(filename = paste0("gph/inc1_", yr, ".png"), plot = inc1, width = 8, height = 6, dpi = 300)
}

Plot maps for adjusted incidence2 for each year and save

  • R
  • Python
for (yr in years) {

  year <- inc_maps %>%
    filter(year == yr)

  inc2 <- ggplot(year) +
    geom_sf(aes(fill = factor(adjinc2_cat)), color = "gray") +
    geom_sf(data = adm1_coords, fill = NA, color = "black", size = 0.3)+ # adding adm1 layer
    scale_fill_manual(values = colors,
                      name = "Cases per 1000",
                      labels = c("<5", "5-50", "50-100", "100-250", "250-450", "450-750", ">750"),
                      drop = FALSE) +
    labs(title = paste("Adjusted Incidence2", yr),
         subtitle = "Country") +
    theme_minimal() +
    theme(legend.position = "right",
          plot.title = element_text(size = 14),
          plot.subtitle = element_text(size = 12))

  # print plot
print(inc2)

# Save the plot
   ggsave(filename = paste0("gph/inc2_", yr, ".png"), plot = inc2, width = 8, height = 6, dpi = 300)

}

Plot maps for adjusted incidence3 for each year and save

  • R
  • Python
for (yr in years) {

  year <- inc_maps %>%
    filter(year == yr)

  inc3 <- ggplot(year) +
    geom_sf(aes(fill = factor(adjinc3_cat)), color = "gray") +
    geom_sf(data = adm1_coords, fill = NA, color = "black", size = 0.3)+ # adding adm1 layer
    scale_fill_manual(values = colors,
                      name = "Cases per 1000",
                      labels = c("<5", "5-50", "50-100", "100-250", "250-450", "450-750", ">750"),
                      drop = FALSE) +
    labs(title = paste("Adjusted Incidence3", yr),
         subtitle = "Country") +
    theme_minimal() +
    theme(legend.position = "right",
          plot.title = element_text(size = 14),
          plot.subtitle = element_text(size = 12))

  # print plot
   print(inc3)

  # Save the plot
   ggsave(filename = paste0("gph/inc3_", yr, ".png"), plot = inc3, width = 8, height = 6, dpi = 300)

}

Summary

The process is iterative, requiring periodic refinement based on updated data and the observed impact of interventions. This ensures stratification remains a dynamic tool for guiding operational decisions and resource allocation, ultimately improving the effectiveness of malaria control programs at the subnational level.

Full code

  • R
  • Python
Show full code
#===============================================================================
# End of Script
#===============================================================================
 

©2025 Applied Health Analytics for Delivery and Innovation. All rights reserved