# Information -----------------------------------------------------------------
## Project title --------------------------------------------------------------
### Charting the pitfalls of disproportionality analysis

## Data -----------------------------------------------------------------------
### VigiBase, accessed 31st December 2024, deduplicated, non-domestic

## Authors --------------------------------------------------------------------
### Michele Fusaroli, Daniele Sartori, Eugene P. van Puijenbroek, G. Niklas Norén

## Version --------------------------------------------------------------------
### Set up: 2024-11-13
### Last update: 2025-03-31

# Set up ----------------------------------------------------------------------
## upload DiAna ---------------------------------------------------------------
library(DiAna)
FAERS_version="VigiBase"

## Project_path ---------------------------------------------------------------
DiAna_path <- here::here()
project_path <- paste0(DiAna_path,"/projects/Pitfalls")
if(!file.exists(project_path)){dir.create(project_path)}
project_path <- paste0(project_path,"/")

## Input ----------------------------------------------------------------------
import("DRUG")
import("REAC")
import("DEMO")
Demo <- Demo[,init_fda_dt:=as.character(init_vb_date)]
import("INDI")
import("OUTC")
import_MedDRA()
import_ATC()
smq_narrow <- extractSMQ()

## polio vaccine, growth retardation --------------------------------------------------
drug <- "polio vaccine"
event <- "growth retardation"
restrictions <- list("crude" = unique(Demo$primaryid),
                     "neonates" = unique(Demo[age_in_days < 28]$primaryid),
                     "infants" = unique(Demo[age_in_days >= 28 & age_in_days < 30 * 24]$primaryid),
                     "children" = unique(Demo[age_in_days >= 30 * 24 & age_in_days < 11*365]$primaryid),
                     "other" = unique(Demo[age_in_days >= 11*365]$primaryid),
                     "unknown" = unique(Demo[is.na(age_in_days)]$primaryid))

disproportionality_df <- data.table()
for (n in 1:length(restrictions)) {
  t <- restrictions[n]
  t_name <- names(t)
  t_pids <- unlist(t)
  df <- disproportionality_analysis(
    drug_selected = unlist(drug),
    reac_selected = unlist(event),
    temp_drug = Drug[role_cod %in% c("PS", "SS")],
    restriction = t_pids
  )[, nested := t_name]
  disproportionality_df <- rbindlist(list(disproportionality_df, df), fill = TRUE)
}
disproportionality_df <- disproportionality_df[,expected:=(D*E/(D_E+D_nE+nD_E+nD_nE))]

render_forest(disproportionality_df,facet_v="nested",point_size = 5,xcoord_lims = c(-6,6))

create_dag("polio_vaccine","growth_retardation",label_inquiry = "",
           confounder_path = list(nodes=list("young_age"),signs=list("+","+"),
                                  label="Confounding by Age"))
## insulin, thrombotic stroke | diabetes --------------------------------------
drug <- "insulin nos"
event <- list("ischaemic stroke"=list(smq_narrow[["Ischaemic central nervous system vascular conditions (SMQ)"]]))
diabetes <- smq_narrow[["Hyperglycaemia/new onset diabetes mellitus (SMQ)"]]
restrictions <- list("crude" = unique(Demo$primaryid),
                     "diabetes" = unique(Indi[indi_pt%in%diabetes]$primaryid))

disproportionality_df <- data.table()
for (n in 1:length(restrictions)) {
  t <- restrictions[n]
  t_name <- names(t)
  t_pids <- unlist(t)
  df <- disproportionality_analysis(
    drug_selected = unlist(drug),
    reac_selected = unlist(event),
    temp_drug = Drug[role_cod %in% c("PS", "SS")],
    restriction = t_pids
  )[, nested := t_name]
  disproportionality_df <- rbindlist(list(disproportionality_df, df), fill = TRUE)
}
no
no
disproportionality_df <- disproportionality_df[,expected:=(D*E/(D_E+D_nE+nD_E+nD_nE))]

render_forest(disproportionality_df,facet_v="nested",point_size = 5,xcoord_lims = c(-6,6))

## hydrochlorothiazide cough | ACEI ---------------------------------------
drug <- "hydrochlorothiazide"
event <- "cough"
restrictions <- list("crude" = unique(Demo$primaryid),
                     "no_ACEI" = setdiff(Demo$primaryid,Drug[substance%in%ATC[Class4 == "ACE inhibitors, plain"]$substance]$primaryid))

disproportionality_df <- data.table()
for (n in 1:length(restrictions)) {
  t <- restrictions[n]
  t_name <- names(t)
  t_pids <- unlist(t)
  df <- disproportionality_analysis(
    drug_selected = unlist(drug),
    reac_selected = unlist(event),
    temp_drug = Drug[role_cod %in% c("PS", "SS")],
    restriction = t_pids
  )[, nested := t_name]
  disproportionality_df <- rbindlist(list(disproportionality_df, df), fill = TRUE)
}
disproportionality_df <- disproportionality_df[,expected:=(D*E/(D_E+D_nE+nD_E+nD_nE))]

render_forest(disproportionality_df[nested%in%c("crude","no_ACEI")],facet_v="nested",point_size = 5,xcoord_lims = c(-6,6))

## finasteride, breast cancer --------------------------------------------------
drug <- "finasteride"
event <- "breast cancer"
restrictions <- list("naive" = unique(Demo$primaryid),
                     "male" = unique(Demo[sex=="M"]$primaryid),
                     "female" = unique(Demo[sex=="F"]$primaryid),
                     "unknown" = unique(Demo[is.na(sex)]$primaryid))

disproportionality_df <- data.table()
for (n in 1:length(restrictions)) {
  t <- restrictions[n]
  t_name <- names(t)
  t_pids <- unlist(t)
  df <- disproportionality_analysis(
    drug_selected = unlist(drug),
    reac_selected = unlist(event),
    temp_drug = Drug[role_cod %in% c("PS", "SS")],
    restriction = t_pids
  )[, nested := t_name]
  disproportionality_df <- rbindlist(list(disproportionality_df, df), fill = TRUE)
}
disproportionality_df <- disproportionality_df[,expected:=(D*E/(D_E+D_nE+nD_E+nD_nE))]

render_forest(disproportionality_df,facet_v="nested",point_size = 5,xcoord_lims = c(-6,6))

## ceftriaxone, hepatitis --------------------------------------------------
drug <- "ceftriaxone"
event <- "hepatitis"
restrictions <- list("naive" = unique(Demo$primaryid),
                     "neonates" = unique(Demo[age_in_days < 28]$primaryid),
                     "infants" = unique(Demo[age_in_days >= 28 & age_in_days < 30 * 24]$primaryid),
                     "children" = unique(Demo[age_in_days >= 30 * 24 & age_in_days < 11*365]$primaryid),
                     "teenagers" = unique(Demo[age_in_days >= 11*365 & age_in_days < 18*365]$primaryid),
                     "adults" = unique(Demo[age_in_days >= 18*365 & age_in_days < 65*365]$primaryid),
                     "young old" = unique(Demo[age_in_days >= 65*365 & age_in_days < 75*365]$primaryid),
                     "middle old" = unique(Demo[age_in_days >= 75*365 & age_in_days < 85*365]$primaryid),
                     "oldest old" = unique(Demo[age_in_days >= 85*365]$primaryid),
                     "unknown" = unique(Demo[is.na(age_in_days)]$primaryid))

disproportionality_df <- data.table()
for (n in 1:length(restrictions)) {
  t <- restrictions[n]
  t_name <- names(t)
  t_pids <- unlist(t)
  df <- disproportionality_analysis(
    drug_selected = unlist(drug),
    reac_selected = unlist(event),
    temp_drug = Drug[role_cod %in% c("PS", "SS")],
    restriction = t_pids
  )[, nested := t_name]
  disproportionality_df <- rbindlist(list(disproportionality_df, df), fill = TRUE)
}
disproportionality_df <- disproportionality_df[,expected:=(D*E/(D_E+D_nE+nD_E+nD_nE))]

render_forest(disproportionality_df,facet_v="nested",point_size = 5,xcoord_lims = c(-6,6))

## mmr vaccine, autism -----------------------------------------------------
drug <- "measles vaccine;mumps vaccine;rubella vaccine"
event <- "autism spectrum disorder"

df <- disproportionality_trend(drug, event, temp_drug=Drug[role_cod%in%c("PS","SS")])
plot_disproportionality_trend(df)
df <- df[,expected:=(D*E/TOT)]
render_forest(df[,substance:="MMR vaccine"][period<2002&period>1996][
  , IC_signal:= factor(ifelse(IC_lower<0,"no SDR","SDR"),
                       levels=c("not enough cases","no SDR","SDR"),ordered=TRUE)
][,period:=as.factor(period)],facet_v = "period",
point_size = 5,xcoord_lims = c(-6,6))

## venlafaxine with rhabdomyolisis--------------------------------------------
drug <- "venlafaxine"
event <- "rhabdomyolysis"
restrictions <- list("crude" = unique(Demo$primaryid),
                     "no_statins" = setdiff(Demo$primaryid,intersect(Drug[substance%in%ATC[Class4 == "HMG CoA reductase inhibitors"]$substance]$primaryid,
                                                                     Reac[pt=="rhabdomyolysis"]$primaryid)))


temp <- disproportionality_trend("venlafaxine","rhabdomyolysis", temp_drug=Drug[role_cod%in%c("PS","SS")],min_2004 = FALSE)
plot_disproportionality_trend(temp)



temp <- temp[,expected:=(D*E/TOT)]

temp1 <- disproportionality_trend("venlafaxine","rhabdomyolysis", temp_drug=Drug[role_cod%in%c("PS","SS")],restriction = setdiff(Demo$primaryid,intersect(Drug[substance%in%ATC[Class4 == "HMG CoA reductase inhibitors"]$substance]$primaryid,
                                                                                                                                                          Reac[pt=="rhabdomyolysis"]$primaryid)),min_2004 = FALSE)
plot_disproportionality_trend(temp1)
temp1 <- temp1[,expected:=(D*E/TOT)]

temp3 <-rbindlist(list(temp[,substance:="venlafaxine"][,event:="rhabdomyolysis"][,IC_signal:= factor(ifelse(IC_lower<0,"no SDR","SDR"),levels=c("not enough cases","no SDR","SDR"),ordered=TRUE)
][
  as.numeric(as.character(period))>2001&as.numeric(as.character(period))<2011
][,period:=as.factor(period)][,period:=paste0(period,"crude")],temp1[,substance:="venlafaxine"][,event:="rhabdomyolysis"][,
                                                                                                                          IC_signal:= factor(ifelse(IC_lower<0,"no SDR","SDR"),levels=c("not enough cases","no SDR","SDR"),ordered=TRUE)
][
  as.numeric(as.character(period))>2001&as.numeric(as.character(period))<2011
][,period:=as.factor(period)][,period:=paste0(period,"no_statins")])) 
temp3 <-rbindlist(list(temp[,substance:="venlafaxine"][,event:="rhabdomyolysis"][,nested:="crude"][,IC_signal:= factor(ifelse(IC_lower<0,"no SDR","SDR"),levels=c("not enough cases","no SDR","SDR"),ordered=TRUE)
][
  as.numeric(as.character(period))>2001
][,period:=as.factor(period)],temp1[,substance:="venlafaxine"][,event:="rhabdomyolysis"][,nested:="no_statin"][,
                                                                                                               IC_signal:= factor(ifelse(IC_lower<0,"no SDR","SDR"),levels=c("not enough cases","no SDR","SDR"),ordered=TRUE)
][
  as.numeric(as.character(period))>2001
][,period:=as.factor(period)])) 

plot_disproportionality_trend(temp3)

#check proportion of statins for rhabdomyolysis
length(unique(Drug[primaryid%in%Reac[pt==event]$primaryid][role_cod%in%c("PS","SS")][substance %in% ATC[Class4 == "HMG CoA reductase inhibitors"]$substance]$primaryid))/length(unique(Reac[pt==event]$primaryid))

length(intersect(Drug[primaryid%in%Reac[pt==event]$primaryid][role_cod%in%c("PS","SS")][substance %in% ATC[Class4 == "HMG CoA reductase inhibitors"]$substance]$primaryid,Demo[init_fda_dt<2009]$primaryid))/length(intersect(Reac[pt==event]$primaryid,Demo[init_fda_dt<2009]$primaryid))

## lanadelumab with hereditary angioedema-----------------------------------
drug <- "lanadelumab"
event <- "hereditary angioedema"

df <- disproportionality_analysis(
  drug_selected = drug,
  reac_selected = event,
  temp_drug = Drug[role_cod %in% c("PS", "SS")]
)[, nested := event]

disproportionality_df <- df[,expected:=(D*E/(D_E+D_nE+nD_E+nD_nE))]

render_forest(disproportionality_df,facet_v="event",
              point_size = 5,xcoord_lims = c(-11,11))


## tisagenlecleucel, respiratory tract infection ------------------------------
drug <- "tisagenlecleucel"
event <- c("pt"=list("respiratory tract infection"),
           "HLTs"=list(c(MedDRA[hlt%in%c("upper respiratory tract infections",
                                         "lower respiratory tract and lung infections")]$pt,
                         "respiratory tract infection")),
           "SOC" = list(c(MedDRA[soc=="infections and infestations"]$pt)),
           "pneumonia"="pneumonia",
           "sinusitis"="sinusitis")

df <- disproportionality_analysis(
  drug_selected = drug,
  reac_selected = event,
  temp_drug = Drug[role_cod %in% c("PS", "SS")]
)[, nested := event]
no
disproportionality_df <- df[,expected:=(D*E/(D_E+D_nE+nD_E+nD_nE))]

render_forest(disproportionality_df,facet_v="event",
              point_size = 5,xcoord_lims = c(-6,6))

resp_terms_used <- Reac[pt%in%event$HLTs][primaryid%in%Drug[
  role_cod%in%c("PS","SS")][substance=="tisagenlecleucel"]$primaryid][
    ,.N,by="pt"][order(-N)]


## efalizumab with neuropathy-----------------------------------
drug <- "efalizumab"
event <- c("neuropathy peripheral"=list("neuropathy peripheral"),
           "HLGT"=list(MedDRA[hlgt=="peripheral neuropathies"]$pt),
           "guillain-barre syndrome"="guillain-barre syndrome",
           "demyelinating polyneuropathy"="demyelinating polyneuropathy")

df <- disproportionality_analysis(
  drug_selected = drug,
  reac_selected = event,
  temp_drug = Drug[role_cod %in% c("PS", "SS")]
)[, nested := event]
no
disproportionality_df <- df[,expected:=(D*E/(D_E+D_nE+nD_E+nD_nE))]

render_forest_new(disproportionality_df,facet_v="event",
                  point_size = 5,xcoord_lims = c(-6,6))


## montelukast, photophobia ------------------------------
drug <- "montelukast"
event <- "photophobia"

df <- disproportionality_analysis(
  drug_selected = drug,
  reac_selected = event,
  temp_drug = Drug[role_cod %in% c("PS", "SS")]
)[, nested := event]

disproportionality_df <- df[,expected:=(D*E/(D_E+D_nE+nD_E+nD_nE))]

render_forest(disproportionality_df,facet_v="event",
              point_size = 5,xcoord_lims = c(-6,6))
pids_m_p <- intersect(Drug[substance==drug&role_cod%in%c("PS","SS")]$primaryid,
                      Reac[pt==event]$primaryid)
Demo[primaryid%in%pids_m_p][,.N,by="occr_country"]
Drug[primaryid%in%pids_m_p][role_cod%in%c("PS","SS")][,.(substance=paste0(substance,collapse="; ")),by="primaryid"][,.N,by=substance]

## docetaxel with anhedonia ---------------------------------------------------
drug <- "docetaxel"
event <- "anhedonia"

pids_d_a <- intersect(Drug[role_cod%in%c("PS","SS")][substance==drug]$primaryid,
                      Reac[pt==event]$primaryid)
Reac[primaryid%in%pids_d_a][,.N,by="pt"][order(-N)]
Demo[primaryid%in%pids_d_a][,init_fda_dt:=as.numeric(substr(init_fda_dt,0,4))][,.N,by="init_fda_dt"][order(-N)]
Demo[primaryid%in%pids_d_a][,.N,by="occp_cod"][order(-N)]
Demo[primaryid%in%pids_d_a][,.N,by="occr_country"][order(-N)]

df <- disproportionality_analysis(
  drug_selected = drug,
  reac_selected = event,
  temp_drug = Drug[role_cod %in% c("PS", "SS")]
)[, nested := event]

disproportionality_df <- df[,expected:=(D*E/(D_E+D_nE+nD_E+nD_nE))]

render_forest(disproportionality_df,facet_v="event",point_size = 3,xcoord_lims = c(-6,6))


doc_pids <- unique(Drug[substance=="docetaxel"][role_cod%in%c("PS","SS")]$primaryid)
alo_pids <- unique(Reac[pt=="alopecia"]$primaryid)
alo_doc <- intersect(alo_pids,doc_pids)

pids_7_events <- intersect(intersect(intersect(intersect(intersect(intersect(alo_pids,Reac[pt=="anhedonia"]$primaryid),
                                                                   Reac[pt=="anxiety"]$primaryid),
                                                         Reac[pt=="discomfort"]$primaryid),
                                               Reac[pt=="emotional distress"]$primaryid),
                                     Reac[pt=="injury"]$primaryid),
                           Reac[pt=="pain"]$primaryid)
length(pids_7_events)
length(intersect(pids_7_events,doc_pids))
df <- disproportionality_analysis(
  drug_selected = drug,
  reac_selected = event,
  temp_drug = Drug[role_cod %in% c("PS", "SS")],
  restriction = setdiff(Demo$primaryid,pids_7_events)
)[, nested := event]
disproportionality_df <- df[,expected:=(D*E/(D_E+D_nE+nD_E+nD_nE))]

render_forest(disproportionality_df,facet_v="event",point_size = 5,xcoord_lims = c(-6,6))


## tisagenlecleucel, anemia --------------------------------------------------
drug <- "tisagenlecleucel"
event <- "anaemia"

restrictions <- list("naive" = unique(Demo$primaryid),
                     "leukemias" = unique(Indi[indi_pt%in%MedDRA[hlgt=="leukaemias"]$pt]$primaryid))

disproportionality_df <- data.table()
for (n in 1:length(restrictions)) {
  t <- restrictions[n]
  t_name <- names(t)
  t_pids <- unlist(t)
  df <- disproportionality_analysis(
    drug_selected = unlist(drug),
    reac_selected = unlist(event),
    temp_drug = Drug[role_cod %in% c("PS", "SS")],
    restriction = t_pids
  )[, nested := t_name]
  disproportionality_df <- rbindlist(list(disproportionality_df, df), fill = TRUE)
}
disproportionality_df <- disproportionality_df[,expected:=(D*E/(D_E+D_nE+nD_E+nD_nE))]

render_forest(disproportionality_df,facet_v="nested",point_size = 5,xcoord_lims = c(-6,6))

Drug[primaryid%in%Indi[indi_pt%in%MedDRA[hlgt=="leukaemias"]$pt]$primaryid][,.N,by="substance"][order(-N)]
tot <- length(unique(Drug[primaryid%in%Indi[indi_pt%in%MedDRA[hlgt=="leukaemias"]$pt]$primaryid]$primaryid))
length(unique(Drug[primaryid%in%Indi[indi_pt%in%MedDRA[hlgt=="leukaemias"]$pt]$primaryid][substance=="ibrutinib"]$primaryid))/tot
length(unique(Drug[primaryid%in%Indi[indi_pt%in%MedDRA[hlgt=="leukaemias"]$pt]$primaryid][substance=="imatinib"]$primaryid))/tot
length(unique(Drug[primaryid%in%Indi[indi_pt%in%MedDRA[hlgt=="leukaemias"]$pt]$primaryid][substance=="venetoclax"]$primaryid))/tot


## pembrolizumab and cardiac failure-----------------------------------
drug <- "pembrolizumab"
event <- "cardiac failure"

df <- disproportionality_analysis(
  drug_selected = drug,
  reac_selected = event,
  temp_drug = Drug[role_cod %in% c("PS", "SS")]
)[, nested := "crude"]


df1 <- disproportionality_analysis(
  drug_selected = drug,
  reac_selected = event,
  temp_drug = Drug[role_cod %in% c("PS", "SS")],
  restriction = unique(Outc[outc_cod!="OT"]$primaryid)
)[, nested := "only_serious"]
disproportionality_df <- rbindlist(list(df,df1))
disproportionality_df[,expected:=(D*E/(D_E+D_nE+nD_E+nD_nE))]

render_forest(disproportionality_df,facet_v="nested",point_size = 5,xcoord_lims = c(-6,6))
