Skip to contents

Introduction

In 2020, UNAIDS newly released the 95-95-95 targets which are set to be achieved by 2025, where 95% of PLHIV know their status, 95% of those who know their status are accessing treatment, and 95% of those who are accessing treatment are virally suppressed.

Importantly, there are two types of metrics to measure 95-95-95 target progress by: the PLHIV base and the relative/conditional denominator base. This vignette will outline the key differences between the two metrics, which UNAIDS indicators to use for each, and how to interpret the different parameters.

library(mindthegap)
library(dplyr)
library(tidyr)
library(glue)
library(gt)
library(gtExtras)
library(glamr) #install.packages('glamr', repos = c('https://usaid-oha-si.r-universe.dev', getOption("repos")))
library(glitr) #install.packages('glitr', repos = c('https://usaid-oha-si.r-universe.dev', getOption("repos")))

What’s the difference between the relative base and the PLHIV base?

The relative base or conditional denominator (based on the targets) is important for countries and programs to know where to focus their response. This metric provides values on a sliding scale, where 95% of PLHIV know their status, 95% of those who know their status are accessing treatment, and 95% of those who are accessing treatment are virally suppressed.

The PLHIV base/denominator (testing and treatment cascade) is best used for comparing countries and for knowing country-specific progress towards curbing their HIV epidemic. With PLHIV as the base for the 3 95’s, the targets become 95% of PLHIV known their status, 90% of PLHIV are accessing treatment, and 86% of PLHIV are virally suppressed.

Both are useful, but for different purposes (see visual below).

How to use UNAIDS Data to Assess 95’s Progress

To assess progress to 95-95-95 targets, we will use the "HIV Test & Treat" data and filter for "Percent" indicators:

df_tt <- pull_unaids(data_type = "HIV Test & Treat", pepfar_only = TRUE) %>% 
  dplyr::filter(indic_type == "Percent")
  • If you are using the relative base to track 95-95-95 progress, use the following indicators from the "HIV Test & Treat" data tab.
    • Percent Known Status of PLHIV: Percent of PLHIV who known their HIV status
    • Percent on ART with Known Status: Among those who know their status, percent on ART
    • Percent VLS on ART: Among those who are on ART, percent virally suppressed
  • If you are using the PLHIV base, use the following indicators from the "HIV Test & Treat" data tab.
    • Percent Known Status of PLHIV: Percent of PLHIV who known their HIV status
    • Percent on ART of PLHIV: Among PLHVIV, percent on ART
    • Percent VLS of PLHIV: Among PLHIV, percent virally suppressed

Let’s take a deep dive into Namibia’s progress to the 95’s using the PLHIV base.

goal <- 95

 #limit Test and Treat data
  df_tt_plhiv <- df_tt %>% 
    filter(year == max(year),
           country == "Namibia",
           indicator %in% c("Percent Known Status of PLHIV",
                            "Percent on ART of PLHIV",
                            "Percent VLS of PLHIV"), #Using the PLHIV base indicators
           age == "All",
           sex == "All") %>% 
    mutate(set = recode(indicator, "Percent Known Status of PLHIV" = 1, 
                        "Percent on ART of PLHIV" = 2,
                        "Percent VLS of PLHIV" = 3),
           goal_rate = round((goal/100)^set*100), 
           achieved = estimate >= goal_rate) %>% #sets the moving goal rate for each 95 for PLHIV base
    select(year, country, indicator, estimate, goal_rate, achieved)
  
  #create table 
  year <- unique(df_tt_plhiv$year)
  
  gt(df_tt_plhiv) %>% 
    cols_hide(c(year, country)) %>% 
    fmt_percent(columns = c(estimate, goal_rate),
                      decimals = 0, scale_values = FALSE) %>% 
          cols_label(goal_rate = "goal") %>% 
          gtExtras::gt_theme_nytimes() %>% 
          tab_source_note(source_note = gt::md(glue(source_note))) %>% 
          tab_options(source_notes.font.size = px(8),
                      data_row.padding = px(1),
                      table.font.size = px(12)) %>% 
          gt_color_rows(achieved,
                        palette = c(glitr::burnt_sienna, glitr::scooter),
                        domain = c(0,1),
                        pal_type = "discrete") %>% 
          tab_header(title = glue("NAMIBIA'S {year} TREATMENT TARGET GOALS: PLHIV BASE")) 
NAMIBIA'S 2023 TREATMENT TARGET GOALS: PLHIV BASE
indicator estimate goal achieved
Percent Known Status of PLHIV 93% 95% FALSE
Percent on ART of PLHIV 89% 90% FALSE
Percent VLS of PLHIV 87% 86% TRUE
Source: UNAIDS AIDSinfo Global Data 2024 Release

As we can see, using the PLHIV base, Namibia reached one of the 95’s - 93% of PLHIV know their status, 89% of PLHIV are accessing treatment, and 87% of PLHIV are virally suppressed.

What happens if we use the relative base?

goal <- 95

 #limit Test and Treat data
  df_tt_rel <- df_tt %>% 
    filter(year == max(year),
           country == "Namibia",
           indicator %in% c("Percent Known Status of PLHIV",
                            "Percent on ART with Known Status",
                            "Percent VLS on ART"), #using rel base indicators
           age == "All",
           sex == "All") %>%
    mutate(goal_rate = goal, #use 95 as the goal metric for each indicator
           achieved = estimate >= goal_rate) %>% 
    select(year, country, indicator, estimate, goal_rate, achieved)


#create table
   year <- unique(df_tt_rel$year)
   
      gt(df_tt_rel) %>% 
          cols_hide(c(year, country)) %>% 
          fmt_percent(columns = c(estimate, goal_rate),
                      decimals = 0, scale_values = FALSE) %>% 
          cols_label(goal_rate = "goal") %>% 
          gtExtras::gt_theme_nytimes() %>% 
          tab_source_note(source_note = gt::md(glue(source_note))) %>% 
          tab_options(source_notes.font.size = px(8),
                      data_row.padding = px(1),
                      table.font.size = px(12)) %>% 
          tab_header(title =glue("NAMIBIA'S {year} TREATMENT TARGET GOALS: RELATIVE BASE")) %>% 
      gt_color_rows(achieved,
                        palette = c(glitr::burnt_sienna, glitr::scooter),
                        domain = c(0,1),
                        pal_type = "discrete")
NAMIBIA'S 2023 TREATMENT TARGET GOALS: RELATIVE BASE
indicator estimate goal achieved
Percent Known Status of PLHIV 93% 95% FALSE
Percent on ART with Known Status 95% 95% TRUE
Percent VLS on ART 98% 95% TRUE
Source: UNAIDS AIDSinfo Global Data 2024 Release

Using the relative base, we can see that 93% of PLHIV in Namibia know their status, 95% of the 93% who know their status are on treatment, and 98% of the 95% who are on treatment are virally suppressed. As such, Namibia meets the 2nd and 3rd 95 with the relative base, but does not reach the 1st 95.

As a result of these differences between the 2 metrics, the number of PEPFAR countries that have reached all of the 95’s can vary depending on the denominator.

With the PLHIV base, 7 countries have reached all 3 95’s: Botswana, Eswatini, Kenya, Malawi, Rwanda, Zambia, and Zimbabwe.

UNAIDS Treatment Target Goals
PLHIV goal rate: 95-90-86
country Known Status On ART VLS
Botswana 97% 95% 94%
Eswatini 98% 93% 92%
Kenya 96% 94% 91%
Malawi 95% 91% 87%
Rwanda 96% 96% 94%
Zambia 96% 95% 92%
Zimbabwe 95% 95% 91%
Source: UNAIDS AIDSinfo Global Data 2024 Release

With the relative base, 7 countries have reached all 3 95’s: Botswana, Eswatini, Kenya, Malawi, Rwanda, Zambia, and Zimbabwe.

UNAIDS Treatment Target Goals
Relative goal rate: 95-95-95
country Known Status On ART VLS
Botswana 97% 98% 98%
Eswatini 98% 95% 98%
Kenya 96% 98% 97%
Malawi 95% 96% 95%
Rwanda 96% 98% 98%
Zambia 96% 98% 97%
Zimbabwe 95% 98% 96%
Source: UNAIDS AIDSinfo Global Data 2024 Release