Drug shortages in the time of COVID-19

According to an article by the Canadian Pharmacists Association published on April 17, 2020, Canada’s pharmacists are “concerned about dramatic increases and volatility in the number of reported drug shortages”. Specifically:

The number of shortages reported to the [Drug Shortages Canada] database has climbed steadily throughout March, but increased dramatically in the last few weeks.

From March 24 to April 7, an average of 11.6 shortages were reported to the database each day. During the week of March 31 to April 7, this number increased to 15.9 shortages per day. Although these do not necessarily translate to shortages at the pharmacy level, this is an alarming trend.

Let’s reproduce these results and then evaluate the claim about whether these are “dramatic increases”. I should say that I don’t expect to get exactly the same numbers because I’m working from a different snapshot of the database – it’s possible that shortages have been retrospectively added/removed that will change the counts I get today. But, we should get close.

library(tidyverse)
library(lubridate)
library(drugshortagesr)     # devtools::install_github('pipitone/drugshortagesr')
dsc = dsc_search()
Code language: PHP (php)

We’ll begin by calculating the average number of shortages reported to the DSC from March 24 to April 7. (Aside: do pharmacists start their week on a Tuesday? Genuinely curious.)

report_period = interval(ymd('2020-03-24'), ymd('2020-04-07'))
dsc %>% filter(actual_start_date %within% report_period ) %>%
  count() %>% 
  mutate(reports_per_day = n / (report_period / days(1))) %>% 
  pull()Code language: JavaScript (javascript)
## [1] 14.14286Code language: CSS (css)

Okay, we get higher number of average reports per date (not wildly different but a decent margin of error there).

Moving on, if we look at just the week from March 31 to April 7, we find the following:

report_period = interval(ymd('2020-03-31'), ymd('2020-04-08'))
dsc %>% filter(actual_start_date %within% report_period ) %>%
  count() %>% 
  mutate(reports_per_day = n / (report_period / days(1)) ) %>%
  pull()Code language: JavaScript (javascript)
## [1] 16.625Code language: CSS (css)

So yes, the reports-per-day average increases as reported (my count is now only 4% off).

I’m satisfied we are looking at roughly the same dataset. I find it odd that they chose the overlapping intervals that they did and suspect it might be a typo, but let’s move on.

The bigger question is, do these weeks represent “spikes” in daily reports? To answer that, let’s look at average daily reports for each week from 2019 onwards:

report_period = interval(ymd('2019-01-01'), ymd('2020-04-12'))
dsc %>% 
  filter(type.label == "shortage") %>%
  mutate(start_week = as.Date(floor_date(actual_start_date, unit="week"))) %>%
  #filter(start_week > ymd('2019-01-01')) %>%
  filter(start_week %within% report_period) %>%
  count(start_week) %>%
  mutate(reports_per_day = n/7) %>%
  ggplot(aes(x=start_week, y=reports_per_day)) + 
  geom_point() + 
  scale_x_date(labels=scales::date_format("%b"), 
               date_breaks="1 month") Code language: PHP (php)

I see an isolated spike in average daily shortages in the last week of March but otherwise a fairly typical looking spread of daily reports in recent months, including quite a low daily rate last week. I don’t see a upward trend post-COVID to be alarmed about, just yet. But that’s looking at the daily reporting rates only.

It might be that it is misleading to focus on aggregates like total shortage counts and rates. It’s conceivable that in these times with such dramatic change in behaviours we might actually see forces tending to decrease shortage rates in addition to increases due to COVID treatment. For instance, if fewer people are visiting their PCPs and hospitals for elective procedures and so on, might this work to lower the background level of demand-related medication shortages?

In any case, the article goes on to discuss several specific medication classes related to COVID-19 and the shortage spikes happening to them. Again, we need to be careful not to extrapolate from a few data points, but I do think paying attention to essential medications likely to see demand increases. I am currently tracking several of these medication classes on my drug shortages dashboard here:

https://drugshortages.pipitone.ca#covid-19


Addendum 2020-04-19 1900. So what happened during March 31 – April 8 that caused such a spike in shortage reports?

Here’s day-by-day break down of the number of reports per day:

report_period = interval(ymd('2020-03-31'), ymd('2020-04-07'))
dsc %>% filter(actual_start_date %within% report_period ) %>%
  count(actual_start_date)Code language: JavaScript (javascript)
| actual_start_date   |   n |
|---------------------|-----|
| 2020-03-31 04:00:00 |   3 |
| 2020-04-01 04:00:00 |  62 |
| 2020-04-02 04:00:00 |  11 |
| 2020-04-03 04:00:00 |  19 |
| 2020-04-06 04:00:00 |  31 |

All action happened on April 1st! It had about 6x the rate of the average daily rate of the previous week. Showing all 62 shortage reports is too cumbersome for my blog, but you can do the search yourself on https://drugshortagescanada.ca.

To understand what’s happening, we can further breakdown the counts by “reason” given:

dsc %>% filter(as.Date(actual_start_date) == ymd('2020-04-01')) %>%
  count(actual_start_date, shortage_reason.en_reason)Code language: JavaScript (javascript)
| actual_start_date | shortage_reason.en_reason                        |   n |
|-------------------|--------------------------------------------------|-----|
| 2020-04-01        | Demand increase for the drug.                    |   5 |
| 2020-04-01        | Disruption of the manufacture of the drug.       |  50 |
| 2020-04-01        | Shortage of an active ingredient.                |   2 |
| 2020-04-01        | Other (Please describe in comments)              |   1 |
| 2020-04-01        | Delay in shipping of the drug.                   |   3 |
| 2020-04-01        | Shortage of an inactive ingredient or component. |   1 |

50 shortages due to manufacturing disruptions! Something is up. 1st of the month, 50 shortages of a single kind. Hmmm.

There’s a field for optional comments that sometimes (ahem, rarely) has interesting information in it. Let’s see what the comments are for April 1st shortages:

dsc %>% filter(as.Date(actual_start_date) == ymd('2020-04-01')) %>%
  filter(!is.na(en_comments)) %>%
  count(en_comments)Code language: JavaScript (javascript)
| en_comments                                               |     n | 
|-----------------------------------------------------------|-------| 
| For emergency supply, contact GSK Customer Service 1-800… |     1 | 
| Limited inventory available on allocation                 |     1 | 
| On 25% Allocation effective April 1, 2020                 |     1 | 
| On 50% Allocation effective April 1, 2020                 |     1 | 
| Other strengths remain available                          |     1 | 
| Pack size to be discontinued                              |     1 | 
| Preventatively managing available supply through measure… |     1 | 
| Re-supply is ongoing with inventory allocated to 50% of … |     1 | 
| Will be covered by 30mL format                            |     1 | 
| Will cover 25% of the market throughout shortage period.… |     2 | Code language: JavaScript (javascript)

The references to “allocation” suggest some sort of policy put in place starting April 1, 2020, but I don’t know anything about that. I’ll ask Dr. Duffin.

If we look at which companies a responsible for shortages, we find it’s mostly TEVA CANADA.

dsc %>% filter(as.Date(actual_start_date) == ymd('2020-04-01')) %>%
  count(company_name) %>% arrange(desc(n))Code language: JavaScript (javascript)
| company_name              |    n |
|---------------------------|------|
| TEVA CANADA LIMITED       |   50 |
| FRESENIUS KABI CANADA LTD |    4 |
| GLAXOSMITHKLINE INC       |    3 |
| PFIZER CANADA ULC         |    2 |
| ACTAVIS PHARMA COMPANY    |    1 |
| ENDO VENTURES LTD         |    1 |
| LEO PHARMA INC            |    1 |

One day, one company, for mainly one reason. I have no idea why. To be continued.