How to create a dropout rate based on individual vaccine uptake

Dear CoP,

I am applying DHIS2 in tracking children who dropout from DTP1-DTP3 vaccine… the usual dropout rate is based on aggregate data but usually this aggregate data (monthly or annually) does not reflect the real dropout since it does not determine if the same person who has received DTP1 vaccine is the same who has received DTP3.

I have been looking into indicators and program indictors but could not find a filter or expression that can determine if the DTP1-and DTP3 belongs to the same person…Thus i was wondering about the mechanism of determining this from other countries implementations…would very much appreciate the help.

Thanks in advance


You can create a Program Indicator that will check for DTP-1 and DTP-3 at the same time (for the same person) and then create an Indicator that will count how many children had true/false based on the result from the Program Indicator.

1 Like

@Gassim Hello dear and thank you very much for your reply… however this was my exact point , how to make sure that DTP1 and 3 belong to the same person…i don’t have such thing in the variable available

" A program indicator is derived from individual level event or tracker data" so when you create a program indicator it will be per person. This program indicator could be displayed in the TEI dashboard. There will be a value for each person. Furthermore, it is possible to make this program indicator specific to certain TEIs and not all using the ‘filter.’ Please see here for more info.

After you have the program indicator working for each person then you can create an indicator that will count the number of people with a certain value from the program indicator, please see video below:


Hi @Haliz.t ,

Great question! In addition to the resources described by @Gassim above, I recommend you look into the Electronic Immunization Registry metadata package, which has examples specifically on drop out rates for immunization cohorts. It will help you understand how to use enrollment type program indicators to address this requirement:

how to make sure that DTP1 and 3 belong to the same person

EIR Indicator design documentation

Demo dashboard with dropout rate indicators

Example DPT 1-3 indicator for dropout rates by cohort:
Percent indicator for DPT1-3 dropout by cohort
Numerator program indicator
Denominator program indicator

In this example, DPT 1 Given and DPT 3 Given are separate data elements in a repeated Immunization stage. Program rules hide DPT 3 unless DPT 1 and DPT 2 have been given in previous events. Because the DPT doses occur in separate events, we must therefore use enrollment type program indicators to create a cohort-based indicator.

For our indicator, all children who have received DPT 1 in the past, and have passed 6 months of age within the reporting period, should have received DPT 3. This is our denominator cohort.

To find this cohort, we use a program indicator with offset analytics period boundaries to cover all enrollment dates from six months prior to the reporting period until the end of the reporting period. Then we include in the program indicator filter:

d2:monthsBetween(A{DOB},V{analytics_period_start}) <= 6 && d2:monthsBetween(A{DOB},V{analytics_period_end}) >= 6

This ensures that all children who turned 6 months old during our reporting period are included within the cohort — regardless of when they were initially enrolled in the program. More information on enrollment type indicators and program indicator analytics period boundaries is included in the Tracker Design Guide.

The full filter of the program indicator in our denominator also includes a subexpression to filter for DPT1 dose provided in at least one event.
&& d2:countIfValue(#{programUID.DataElementUidDPT1}, 1) > 0

The program indicator used in the numerator is almost precisely the same as the denominator, except it has one additional subexpression in the filter: at least one DPT3 dose is provided
&& d2:countIfValue(#{programUID.DataElementUidDPT3}, 1) > 0

The full indicator calculates the following:

(Children who pass 6 months of age this period and have received DPT1)
(Children who pass 6 months of age this period and have received both DPT1 and DPT3)

Your system design may be different, so let me know if this helps to find DPT dropout rates with your Immunization Registry configuration.

1 Like

Dear @brian Thank you very much for your very clear response. this have helped a lot. My mistake was not using the data off set in periodicity boundaries and so missing out the things this option can offer… and the way the indicator is calculated is more precise.
Thanks again

However…I have a question
In my case i have many children who are usually late either for the first or second dose of DPT… so can we calculate the dropout rate based on event not enrolment ?

for example: a child age is 3 months when received first dose of DPT in this case the third dose of DPT will be on the age of 7…and thus shouldn’t be considered as dropout

Good point @Haliz.t

Before I respond I should quickly clarify that the program indicator above uses a date of birth tracked entity attribute A{DOB} to calculate age during the reporting period. The offset analytics period boundaries ensures that the program indicator includes children with enrollment dates 0-6 months prior to the reporting period (if a child with date of birth Jan 15 2023 enrolls in the program February 15 2023 and receives DPT1, then she is in the dropout denominator cohort for the period of June 2023).

For your example

a child age is 3 months when received first dose of DPT in this case the third dose of DPT will be on the age of 7 [months]

Here the date starting the 6-month limit is based on the event date of the DPT1 dose, and not the enrollment date or the date of birth. Unfortunately in this case, program indicators cannot directly calculate that date value.

Rather I would advise that you generate this date value by program rules.

  1. Create a new date-type tracker data element for “Date DPT1 dose provided”
  2. Add this to your tracker program underneath the DPT1 dose data element
  3. Create a program rule variable for DPT1 dose in the current event V{DPT1dose_current_event}, and then a with condition d2:hasValue('DPT1dose_current_event') . The program rule action would ASSIGN the event date to the data element “Date DPT1 dose provided”.
  4. [Optional] If the PR in #3 above is set to Priority=2, you can make a separate PR with Priority=1 to hide the “Date DPT1 dose provided” data element unless DPT1 dose has a value.

You could then use the date of DPT1 dose data element value in the program indicator filter

d2:monthsBetween(#{programUID.dateofDPT1DataElement},V{analytics_period_start}) <= 6 && d2:monthsBetween(#{programUID.dateofDPT1DataElement},V{analytics_period_end}) >= 6

If you need to apply this program rule to existing data in your instance, I believe this is now possible by exporting the tracker data and reimporting by POST request to api/tracker endpoint. See the developer docs for more details.

Dear @brian Thank you for your prompt replies… in addition to @Gassim in prompt replies you are the second best hhhhh
Thank you so much for your very rich clarifications am in owe for that… this sound a great solution to my case… however am not a developer and i do not have a developer with me to help… so am afraid to play around and then lose my instances (since am working on a master thesis), but anyhow thanks tremendously .