A quick reproduction script for @davehawkinsSOA

Get latest data from ONS

setup/requirements



library(tidyverse)
library(hrbrthemes)
library(janitor)
library(readxl)
options(dplyr.summarise.inform = FALSE)

fetch file


latest_file_url='https://www.ons.gov.uk/file?uri=/peoplepopulationandcommunity/birthsdeathsandmarriages/deaths/datasets/deathsbyvaccinationstatusengland/deathsoccurringbetween1january2021and31may2022/referencetable06072022accessible.xlsx'

onsdl=tempfile(fileext='.xlsx')

download.file(url=latest_file_url,destfile=onsdl,mode='wb',quiet=T)

parse file and process data




tbl2=read_xlsx(onsdl,sheet='Table 2',skip=3) %>%
  clean_names() %>%
  mutate(
    date=as.Date.character(sprintf("%s 1, %d",month,year),"%B %d, %Y"),
    rate=as.numeric(age_standardised_mortality_rate_100_000_person_years),
    rate_lo=as.numeric(lower_confidence_limit),
    rate_hi=as.numeric(upper_confidence_limit),
    count_of_deaths=as.numeric(count_of_deaths),
    vaxgrp=ifelse(vaccination_status=='Unvaccinated','Unvaccinated','Any vaccination level')
  )

tbl2_agg=tbl2 %>%
  group_by(cause_of_death,date,age_group,vaxgrp) %>%
  summarise(
    rate_adj=weighted.mean(rate,w=person_years,na.rm=T), # get weighted average of ONS's ASMR
    count_of_deaths=sum(count_of_deaths,na.rm=T),
    person_years=sum(person_years,na.rm=T)    
  ) %>%
  ungroup() %>%
  mutate(
    rate_crude=count_of_deaths/person_years*1e5,
    se=rate_adj/sqrt(count_of_deaths),
    ci=1.96*se,
    rate_lo=rate_adj-ci,
    rate_hi=rate_adj+ci
  )  

quick plot

tbl2_agg %>%
  filter(
    cause_of_death=='All causes',
    age_group!= '18-39'
  ) %>%
  ggplot(aes(date,rate_adj,color=vaxgrp)) +
      geom_ribbon(aes(ymin=rate_lo,ymax=rate_hi),alpha=0.5) +
      geom_line(size=1) +
      #scale_y_log10() +
      #annotation_logticks(sides='lr')  +
      facet_wrap(~age_group,scale='free_y') +
      theme_ipsum() +
      labs(
        title='Monthly age-standardised mortality rates for all cause deaths by age group and vax status',
        color=NULL,
        y='Age-standardised all cause deaths per 100,000',
        caption='source: UK ONS, Deaths by vaccination status, England\nhttps://www.ons.gov.uk/peoplepopulationandcommunity/birthsdeathsandmarriages/deaths/datasets/deathsbyvaccinationstatusengland'
      ) +
      theme(
        legend.position='bottom',
        panel.grid.minor = element_blank(),
        axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1),
        panel.spacing = unit(.2, "lines")
      ) 

LS0tCnRpdGxlOiAiVmF4IGRhdGEgZm9yIEBkYXZlaGF3a2luc1NPQSIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6CiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUKZWRpdG9yX29wdGlvbnM6CiAgY2h1bmtfb3V0cHV0X3R5cGU6IGlubGluZQotLS0KCkEgcXVpY2sgcmVwcm9kdWN0aW9uIHNjcmlwdCBmb3IgW0BkYXZlaGF3a2luc1NPQV0oaHR0cHM6Ly90d2l0dGVyLmNvbS9kYXZlaGF3a2luc1NPQS9zdGF0dXMvMTU0NTE3NDQzMzc2NTIyODU0NSkKCgoKR2V0IFtsYXRlc3QgZGF0YSBmcm9tIE9OU10oaHR0cHM6Ly93d3cub25zLmdvdi51ay9wZW9wbGVwb3B1bGF0aW9uYW5kY29tbXVuaXR5L2JpcnRoc2RlYXRoc2FuZG1hcnJpYWdlcy9kZWF0aHMvZGF0YXNldHMvZGVhdGhzYnl2YWNjaW5hdGlvbnN0YXR1c2VuZ2xhbmQpCgoKc2V0dXAvcmVxdWlyZW1lbnRzCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CgoKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoaHJicnRoZW1lcykKbGlicmFyeShqYW5pdG9yKQpsaWJyYXJ5KHJlYWR4bCkKb3B0aW9ucyhkcGx5ci5zdW1tYXJpc2UuaW5mb3JtID0gRkFMU0UpCgoKCmBgYAoKCmZldGNoIGZpbGUKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KCmxhdGVzdF9maWxlX3VybD0naHR0cHM6Ly93d3cub25zLmdvdi51ay9maWxlP3VyaT0vcGVvcGxlcG9wdWxhdGlvbmFuZGNvbW11bml0eS9iaXJ0aHNkZWF0aHNhbmRtYXJyaWFnZXMvZGVhdGhzL2RhdGFzZXRzL2RlYXRoc2J5dmFjY2luYXRpb25zdGF0dXNlbmdsYW5kL2RlYXRoc29jY3VycmluZ2JldHdlZW4xamFudWFyeTIwMjFhbmQzMW1heTIwMjIvcmVmZXJlbmNldGFibGUwNjA3MjAyMmFjY2Vzc2libGUueGxzeCcKCm9uc2RsPXRlbXBmaWxlKGZpbGVleHQ9Jy54bHN4JykKCmRvd25sb2FkLmZpbGUodXJsPWxhdGVzdF9maWxlX3VybCxkZXN0ZmlsZT1vbnNkbCxtb2RlPSd3YicscXVpZXQ9VCkKCmBgYAoKcGFyc2UgZmlsZSBhbmQgcHJvY2VzcyBkYXRhCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CgoKCnRibDI9cmVhZF94bHN4KG9uc2RsLHNoZWV0PSdUYWJsZSAyJyxza2lwPTMpICU+JQogIGNsZWFuX25hbWVzKCkgJT4lCiAgbXV0YXRlKAogICAgZGF0ZT1hcy5EYXRlLmNoYXJhY3RlcihzcHJpbnRmKCIlcyAxLCAlZCIsbW9udGgseWVhciksIiVCICVkLCAlWSIpLAogICAgcmF0ZT1hcy5udW1lcmljKGFnZV9zdGFuZGFyZGlzZWRfbW9ydGFsaXR5X3JhdGVfMTAwXzAwMF9wZXJzb25feWVhcnMpLAogICAgcmF0ZV9sbz1hcy5udW1lcmljKGxvd2VyX2NvbmZpZGVuY2VfbGltaXQpLAogICAgcmF0ZV9oaT1hcy5udW1lcmljKHVwcGVyX2NvbmZpZGVuY2VfbGltaXQpLAogICAgY291bnRfb2ZfZGVhdGhzPWFzLm51bWVyaWMoY291bnRfb2ZfZGVhdGhzKSwKICAgIHZheGdycD1pZmVsc2UodmFjY2luYXRpb25fc3RhdHVzPT0nVW52YWNjaW5hdGVkJywnVW52YWNjaW5hdGVkJywnQW55IHZhY2NpbmF0aW9uIGxldmVsJykKICApCgp0YmwyX2FnZz10YmwyICU+JQogIGdyb3VwX2J5KGNhdXNlX29mX2RlYXRoLGRhdGUsYWdlX2dyb3VwLHZheGdycCkgJT4lCiAgc3VtbWFyaXNlKAogICAgcmF0ZV9hZGo9d2VpZ2h0ZWQubWVhbihyYXRlLHc9cGVyc29uX3llYXJzLG5hLnJtPVQpLCAjIGdldCB3ZWlnaHRlZCBhdmVyYWdlIG9mIE9OUydzIEFTTVIKICAgIGNvdW50X29mX2RlYXRocz1zdW0oY291bnRfb2ZfZGVhdGhzLG5hLnJtPVQpLAogICAgcGVyc29uX3llYXJzPXN1bShwZXJzb25feWVhcnMsbmEucm09VCkgICAgCiAgKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgbXV0YXRlKAogICAgcmF0ZV9jcnVkZT1jb3VudF9vZl9kZWF0aHMvcGVyc29uX3llYXJzKjFlNSwKICAgIHNlPXJhdGVfYWRqL3NxcnQoY291bnRfb2ZfZGVhdGhzKSwKICAgIGNpPTEuOTYqc2UsCiAgICByYXRlX2xvPXJhdGVfYWRqLWNpLAogICAgcmF0ZV9oaT1yYXRlX2FkaitjaQogICkgIAoKCmBgYAoKcXVpY2sgcGxvdApgYGB7ciBmaWcuaGVpZ2h0PTEwLCBmaWcud2lkdGg9MTAsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CgoKdGJsMl9hZ2cgJT4lCiAgZmlsdGVyKAogICAgY2F1c2Vfb2ZfZGVhdGg9PSdBbGwgY2F1c2VzJywKICAgIGFnZV9ncm91cCE9ICcxOC0zOScKICApICU+JQogIGdncGxvdChhZXMoZGF0ZSxyYXRlX2Fkaixjb2xvcj12YXhncnApKSArCiAgICAgIGdlb21fcmliYm9uKGFlcyh5bWluPXJhdGVfbG8seW1heD1yYXRlX2hpKSxhbHBoYT0wLjUpICsKICAgICAgZ2VvbV9saW5lKHNpemU9MSkgKwogICAgICAjc2NhbGVfeV9sb2cxMCgpICsKICAgICAgI2Fubm90YXRpb25fbG9ndGlja3Moc2lkZXM9J2xyJykgICsKICAgICAgZmFjZXRfd3JhcCh+YWdlX2dyb3VwLHNjYWxlPSdmcmVlX3knKSArCiAgICAgIHRoZW1lX2lwc3VtKCkgKwogICAgICBsYWJzKAogICAgICAgIHRpdGxlPSdNb250aGx5IGFnZS1zdGFuZGFyZGlzZWQgbW9ydGFsaXR5IHJhdGVzIGZvciBhbGwgY2F1c2UgZGVhdGhzIGJ5IGFnZSBncm91cCBhbmQgdmF4IHN0YXR1cycsCiAgICAgICAgY29sb3I9TlVMTCwKICAgICAgICB5PSdBZ2Utc3RhbmRhcmRpc2VkIGFsbCBjYXVzZSBkZWF0aHMgcGVyIDEwMCwwMDAnLAogICAgICAgIGNhcHRpb249J3NvdXJjZTogVUsgT05TLCBEZWF0aHMgYnkgdmFjY2luYXRpb24gc3RhdHVzLCBFbmdsYW5kXG5odHRwczovL3d3dy5vbnMuZ292LnVrL3Blb3BsZXBvcHVsYXRpb25hbmRjb21tdW5pdHkvYmlydGhzZGVhdGhzYW5kbWFycmlhZ2VzL2RlYXRocy9kYXRhc2V0cy9kZWF0aHNieXZhY2NpbmF0aW9uc3RhdHVzZW5nbGFuZCcKICAgICAgKSArCiAgICAgIHRoZW1lKAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbj0nYm90dG9tJywKICAgICAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIHZqdXN0ID0gMC41LCBoanVzdD0xKSwKICAgICAgICBwYW5lbC5zcGFjaW5nID0gdW5pdCguMiwgImxpbmVzIikKICAgICAgKSAKCmBgYAoK