# Install necessary packages
# Please choose the "mirror" which is closest to you
# If the packages are already installed, this may result in errors
install.packages(c("meta","metasens"))
# Load necessary packages
suppressMessages(library(meta))
library(metasens)

# Set the digits to 2 for meta-analysis
settings.meta(digits=2)
# Format for forest plot
settings.meta("RevMan5")

# Functions to create graphs easily
f.ForestPlot<-function(KG, OutcomeType){
  plot.new()
  forest(KG, colgap = ifelse(OutcomeType == "Continuous","5mm","8mm"), digits = 2, digits.se = 2)
  title(main=KG$outclab)
  recordPlot()
}
f.ForestPlot.SA<-function(KG, OutcomeType,a){
  plot.new()
  forest(KG, colgap = ifelse(OutcomeType == "Continuous","5mm","8mm"), digits = 2, digits.se = 2)
  title(main=paste0(KG$outclab,' (',c("Informative Missingness Odds Ratio (IMOR)","Best-worst analysis","Worst-best analysis","Sensitivity analysis")[a],')'))
  recordPlot()
}
f.ForestPlot.SubA<-function(KG, OutcomeType, SubgroupTitle){
  plot.new()
  forest(KG, colgap = ifelse(OutcomeType == "Continuous","5mm","8mm"), digits = 2, digits.se = 2)
  title(main=paste0(KG$outclab,'\n','Moderator: ',SubgroupTitle))
  recordPlot()
}
f.FunnelPlot<-function(KG){
  funnel(
    KG, 
    level = 0.95, 
    contour.levels = c(0.9, 0.95, 0.99),
  )
  legend(x="topright",
         c("0.1 > p > 0.05", "0.05 > p > 0.01", "< 0.01"),
         fill = gray(seq(0.5, 0.9, len=3)),
  )
  title(main=KG$outclab)
  recordPlot()
}

f.BubblePlot<-function(KG1, KG2){
  if (KG2$sm %in% c("OR","RR","HR","ROM")){
    bubble(KG1,
           ylim = range(exp(KG2$TE), na.rm = TRUE)
    )
  } else {
    bubble(KG1,
           ylim = range(KG2$TE, na.rm = TRUE)
    )
  }
  title(
    main=paste0(KG2$outclab, ' (metaregression)'),
    sub = "Each bubble represents a study. Larger bubbles indicates smaller variance and viceversa"
  )
  recordPlot()
}



f.PlotText <- function(KG) {
  plot.new()
  title(main=KG)
  recordPlot()
}

# Sensitivity analysis
f.IMOR <- function(df_Outcome,MA, IMOR_E=1,IMOR_C=1) {
  # Intervention
  r.e <- as.vector(df_Outcome[,7])
  f.e <- as.vector(df_Outcome[,5]-df_Outcome[,7])
  m1.e <- as.vector(df_Outcome[,14])
  m2.e <- as.vector(df_Outcome[,15])
  m3.e <- as.vector(df_Outcome[,16])
  m4.e <- as.vector(df_Outcome[,17])
  m5.e <- as.vector(df_Outcome[,18])
  m6.e <- as.vector(df_Outcome[,19])
  m7.e <- as.vector(df_Outcome[,20])
  m.e <- rowSums(cbind(m1.e,m2.e,m3.e,m4.e,m5.e,m6.e),na.rm = TRUE)
  N.e <- rowSums(cbind(r.e,f.e,m.e),na.rm = TRUE)
  # Control
  r.c <- as.vector(df_Outcome[,8])
  f.c <- as.vector(df_Outcome[,6]-df_Outcome[,8])
  m1.c <- as.vector(df_Outcome[,21])
  m2.c <- as.vector(df_Outcome[,22])
  m3.c <- as.vector(df_Outcome[,23])
  m4.c <- as.vector(df_Outcome[,24])
  m5.c <- as.vector(df_Outcome[,25])
  m6.c <- as.vector(df_Outcome[,26])
  m7.c <- as.vector(df_Outcome[,27])
  m.c <- rowSums(cbind(m1.c,m2.c,m3.c,m4.c,m5.c,m6.c),na.rm = TRUE)
  N.c <- rowSums(cbind(r.c,f.c,m.c),na.rm = TRUE)
  
  IMOR <- data.frame(cbind(r.e,f.e,m1.e,m2.e,m3.e,m4.e,m5.e,m6.e,m.e,N.e,
                           r.c,f.c,m1.c,m2.c,m3.c,m4.c,m5.c,m6.c,m.c,N.c
  ))
  
  # Zero event trials increase by 0.5 for each cell
  IMOR[IMOR$r.e == 0 | IMOR$f.e == 0 | IMOR$r.c == 0 | IMOR$f.c ==0,c(1:2,11:12)] <- 
    lapply(IMOR[IMOR$r.e == 0 | IMOR$f.e == 0 | IMOR$r.c == 0 | IMOR$f.c ==0,c(1:2,11:12)],function(x) {x+0.5})
  
  # If the trial did not state whether the data is missing, m7 should be based on the proportion of drop-outs in remaining trials (in the group) and then distributed as for m6
  # But for this, we need at least one study to report the drop out
  if (sum(is.na(IMOR[,c(3:8, 13:18)])) != 12*nrow(IMOR)) {
    # if drop out is reported only in the intervention assume similar drop-outs in control group and vice versa; otherwise calculate the drop-outs from the respective groups
    if (sum(is.na(IMOR[,c(3:8)])) == 6*nrow(IMOR)) {
      IMOR$m6.c <- ifelse(is.na(IMOR$m6.c),ifelse(m7.c !=0, sum(IMOR$m.c[m7.c == 0],na.rm = TRUE)/sum(IMOR$N.c[m7.c == 0],na.rm = TRUE)*IMOR$N.c,IMOR$m6.c),IMOR$m6.c)
      IMOR$m6.e <- IMOR$m6.c
    } else if (sum(is.na(IMOR[,c(13:18)])) == 6*nrow(IMOR)) {
      IMOR$m6.e <- ifelse(is.na(IMOR$m6.e),ifelse(m7.e !=0, sum(IMOR$m.e[m7.e == 0],na.rm = TRUE)/sum(IMOR$N.e[m7.e == 0],na.rm = TRUE)*IMOR$N.e,IMOR$m6.e),IMOR$m6.e)
      IMOR$m6.c <- IMOR$m6.e
    } else {
      IMOR$m6.e <- ifelse(is.na(IMOR$m6.e),ifelse(m7.e !=0, sum(IMOR$m.e[m7.e == 0],na.rm = TRUE)/sum(IMOR$N.e[m7.e == 0],na.rm = TRUE)*IMOR$N.e,IMOR$m6.e),IMOR$m6.e)
      IMOR$m6.c <- ifelse(is.na(IMOR$m6.c),ifelse(m7.c !=0, sum(IMOR$m.c[m7.c == 0],na.rm = TRUE)/sum(IMOR$N.c[m7.c == 0],na.rm = TRUE)*IMOR$N.c,IMOR$m6.c),IMOR$m6.c)
    }
  }
  
  # Now replace NA with 0
  IMOR[is.na(IMOR)] <- 0
  
  # update the IMOR$m.e and IMOR.m.c and N.e, N.c
  IMOR$m.e <- rowSums(IMOR[,3:8])
  IMOR$m.c <- rowSums(IMOR[,13:18])
  IMOR$N.e <- rowSums(IMOR[,c(1:2,9)])
  IMOR$N.c <- rowSums(IMOR[,c(11:12,19)])
  
  # If the reasons were not stated m6 should be distributed according to the median proportions of m1 to m5 (in the group) 
  # Again the trials where number missing was not stated should be excluded
  # Since we are redistributing the unknown cases to known cases, the proportions should be based on m - m6
  # Means rather than medians: if we choose medians, the proportions can come from different studies and the sum may not be one
  # Because of the formula used, if m6 =0, m1 = m1, m2 = m2, etc
  # How if the only value provided is m6 in all trials, then move m6 to m5 to allow standard IMOR
  if (sum(IMOR[,c(3:7)]) == 0){
    IMOR$m5.e <- IMOR$m6.e
  } else {
    IMOR$m1.e <- IMOR$m1.e + sum(IMOR$m1.e[m7.e == 0],na.rm = TRUE)/(sum(IMOR$m.e[m7.e == 0],na.rm = TRUE)-sum(IMOR$m6.e[m7.e == 0],na.rm = TRUE))*IMOR$m6.e
    IMOR$m2.e <- IMOR$m2.e + sum(IMOR$m2.e[m7.e == 0],na.rm = TRUE)/(sum(IMOR$m.e[m7.e == 0],na.rm = TRUE)-sum(IMOR$m6.e[m7.e == 0],na.rm = TRUE))*IMOR$m6.e
    IMOR$m3.e <- IMOR$m3.e + sum(IMOR$m3.e[m7.e == 0],na.rm = TRUE)/(sum(IMOR$m.e[m7.e == 0],na.rm = TRUE)-sum(IMOR$m6.e[m7.e == 0],na.rm = TRUE))*IMOR$m6.e
    IMOR$m4.e <- IMOR$m4.e + sum(IMOR$m4.e[m7.e == 0],na.rm = TRUE)/(sum(IMOR$m.e[m7.e == 0],na.rm = TRUE)-sum(IMOR$m6.e[m7.e == 0],na.rm = TRUE))*IMOR$m6.e
    IMOR$m5.e <- IMOR$m5.e + sum(IMOR$m5.e[m7.e == 0],na.rm = TRUE)/(sum(IMOR$m.e[m7.e == 0],na.rm = TRUE)-sum(IMOR$m6.e[m7.e == 0],na.rm = TRUE))*IMOR$m6.e
  }
  
  if (sum(IMOR[,c(13:17)]) == 0){
    IMOR$m5.c <- IMOR$m6.c
  } else {
    IMOR$m1.c <- IMOR$m1.c + sum(IMOR$m1.c[m7.c == 0],na.rm = TRUE)/(sum(IMOR$m.c[m7.c == 0],na.rm = TRUE)-sum(IMOR$m6.c[m7.c == 0],na.rm = TRUE))*IMOR$m6.c
    IMOR$m2.c <- IMOR$m2.c + sum(IMOR$m2.c[m7.c == 0],na.rm = TRUE)/(sum(IMOR$m.c[m7.c == 0],na.rm = TRUE)-sum(IMOR$m6.c[m7.c == 0],na.rm = TRUE))*IMOR$m6.c
    IMOR$m3.c <- IMOR$m3.c + sum(IMOR$m3.c[m7.c == 0],na.rm = TRUE)/(sum(IMOR$m.c[m7.c == 0],na.rm = TRUE)-sum(IMOR$m6.c[m7.c == 0],na.rm = TRUE))*IMOR$m6.c
    IMOR$m4.c <- IMOR$m4.c + sum(IMOR$m4.c[m7.c == 0],na.rm = TRUE)/(sum(IMOR$m.c[m7.c == 0],na.rm = TRUE)-sum(IMOR$m6.c[m7.c == 0],na.rm = TRUE))*IMOR$m6.c
    IMOR$m5.c <- IMOR$m5.c + sum(IMOR$m5.c[m7.c == 0],na.rm = TRUE)/(sum(IMOR$m.c[m7.c == 0],na.rm = TRUE)-sum(IMOR$m6.c[m7.c == 0],na.rm = TRUE))*IMOR$m6.c
  }
  # To avoid confusion, drop m6.e, m6.e
  IMOR <- IMOR[,-c(8,18)]
  
  IMOR$p.e <- IMOR$r.e/(IMOR$r.e+IMOR$f.e)
  IMOR$a.e <- IMOR$m.e/IMOR$N.e
  IMOR$m1.a.e <- IMOR$m1.e/IMOR$N.e
  IMOR$m2.a.e <- IMOR$m2.e/IMOR$N.e 
  IMOR$m3.a.e <- IMOR$m3.e/IMOR$N.e 
  IMOR$m4.a.e <- IMOR$m4.e/IMOR$N.e 
  IMOR$m5.a.e <- IMOR$m5.e/IMOR$N.e 
  IMOR$p.c <- IMOR$r.c/(IMOR$r.c+IMOR$f.c)
  IMOR$a.c <- IMOR$m.c/IMOR$N.c
  IMOR$m1.a.c <- IMOR$m1.c/IMOR$N.c 
  IMOR$m2.a.c <- IMOR$m2.c/IMOR$N.c 
  IMOR$m3.a.c <- IMOR$m3.c/IMOR$N.c 
  IMOR$m4.a.c <- IMOR$m4.c/IMOR$N.c 
  IMOR$m5.a.c <- IMOR$m5.c/IMOR$N.c
  
  # At this stage make three more: IMOR_01, IMOR_10 for best case and worst case analysis (for bad outcomes) and IMOR-M where IMOR is used for all missing causes
  IMOR_01 <- IMOR
  IMOR_10 <- IMOR
  IMOR_M <- IMOR
  
  # m1= Missing failure (Intervention): p = 0
  # m2 = Missing success (Intervention): p = 1
  # m3 = Missing unrelated (Intervention): p = p.e
  # m4 = Missing protocol violation (Intervention) (receives Control): p = p.c
  # m5 = Missing other (Intervention): p based on IMOR (user provided)
  
  # Calcuate IMORs for m1 to m4 from p and p from IMOR for m5
  IMOR$m1.p.e <- ifelse(tolower(df_Outcome[1,3])=="worse",1,0)
  IMOR$m2.p.e <- ifelse(tolower(df_Outcome[1,3])=="worse",0,1)
  IMOR$m3.p.e <- IMOR$p.e
  IMOR$m4.p.e <- IMOR$p.c
  
  # IMOR = odds of m1 (m2,m3, m4) by odds of not missing
  # Odds = Risk/(1-Risk)
  IMOR$m1.IMOR.e <- ifelse(IMOR$m1.p.e == 1,1e8,(IMOR$m1.p.e/(1-IMOR$m1.p.e))/(IMOR$p.e/(1-IMOR$p.e)))
  IMOR$m2.IMOR.e <- ifelse(IMOR$m2.p.e == 1,1e8,(IMOR$m2.p.e/(1-IMOR$m2.p.e))/(IMOR$p.e/(1-IMOR$p.e)))
  IMOR$m3.IMOR.e <- ifelse(IMOR$m3.p.e == 1,1e8,(IMOR$m3.p.e/(1-IMOR$m3.p.e))/(IMOR$p.e/(1-IMOR$p.e)))
  IMOR$m4.IMOR.e <- ifelse(IMOR$m4.p.e == 1,1e8,(IMOR$m4.p.e/(1-IMOR$m4.p.e))/(IMOR$p.e/(1-IMOR$p.e)))
  
  # IMOR of m5 directly given, but we still need p for later calculations
  IMOR$m5.IMOR.e <- IMOR_E
  IMOR$m5.p.e <- IMOR$p.e*IMOR$m5.IMOR.e/(IMOR$p.e*IMOR$m5.IMOR.e + 1 - IMOR$p.e)
  
  # m1= Missing failure (Control): p = 0
  # m2 = Missing success (Control): p = 1
  # m3 = Missing unrelated (Control): p = p.c
  # m4 = Missing protocol violation (Control) (receives Intervention): p = p.e
  # m5 = Missing other (Control): p based on IMOR (user provided)
  
  # Calcuate IMORs for m1 to m4 from p and p from IMOR for m5
  IMOR$m1.p.c <- ifelse(tolower(df_Outcome[1,3])=="worse",1,0)
  IMOR$m2.p.c <- ifelse(tolower(df_Outcome[1,3])=="worse",0,1)
  IMOR$m3.p.c <- IMOR$p.c
  IMOR$m4.p.c <- IMOR$p.e
  
  # IMOR = odds of m1 (m2,m3, m4) by odds of not missing
  # Odds = Risk/(1-Risk)
  IMOR$m1.IMOR.c <- ifelse(IMOR$m1.p.c == 1,1e8,(IMOR$m1.p.c/(1-IMOR$m1.p.c))/(IMOR$p.c/(1-IMOR$p.c)))
  IMOR$m2.IMOR.c <- ifelse(IMOR$m2.p.c == 1,1e8,(IMOR$m2.p.c/(1-IMOR$m2.p.c))/(IMOR$p.c/(1-IMOR$p.c)))
  IMOR$m3.IMOR.c <- ifelse(IMOR$m3.p.c == 1,1e8,(IMOR$m3.p.c/(1-IMOR$m3.p.c))/(IMOR$p.c/(1-IMOR$p.c)))
  IMOR$m4.IMOR.c <- ifelse(IMOR$m4.p.c == 1,1e8,(IMOR$m4.p.c/(1-IMOR$m4.p.c))/(IMOR$p.c/(1-IMOR$p.c)))
  
  # IMOR of m5 directly given, but we still need p for later calculations
  IMOR$m5.IMOR.c <- IMOR_C
  IMOR$m5.p.c <- IMOR$p.c*IMOR$m5.IMOR.c/(IMOR$p.c*IMOR$m5.IMOR.c + 1 - IMOR$p.c)
  
  IMOR$p.star.e <- IMOR$p.e*(1-IMOR$a.e) + 
    IMOR$m1.a.e * (IMOR$p.e*IMOR$m1.IMOR.e)/(IMOR$p.e*IMOR$m1.IMOR.e+1-IMOR$p.e) +
    IMOR$m2.a.e * (IMOR$p.e*IMOR$m2.IMOR.e)/(IMOR$p.e*IMOR$m2.IMOR.e+1-IMOR$p.e) +
    IMOR$m3.a.e * (IMOR$p.e*IMOR$m3.IMOR.e)/(IMOR$p.e*IMOR$m3.IMOR.e+1-IMOR$p.e) +
    IMOR$m4.a.e * (IMOR$p.e*IMOR$m4.IMOR.e)/(IMOR$p.e*IMOR$m4.IMOR.e+1-IMOR$p.e) +
    IMOR$m5.a.e * (IMOR$p.e*IMOR$m5.IMOR.e)/(IMOR$p.e*IMOR$m5.IMOR.e+1-IMOR$p.e)
  
  IMOR$p.star.c <- IMOR$p.c*(1-IMOR$a.c) + 
    IMOR$m1.a.c * (IMOR$p.c*IMOR$m1.IMOR.c)/(IMOR$p.c*IMOR$m1.IMOR.c+1-IMOR$p.c) +
    IMOR$m2.a.c * (IMOR$p.c*IMOR$m2.IMOR.c)/(IMOR$p.c*IMOR$m2.IMOR.c+1-IMOR$p.c) +
    IMOR$m3.a.c * (IMOR$p.c*IMOR$m3.IMOR.c)/(IMOR$p.c*IMOR$m3.IMOR.c+1-IMOR$p.c) +
    IMOR$m4.a.c * (IMOR$p.c*IMOR$m4.IMOR.c)/(IMOR$p.c*IMOR$m4.IMOR.c+1-IMOR$p.c) +
    IMOR$m5.a.c * (IMOR$p.c*IMOR$m5.IMOR.c)/(IMOR$p.c*IMOR$m5.IMOR.c+1-IMOR$p.c)
  
  IMOR$var.p.star.e <- IMOR$p.e*(1-IMOR$p.e)/(IMOR$N.e-IMOR$m.e) *
    (1 +
       IMOR$m1.a.e * (IMOR$m1.IMOR.e/(IMOR$p.e * IMOR$m1.IMOR.e + 1-IMOR$p.e)^2-1) +
       IMOR$m2.a.e * (IMOR$m2.IMOR.e/(IMOR$p.e * IMOR$m2.IMOR.e + 1-IMOR$p.e)^2-1) +
       IMOR$m3.a.e * (IMOR$m3.IMOR.e/(IMOR$p.e * IMOR$m3.IMOR.e + 1-IMOR$p.e)^2-1) +
       IMOR$m4.a.e * (IMOR$m4.IMOR.e/(IMOR$p.e * IMOR$m4.IMOR.e + 1-IMOR$p.e)^2-1) +
       IMOR$m5.a.e * (IMOR$m5.IMOR.e/(IMOR$p.e * IMOR$m5.IMOR.e + 1-IMOR$p.e)^2-1)
    )^2 +
    (1/IMOR$N.e) * 
    ((IMOR$p.e - IMOR$p.star.e)^2 +
       IMOR$m1.a.e * ((IMOR$m1.p.e-IMOR$p.star.e)^2-(IMOR$p.e-IMOR$p.star.e)^2) +
       IMOR$m2.a.e * ((IMOR$m2.p.e-IMOR$p.star.e)^2-(IMOR$p.e-IMOR$p.star.e)^2) +
       IMOR$m3.a.e * ((IMOR$m3.p.e-IMOR$p.star.e)^2-(IMOR$p.e-IMOR$p.star.e)^2) +
       IMOR$m4.a.e * ((IMOR$m4.p.e-IMOR$p.star.e)^2-(IMOR$p.e-IMOR$p.star.e)^2) +
       IMOR$m5.a.e * ((IMOR$m5.p.e-IMOR$p.star.e)^2-(IMOR$p.e-IMOR$p.star.e)^2)
    )
  
  IMOR$var.p.star.c <- IMOR$p.c*(1-IMOR$p.c)/(IMOR$N.c-IMOR$m.c) *
    (1 +
       IMOR$m1.a.c * (IMOR$m1.IMOR.c/(IMOR$p.c * IMOR$m1.IMOR.c + 1-IMOR$p.c)^2-1) +
       IMOR$m2.a.c * (IMOR$m2.IMOR.c/(IMOR$p.c * IMOR$m2.IMOR.c + 1-IMOR$p.c)^2-1) +
       IMOR$m3.a.c * (IMOR$m3.IMOR.c/(IMOR$p.c * IMOR$m3.IMOR.c + 1-IMOR$p.c)^2-1) +
       IMOR$m4.a.c * (IMOR$m4.IMOR.c/(IMOR$p.c * IMOR$m4.IMOR.c + 1-IMOR$p.c)^2-1) +
       IMOR$m5.a.c * (IMOR$m5.IMOR.c/(IMOR$p.c * IMOR$m5.IMOR.c + 1-IMOR$p.c)^2-1)
    )^2 +
    (1/IMOR$N.c) * 
    ((IMOR$p.c - IMOR$p.star.c)^2 +
       IMOR$m1.a.c * ((IMOR$m1.p.c-IMOR$p.star.c)^2-(IMOR$p.c-IMOR$p.star.c)^2) +
       IMOR$m2.a.c * ((IMOR$m2.p.c-IMOR$p.star.c)^2-(IMOR$p.c-IMOR$p.star.c)^2) +
       IMOR$m3.a.c * ((IMOR$m3.p.c-IMOR$p.star.c)^2-(IMOR$p.c-IMOR$p.star.c)^2) +
       IMOR$m4.a.c * ((IMOR$m4.p.c-IMOR$p.star.c)^2-(IMOR$p.c-IMOR$p.star.c)^2) +
       IMOR$m5.a.c * ((IMOR$m5.p.c-IMOR$p.star.c)^2-(IMOR$p.c-IMOR$p.star.c)^2)
    )
  
  IMOR$var.p.e <- IMOR$p.e*(1-IMOR$p.e)/(IMOR$N.e-IMOR$m.e)
  IMOR$var.p.c <- IMOR$p.c*(1-IMOR$p.c)/(IMOR$N.c-IMOR$m.c)
  
  IMOR$logOR <- log((IMOR$p.e/(1-IMOR$p.e))/(IMOR$p.c/(1-IMOR$p.c)))
  IMOR$var.logOR <- 
    IMOR$var.p.e/(IMOR$p.e*(1-IMOR$p.e))^2 +
    IMOR$var.p.c/(IMOR$p.c*(1-IMOR$p.c))^2
  
  IMOR$logOR.star <- log((IMOR$p.star.e/(1-IMOR$p.star.e))/(IMOR$p.star.c/(1-IMOR$p.star.c)))
  IMOR$var.logOR.star <- 
    IMOR$var.p.star.e/(IMOR$p.star.e*(1-IMOR$p.star.e))^2 +
    IMOR$var.p.star.c/(IMOR$p.star.c*(1-IMOR$p.star.c))^2
  
  IMOR$logRR <- log(IMOR$p.e/IMOR$p.c)
  IMOR$var.logRR <- 
    IMOR$var.p.e/(IMOR$p.e)^2 +
    IMOR$var.p.c/(IMOR$p.c)^2
  
  IMOR$logRR.star <- log(IMOR$p.star.e/IMOR$p.star.c)
  IMOR$var.logRR.star <- 
    IMOR$var.p.star.e/(IMOR$p.star.e)^2 +
    IMOR$var.p.star.c/(IMOR$p.star.c)^2
  
  # Now IMOR_01
  IMOR_01$m1.p.e <- 0
  IMOR_01$m2.p.e <- 0
  IMOR_01$m3.p.e <- 0
  IMOR_01$m4.p.e <- 0
  IMOR_01$m5.p.e <- 0
  
  # IMOR = odds of m1 (m2,m3, m4) by odds of not missing
  # Odds = Risk/(1-Risk)
  IMOR_01$m1.IMOR.e <- ifelse(IMOR_01$m1.p.e == 1,1e8,(IMOR_01$m1.p.e/(1-IMOR_01$m1.p.e))/(IMOR_01$p.e/(1-IMOR_01$p.e)))
  IMOR_01$m2.IMOR.e <- ifelse(IMOR_01$m2.p.e == 1,1e8,(IMOR_01$m2.p.e/(1-IMOR_01$m2.p.e))/(IMOR_01$p.e/(1-IMOR_01$p.e)))
  IMOR_01$m3.IMOR.e <- ifelse(IMOR_01$m3.p.e == 1,1e8,(IMOR_01$m3.p.e/(1-IMOR_01$m3.p.e))/(IMOR_01$p.e/(1-IMOR_01$p.e)))
  IMOR_01$m4.IMOR.e <- ifelse(IMOR_01$m4.p.e == 1,1e8,(IMOR_01$m4.p.e/(1-IMOR_01$m4.p.e))/(IMOR_01$p.e/(1-IMOR_01$p.e)))
  IMOR_01$m5.IMOR.e <- ifelse(IMOR_01$m5.p.e == 1,1e8,(IMOR_01$m5.p.e/(1-IMOR_01$m5.p.e))/(IMOR_01$p.e/(1-IMOR_01$p.e)))
  
  IMOR_01$m1.p.c <- 1
  IMOR_01$m2.p.c <- 1
  IMOR_01$m3.p.c <- 1
  IMOR_01$m4.p.c <- 1
  IMOR_01$m5.p.c <- 1
  
  IMOR_01$m1.IMOR.c <- ifelse(IMOR_01$m1.p.c == 1,1e8,(IMOR_01$m1.p.c/(1-IMOR_01$m1.p.c))/(IMOR_01$p.c/(1-IMOR_01$p.c)))
  IMOR_01$m2.IMOR.c <- ifelse(IMOR_01$m2.p.c == 1,1e8,(IMOR_01$m2.p.c/(1-IMOR_01$m2.p.c))/(IMOR_01$p.c/(1-IMOR_01$p.c)))
  IMOR_01$m3.IMOR.c <- ifelse(IMOR_01$m3.p.c == 1,1e8,(IMOR_01$m3.p.c/(1-IMOR_01$m3.p.c))/(IMOR_01$p.c/(1-IMOR_01$p.c)))
  IMOR_01$m4.IMOR.c <- ifelse(IMOR_01$m4.p.c == 1,1e8,(IMOR_01$m4.p.c/(1-IMOR_01$m4.p.c))/(IMOR_01$p.c/(1-IMOR_01$p.c)))
  IMOR_01$m5.IMOR.c <- ifelse(IMOR_01$m5.p.c == 1,1e8,(IMOR_01$m5.p.c/(1-IMOR_01$m5.p.c))/(IMOR_01$p.c/(1-IMOR_01$p.c)))
  
  IMOR_01$p.star.e <- IMOR_01$p.e*(1-IMOR_01$a.e) + 
    IMOR_01$m1.a.e * (IMOR_01$p.e*IMOR_01$m1.IMOR.e)/(IMOR_01$p.e*IMOR_01$m1.IMOR.e+1-IMOR_01$p.e) +
    IMOR_01$m2.a.e * (IMOR_01$p.e*IMOR_01$m2.IMOR.e)/(IMOR_01$p.e*IMOR_01$m2.IMOR.e+1-IMOR_01$p.e) +
    IMOR_01$m3.a.e * (IMOR_01$p.e*IMOR_01$m3.IMOR.e)/(IMOR_01$p.e*IMOR_01$m3.IMOR.e+1-IMOR_01$p.e) +
    IMOR_01$m4.a.e * (IMOR_01$p.e*IMOR_01$m4.IMOR.e)/(IMOR_01$p.e*IMOR_01$m4.IMOR.e+1-IMOR_01$p.e) +
    IMOR_01$m5.a.e * (IMOR_01$p.e*IMOR_01$m5.IMOR.e)/(IMOR_01$p.e*IMOR_01$m5.IMOR.e+1-IMOR_01$p.e)
  
  IMOR_01$p.star.c <- IMOR_01$p.c*(1-IMOR_01$a.c) + 
    IMOR_01$m1.a.c * (IMOR_01$p.c*IMOR_01$m1.IMOR.c)/(IMOR_01$p.c*IMOR_01$m1.IMOR.c+1-IMOR_01$p.c) +
    IMOR_01$m2.a.c * (IMOR_01$p.c*IMOR_01$m2.IMOR.c)/(IMOR_01$p.c*IMOR_01$m2.IMOR.c+1-IMOR_01$p.c) +
    IMOR_01$m3.a.c * (IMOR_01$p.c*IMOR_01$m3.IMOR.c)/(IMOR_01$p.c*IMOR_01$m3.IMOR.c+1-IMOR_01$p.c) +
    IMOR_01$m4.a.c * (IMOR_01$p.c*IMOR_01$m4.IMOR.c)/(IMOR_01$p.c*IMOR_01$m4.IMOR.c+1-IMOR_01$p.c) +
    IMOR_01$m5.a.c * (IMOR_01$p.c*IMOR_01$m5.IMOR.c)/(IMOR_01$p.c*IMOR_01$m5.IMOR.c+1-IMOR_01$p.c)
  
  IMOR_01$var.p.star.e <- IMOR_01$p.e*(1-IMOR_01$p.e)/(IMOR_01$N.e-IMOR_01$m.e) *
    (1 +
       IMOR_01$m1.a.e * (IMOR_01$m1.IMOR.e/(IMOR_01$p.e * IMOR_01$m1.IMOR.e + 1-IMOR_01$p.e)^2-1) +
       IMOR_01$m2.a.e * (IMOR_01$m2.IMOR.e/(IMOR_01$p.e * IMOR_01$m2.IMOR.e + 1-IMOR_01$p.e)^2-1) +
       IMOR_01$m3.a.e * (IMOR_01$m3.IMOR.e/(IMOR_01$p.e * IMOR_01$m3.IMOR.e + 1-IMOR_01$p.e)^2-1) +
       IMOR_01$m4.a.e * (IMOR_01$m4.IMOR.e/(IMOR_01$p.e * IMOR_01$m4.IMOR.e + 1-IMOR_01$p.e)^2-1) +
       IMOR_01$m5.a.e * (IMOR_01$m5.IMOR.e/(IMOR_01$p.e * IMOR_01$m5.IMOR.e + 1-IMOR_01$p.e)^2-1)
    )^2 +
    (1/IMOR_01$N.e) * 
    ((IMOR_01$p.e - IMOR_01$p.star.e)^2 +
       IMOR_01$m1.a.e * ((IMOR_01$m1.p.e-IMOR_01$p.star.e)^2-(IMOR_01$p.e-IMOR_01$p.star.e)^2) +
       IMOR_01$m2.a.e * ((IMOR_01$m2.p.e-IMOR_01$p.star.e)^2-(IMOR_01$p.e-IMOR_01$p.star.e)^2) +
       IMOR_01$m3.a.e * ((IMOR_01$m3.p.e-IMOR_01$p.star.e)^2-(IMOR_01$p.e-IMOR_01$p.star.e)^2) +
       IMOR_01$m4.a.e * ((IMOR_01$m4.p.e-IMOR_01$p.star.e)^2-(IMOR_01$p.e-IMOR_01$p.star.e)^2) +
       IMOR_01$m5.a.e * ((IMOR_01$m5.p.e-IMOR_01$p.star.e)^2-(IMOR_01$p.e-IMOR_01$p.star.e)^2)
    )
  
  IMOR_01$var.p.star.c <- IMOR_01$p.c*(1-IMOR_01$p.c)/(IMOR_01$N.c-IMOR_01$m.c) *
    (1 +
       IMOR_01$m1.a.c * (IMOR_01$m1.IMOR.c/(IMOR_01$p.c * IMOR_01$m1.IMOR.c + 1-IMOR_01$p.c)^2-1) +
       IMOR_01$m2.a.c * (IMOR_01$m2.IMOR.c/(IMOR_01$p.c * IMOR_01$m2.IMOR.c + 1-IMOR_01$p.c)^2-1) +
       IMOR_01$m3.a.c * (IMOR_01$m3.IMOR.c/(IMOR_01$p.c * IMOR_01$m3.IMOR.c + 1-IMOR_01$p.c)^2-1) +
       IMOR_01$m4.a.c * (IMOR_01$m4.IMOR.c/(IMOR_01$p.c * IMOR_01$m4.IMOR.c + 1-IMOR_01$p.c)^2-1) +
       IMOR_01$m5.a.c * (IMOR_01$m5.IMOR.c/(IMOR_01$p.c * IMOR_01$m5.IMOR.c + 1-IMOR_01$p.c)^2-1)
    )^2 +
    (1/IMOR_01$N.c) * 
    ((IMOR_01$p.c - IMOR_01$p.star.c)^2 +
       IMOR_01$m1.a.c * ((IMOR_01$m1.p.c-IMOR_01$p.star.c)^2-(IMOR_01$p.c-IMOR_01$p.star.c)^2) +
       IMOR_01$m2.a.c * ((IMOR_01$m2.p.c-IMOR_01$p.star.c)^2-(IMOR_01$p.c-IMOR_01$p.star.c)^2) +
       IMOR_01$m3.a.c * ((IMOR_01$m3.p.c-IMOR_01$p.star.c)^2-(IMOR_01$p.c-IMOR_01$p.star.c)^2) +
       IMOR_01$m4.a.c * ((IMOR_01$m4.p.c-IMOR_01$p.star.c)^2-(IMOR_01$p.c-IMOR_01$p.star.c)^2) +
       IMOR_01$m5.a.c * ((IMOR_01$m5.p.c-IMOR_01$p.star.c)^2-(IMOR_01$p.c-IMOR_01$p.star.c)^2)
    )
  
  IMOR_01$var.p.e <- IMOR_01$p.e*(1-IMOR_01$p.e)/(IMOR_01$N.e-IMOR_01$m.e)
  IMOR_01$var.p.c <- IMOR_01$p.c*(1-IMOR_01$p.c)/(IMOR_01$N.c-IMOR_01$m.c)
  
  IMOR_01$logOR <- log((IMOR_01$p.e/(1-IMOR_01$p.e))/(IMOR_01$p.c/(1-IMOR_01$p.c)))
  IMOR_01$var.logOR <- 
    IMOR_01$var.p.e/(IMOR_01$p.e*(1-IMOR_01$p.e))^2 +
    IMOR_01$var.p.c/(IMOR_01$p.c*(1-IMOR_01$p.c))^2
  
  IMOR_01$logOR.star <- log((IMOR_01$p.star.e/(1-IMOR_01$p.star.e))/(IMOR_01$p.star.c/(1-IMOR_01$p.star.c)))
  IMOR_01$var.logOR.star <- 
    IMOR_01$var.p.star.e/(IMOR_01$p.star.e*(1-IMOR_01$p.star.e))^2 +
    IMOR_01$var.p.star.c/(IMOR_01$p.star.c*(1-IMOR_01$p.star.c))^2
  
  IMOR_01$logRR <- log(IMOR_01$p.e/IMOR_01$p.c)
  IMOR_01$var.logRR <- 
    IMOR_01$var.p.e/(IMOR_01$p.e)^2 +
    IMOR_01$var.p.c/(IMOR_01$p.c)^2
  
  IMOR_01$logRR.star <- log(IMOR_01$p.star.e/IMOR_01$p.star.c)
  IMOR_01$var.logRR.star <- 
    IMOR_01$var.p.star.e/(IMOR_01$p.star.e)^2 +
    IMOR_01$var.p.star.c/(IMOR_01$p.star.c)^2
  
  # Now IMOR_10
  IMOR_10$m1.p.e <- 1
  IMOR_10$m2.p.e <- 1
  IMOR_10$m3.p.e <- 1
  IMOR_10$m4.p.e <- 1
  IMOR_10$m5.p.e <- 1
  
  # IMOR = odds of m1 (m2,m3, m4) by odds of not missing
  # Odds = Risk/(1-Risk)
  IMOR_10$m1.IMOR.e <- ifelse(IMOR_10$m1.p.e == 1,1e8,(IMOR_10$m1.p.e/(1-IMOR_10$m1.p.e))/(IMOR_10$p.e/(1-IMOR_10$p.e)))
  IMOR_10$m2.IMOR.e <- ifelse(IMOR_10$m2.p.e == 1,1e8,(IMOR_10$m2.p.e/(1-IMOR_10$m2.p.e))/(IMOR_10$p.e/(1-IMOR_10$p.e)))
  IMOR_10$m3.IMOR.e <- ifelse(IMOR_10$m3.p.e == 1,1e8,(IMOR_10$m3.p.e/(1-IMOR_10$m3.p.e))/(IMOR_10$p.e/(1-IMOR_10$p.e)))
  IMOR_10$m4.IMOR.e <- ifelse(IMOR_10$m4.p.e == 1,1e8,(IMOR_10$m4.p.e/(1-IMOR_10$m4.p.e))/(IMOR_10$p.e/(1-IMOR_10$p.e)))
  IMOR_10$m5.IMOR.e <- ifelse(IMOR_10$m5.p.e == 1,1e8,(IMOR_10$m5.p.e/(1-IMOR_10$m5.p.e))/(IMOR_10$p.e/(1-IMOR_10$p.e)))
  
  IMOR_10$m1.p.c <- 0
  IMOR_10$m2.p.c <- 0
  IMOR_10$m3.p.c <- 0
  IMOR_10$m4.p.c <- 0
  IMOR_10$m5.p.c <- 0
  
  IMOR_10$m1.IMOR.c <- ifelse(IMOR_10$m1.p.c == 1,1e8,(IMOR_10$m1.p.c/(1-IMOR_10$m1.p.c))/(IMOR_10$p.c/(1-IMOR_10$p.c)))
  IMOR_10$m2.IMOR.c <- ifelse(IMOR_10$m2.p.c == 1,1e8,(IMOR_10$m2.p.c/(1-IMOR_10$m2.p.c))/(IMOR_10$p.c/(1-IMOR_10$p.c)))
  IMOR_10$m3.IMOR.c <- ifelse(IMOR_10$m3.p.c == 1,1e8,(IMOR_10$m3.p.c/(1-IMOR_10$m3.p.c))/(IMOR_10$p.c/(1-IMOR_10$p.c)))
  IMOR_10$m4.IMOR.c <- ifelse(IMOR_10$m4.p.c == 1,1e8,(IMOR_10$m4.p.c/(1-IMOR_10$m4.p.c))/(IMOR_10$p.c/(1-IMOR_10$p.c)))
  IMOR_10$m5.IMOR.c <- ifelse(IMOR_10$m5.p.c == 1,1e8,(IMOR_10$m5.p.c/(1-IMOR_10$m5.p.c))/(IMOR_10$p.c/(1-IMOR_10$p.c)))
  
  IMOR_10$p.star.e <- IMOR_10$p.e*(1-IMOR_10$a.e) + 
    IMOR_10$m1.a.e * (IMOR_10$p.e*IMOR_10$m1.IMOR.e)/(IMOR_10$p.e*IMOR_10$m1.IMOR.e+1-IMOR_10$p.e) +
    IMOR_10$m2.a.e * (IMOR_10$p.e*IMOR_10$m2.IMOR.e)/(IMOR_10$p.e*IMOR_10$m2.IMOR.e+1-IMOR_10$p.e) +
    IMOR_10$m3.a.e * (IMOR_10$p.e*IMOR_10$m3.IMOR.e)/(IMOR_10$p.e*IMOR_10$m3.IMOR.e+1-IMOR_10$p.e) +
    IMOR_10$m4.a.e * (IMOR_10$p.e*IMOR_10$m4.IMOR.e)/(IMOR_10$p.e*IMOR_10$m4.IMOR.e+1-IMOR_10$p.e) +
    IMOR_10$m5.a.e * (IMOR_10$p.e*IMOR_10$m5.IMOR.e)/(IMOR_10$p.e*IMOR_10$m5.IMOR.e+1-IMOR_10$p.e)
  
  IMOR_10$p.star.c <- IMOR_10$p.c*(1-IMOR_10$a.c) + 
    IMOR_10$m1.a.c * (IMOR_10$p.c*IMOR_10$m1.IMOR.c)/(IMOR_10$p.c*IMOR_10$m1.IMOR.c+1-IMOR_10$p.c) +
    IMOR_10$m2.a.c * (IMOR_10$p.c*IMOR_10$m2.IMOR.c)/(IMOR_10$p.c*IMOR_10$m2.IMOR.c+1-IMOR_10$p.c) +
    IMOR_10$m3.a.c * (IMOR_10$p.c*IMOR_10$m3.IMOR.c)/(IMOR_10$p.c*IMOR_10$m3.IMOR.c+1-IMOR_10$p.c) +
    IMOR_10$m4.a.c * (IMOR_10$p.c*IMOR_10$m4.IMOR.c)/(IMOR_10$p.c*IMOR_10$m4.IMOR.c+1-IMOR_10$p.c) +
    IMOR_10$m5.a.c * (IMOR_10$p.c*IMOR_10$m5.IMOR.c)/(IMOR_10$p.c*IMOR_10$m5.IMOR.c+1-IMOR_10$p.c)
  
  IMOR_10$var.p.star.e <- IMOR_10$p.e*(1-IMOR_10$p.e)/(IMOR_10$N.e-IMOR_10$m.e) *
    (1 +
       IMOR_10$m1.a.e * (IMOR_10$m1.IMOR.e/(IMOR_10$p.e * IMOR_10$m1.IMOR.e + 1-IMOR_10$p.e)^2-1) +
       IMOR_10$m2.a.e * (IMOR_10$m2.IMOR.e/(IMOR_10$p.e * IMOR_10$m2.IMOR.e + 1-IMOR_10$p.e)^2-1) +
       IMOR_10$m3.a.e * (IMOR_10$m3.IMOR.e/(IMOR_10$p.e * IMOR_10$m3.IMOR.e + 1-IMOR_10$p.e)^2-1) +
       IMOR_10$m4.a.e * (IMOR_10$m4.IMOR.e/(IMOR_10$p.e * IMOR_10$m4.IMOR.e + 1-IMOR_10$p.e)^2-1) +
       IMOR_10$m5.a.e * (IMOR_10$m5.IMOR.e/(IMOR_10$p.e * IMOR_10$m5.IMOR.e + 1-IMOR_10$p.e)^2-1)
    )^2 +
    (1/IMOR_10$N.e) * 
    ((IMOR_10$p.e - IMOR_10$p.star.e)^2 +
       IMOR_10$m1.a.e * ((IMOR_10$m1.p.e-IMOR_10$p.star.e)^2-(IMOR_10$p.e-IMOR_10$p.star.e)^2) +
       IMOR_10$m2.a.e * ((IMOR_10$m2.p.e-IMOR_10$p.star.e)^2-(IMOR_10$p.e-IMOR_10$p.star.e)^2) +
       IMOR_10$m3.a.e * ((IMOR_10$m3.p.e-IMOR_10$p.star.e)^2-(IMOR_10$p.e-IMOR_10$p.star.e)^2) +
       IMOR_10$m4.a.e * ((IMOR_10$m4.p.e-IMOR_10$p.star.e)^2-(IMOR_10$p.e-IMOR_10$p.star.e)^2) +
       IMOR_10$m5.a.e * ((IMOR_10$m5.p.e-IMOR_10$p.star.e)^2-(IMOR_10$p.e-IMOR_10$p.star.e)^2)
    )
  
  IMOR_10$var.p.star.c <- IMOR_10$p.c*(1-IMOR_10$p.c)/(IMOR_10$N.c-IMOR_10$m.c) *
    (1 +
       IMOR_10$m1.a.c * (IMOR_10$m1.IMOR.c/(IMOR_10$p.c * IMOR_10$m1.IMOR.c + 1-IMOR_10$p.c)^2-1) +
       IMOR_10$m2.a.c * (IMOR_10$m2.IMOR.c/(IMOR_10$p.c * IMOR_10$m2.IMOR.c + 1-IMOR_10$p.c)^2-1) +
       IMOR_10$m3.a.c * (IMOR_10$m3.IMOR.c/(IMOR_10$p.c * IMOR_10$m3.IMOR.c + 1-IMOR_10$p.c)^2-1) +
       IMOR_10$m4.a.c * (IMOR_10$m4.IMOR.c/(IMOR_10$p.c * IMOR_10$m4.IMOR.c + 1-IMOR_10$p.c)^2-1) +
       IMOR_10$m5.a.c * (IMOR_10$m5.IMOR.c/(IMOR_10$p.c * IMOR_10$m5.IMOR.c + 1-IMOR_10$p.c)^2-1)
    )^2 +
    (1/IMOR_10$N.c) * 
    ((IMOR_10$p.c - IMOR_10$p.star.c)^2 +
       IMOR_10$m1.a.c * ((IMOR_10$m1.p.c-IMOR_10$p.star.c)^2-(IMOR_10$p.c-IMOR_10$p.star.c)^2) +
       IMOR_10$m2.a.c * ((IMOR_10$m2.p.c-IMOR_10$p.star.c)^2-(IMOR_10$p.c-IMOR_10$p.star.c)^2) +
       IMOR_10$m3.a.c * ((IMOR_10$m3.p.c-IMOR_10$p.star.c)^2-(IMOR_10$p.c-IMOR_10$p.star.c)^2) +
       IMOR_10$m4.a.c * ((IMOR_10$m4.p.c-IMOR_10$p.star.c)^2-(IMOR_10$p.c-IMOR_10$p.star.c)^2) +
       IMOR_10$m5.a.c * ((IMOR_10$m5.p.c-IMOR_10$p.star.c)^2-(IMOR_10$p.c-IMOR_10$p.star.c)^2)
    )
  
  IMOR_10$var.p.e <- IMOR_10$p.e*(1-IMOR_10$p.e)/(IMOR_10$N.e-IMOR_10$m.e)
  IMOR_10$var.p.c <- IMOR_10$p.c*(1-IMOR_10$p.c)/(IMOR_10$N.c-IMOR_10$m.c)
  
  IMOR_10$logOR <- log((IMOR_10$p.e/(1-IMOR_10$p.e))/(IMOR_10$p.c/(1-IMOR_10$p.c)))
  IMOR_10$var.logOR <- 
    IMOR_10$var.p.e/(IMOR_10$p.e*(1-IMOR_10$p.e))^2 +
    IMOR_10$var.p.c/(IMOR_10$p.c*(1-IMOR_10$p.c))^2
  
  IMOR_10$logOR.star <- log((IMOR_10$p.star.e/(1-IMOR_10$p.star.e))/(IMOR_10$p.star.c/(1-IMOR_10$p.star.c)))
  IMOR_10$var.logOR.star <- 
    IMOR_10$var.p.star.e/(IMOR_10$p.star.e*(1-IMOR_10$p.star.e))^2 +
    IMOR_10$var.p.star.c/(IMOR_10$p.star.c*(1-IMOR_10$p.star.c))^2
  
  IMOR_10$logRR <- log(IMOR_10$p.e/IMOR_10$p.c)
  IMOR_10$var.logRR <- 
    IMOR_10$var.p.e/(IMOR_10$p.e)^2 +
    IMOR_10$var.p.c/(IMOR_10$p.c)^2
  
  IMOR_10$logRR.star <- log(IMOR_10$p.star.e/IMOR_10$p.star.c)
  IMOR_10$var.logRR.star <- 
    IMOR_10$var.p.star.e/(IMOR_10$p.star.e)^2 +
    IMOR_10$var.p.star.c/(IMOR_10$p.star.c)^2
  
  # IMOR for all missing causes (IMOR_M)
  # Here IMOR is given and p has to be calculated
  IMOR_M$m1.IMOR.e <- IMOR_E
  IMOR_M$m2.IMOR.e <- IMOR_E
  IMOR_M$m3.IMOR.e <- IMOR_E
  IMOR_M$m4.IMOR.e <- IMOR_E
  IMOR_M$m5.IMOR.e <- IMOR_E
  IMOR_M$m1.p.e <- IMOR_M$p.e*IMOR_M$m1.IMOR.e/(IMOR_M$p.e*IMOR_M$m1.IMOR.e + 1 - IMOR_M$p.e)
  IMOR_M$m2.p.e <- IMOR_M$p.e*IMOR_M$m2.IMOR.e/(IMOR_M$p.e*IMOR_M$m2.IMOR.e + 1 - IMOR_M$p.e)
  IMOR_M$m3.p.e <- IMOR_M$p.e*IMOR_M$m3.IMOR.e/(IMOR_M$p.e*IMOR_M$m3.IMOR.e + 1 - IMOR_M$p.e)
  IMOR_M$m4.p.e <- IMOR_M$p.e*IMOR_M$m4.IMOR.e/(IMOR_M$p.e*IMOR_M$m4.IMOR.e + 1 - IMOR_M$p.e)
  IMOR_M$m5.p.e <- IMOR_M$p.e*IMOR_M$m5.IMOR.e/(IMOR_M$p.e*IMOR_M$m5.IMOR.e + 1 - IMOR_M$p.e)
  
  IMOR_M$m1.IMOR.c <- IMOR_C
  IMOR_M$m2.IMOR.c <- IMOR_C
  IMOR_M$m3.IMOR.c <- IMOR_C
  IMOR_M$m4.IMOR.c <- IMOR_C
  IMOR_M$m5.IMOR.c <- IMOR_C
  IMOR_M$m1.p.c <- IMOR_M$p.c*IMOR_M$m1.IMOR.c/(IMOR_M$p.c*IMOR_M$m1.IMOR.c + 1 - IMOR_M$p.c)
  IMOR_M$m2.p.c <- IMOR_M$p.c*IMOR_M$m2.IMOR.c/(IMOR_M$p.c*IMOR_M$m2.IMOR.c + 1 - IMOR_M$p.c)
  IMOR_M$m3.p.c <- IMOR_M$p.c*IMOR_M$m3.IMOR.c/(IMOR_M$p.c*IMOR_M$m3.IMOR.c + 1 - IMOR_M$p.c)
  IMOR_M$m4.p.c <- IMOR_M$p.c*IMOR_M$m4.IMOR.c/(IMOR_M$p.c*IMOR_M$m4.IMOR.c + 1 - IMOR_M$p.c)
  IMOR_M$m5.p.c <- IMOR_M$p.c*IMOR_M$m5.IMOR.c/(IMOR_M$p.c*IMOR_M$m5.IMOR.c + 1 - IMOR_M$p.c)
  
  IMOR_M$p.star.e <- IMOR_M$p.e*(1-IMOR_M$a.e) + 
    IMOR_M$m1.a.e * (IMOR_M$p.e*IMOR_M$m1.IMOR.e)/(IMOR_M$p.e*IMOR_M$m1.IMOR.e+1-IMOR_M$p.e) +
    IMOR_M$m2.a.e * (IMOR_M$p.e*IMOR_M$m2.IMOR.e)/(IMOR_M$p.e*IMOR_M$m2.IMOR.e+1-IMOR_M$p.e) +
    IMOR_M$m3.a.e * (IMOR_M$p.e*IMOR_M$m3.IMOR.e)/(IMOR_M$p.e*IMOR_M$m3.IMOR.e+1-IMOR_M$p.e) +
    IMOR_M$m4.a.e * (IMOR_M$p.e*IMOR_M$m4.IMOR.e)/(IMOR_M$p.e*IMOR_M$m4.IMOR.e+1-IMOR_M$p.e) +
    IMOR_M$m5.a.e * (IMOR_M$p.e*IMOR_M$m5.IMOR.e)/(IMOR_M$p.e*IMOR_M$m5.IMOR.e+1-IMOR_M$p.e)
  
  IMOR_M$p.star.c <- IMOR_M$p.c*(1-IMOR_M$a.c) + 
    IMOR_M$m1.a.c * (IMOR_M$p.c*IMOR_M$m1.IMOR.c)/(IMOR_M$p.c*IMOR_M$m1.IMOR.c+1-IMOR_M$p.c) +
    IMOR_M$m2.a.c * (IMOR_M$p.c*IMOR_M$m2.IMOR.c)/(IMOR_M$p.c*IMOR_M$m2.IMOR.c+1-IMOR_M$p.c) +
    IMOR_M$m3.a.c * (IMOR_M$p.c*IMOR_M$m3.IMOR.c)/(IMOR_M$p.c*IMOR_M$m3.IMOR.c+1-IMOR_M$p.c) +
    IMOR_M$m4.a.c * (IMOR_M$p.c*IMOR_M$m4.IMOR.c)/(IMOR_M$p.c*IMOR_M$m4.IMOR.c+1-IMOR_M$p.c) +
    IMOR_M$m5.a.c * (IMOR_M$p.c*IMOR_M$m5.IMOR.c)/(IMOR_M$p.c*IMOR_M$m5.IMOR.c+1-IMOR_M$p.c)
  
  IMOR_M$var.p.star.e <- IMOR_M$p.e*(1-IMOR_M$p.e)/(IMOR_M$N.e-IMOR_M$m.e) *
    (1 +
       IMOR_M$m1.a.e * (IMOR_M$m1.IMOR.e/(IMOR_M$p.e * IMOR_M$m1.IMOR.e + 1-IMOR_M$p.e)^2-1) +
       IMOR_M$m2.a.e * (IMOR_M$m2.IMOR.e/(IMOR_M$p.e * IMOR_M$m2.IMOR.e + 1-IMOR_M$p.e)^2-1) +
       IMOR_M$m3.a.e * (IMOR_M$m3.IMOR.e/(IMOR_M$p.e * IMOR_M$m3.IMOR.e + 1-IMOR_M$p.e)^2-1) +
       IMOR_M$m4.a.e * (IMOR_M$m4.IMOR.e/(IMOR_M$p.e * IMOR_M$m4.IMOR.e + 1-IMOR_M$p.e)^2-1) +
       IMOR_M$m5.a.e * (IMOR_M$m5.IMOR.e/(IMOR_M$p.e * IMOR_M$m5.IMOR.e + 1-IMOR_M$p.e)^2-1)
    )^2 +
    (1/IMOR_M$N.e) * 
    ((IMOR_M$p.e - IMOR_M$p.star.e)^2 +
       IMOR_M$m1.a.e * ((IMOR_M$m1.p.e-IMOR_M$p.star.e)^2-(IMOR_M$p.e-IMOR_M$p.star.e)^2) +
       IMOR_M$m2.a.e * ((IMOR_M$m2.p.e-IMOR_M$p.star.e)^2-(IMOR_M$p.e-IMOR_M$p.star.e)^2) +
       IMOR_M$m3.a.e * ((IMOR_M$m3.p.e-IMOR_M$p.star.e)^2-(IMOR_M$p.e-IMOR_M$p.star.e)^2) +
       IMOR_M$m4.a.e * ((IMOR_M$m4.p.e-IMOR_M$p.star.e)^2-(IMOR_M$p.e-IMOR_M$p.star.e)^2) +
       IMOR_M$m5.a.e * ((IMOR_M$m5.p.e-IMOR_M$p.star.e)^2-(IMOR_M$p.e-IMOR_M$p.star.e)^2)
    )
  
  IMOR_M$var.p.star.c <- IMOR_M$p.c*(1-IMOR_M$p.c)/(IMOR_M$N.c-IMOR_M$m.c) *
    (1 +
       IMOR_M$m1.a.c * (IMOR_M$m1.IMOR.c/(IMOR_M$p.c * IMOR_M$m1.IMOR.c + 1-IMOR_M$p.c)^2-1) +
       IMOR_M$m2.a.c * (IMOR_M$m2.IMOR.c/(IMOR_M$p.c * IMOR_M$m2.IMOR.c + 1-IMOR_M$p.c)^2-1) +
       IMOR_M$m3.a.c * (IMOR_M$m3.IMOR.c/(IMOR_M$p.c * IMOR_M$m3.IMOR.c + 1-IMOR_M$p.c)^2-1) +
       IMOR_M$m4.a.c * (IMOR_M$m4.IMOR.c/(IMOR_M$p.c * IMOR_M$m4.IMOR.c + 1-IMOR_M$p.c)^2-1) +
       IMOR_M$m5.a.c * (IMOR_M$m5.IMOR.c/(IMOR_M$p.c * IMOR_M$m5.IMOR.c + 1-IMOR_M$p.c)^2-1)
    )^2 +
    (1/IMOR_M$N.c) * 
    ((IMOR_M$p.c - IMOR_M$p.star.c)^2 +
       IMOR_M$m1.a.c * ((IMOR_M$m1.p.c-IMOR_M$p.star.c)^2-(IMOR_M$p.c-IMOR_M$p.star.c)^2) +
       IMOR_M$m2.a.c * ((IMOR_M$m2.p.c-IMOR_M$p.star.c)^2-(IMOR_M$p.c-IMOR_M$p.star.c)^2) +
       IMOR_M$m3.a.c * ((IMOR_M$m3.p.c-IMOR_M$p.star.c)^2-(IMOR_M$p.c-IMOR_M$p.star.c)^2) +
       IMOR_M$m4.a.c * ((IMOR_M$m4.p.c-IMOR_M$p.star.c)^2-(IMOR_M$p.c-IMOR_M$p.star.c)^2) +
       IMOR_M$m5.a.c * ((IMOR_M$m5.p.c-IMOR_M$p.star.c)^2-(IMOR_M$p.c-IMOR_M$p.star.c)^2)
    )
  
  IMOR_M$var.p.e <- IMOR_M$p.e*(1-IMOR_M$p.e)/(IMOR_M$N.e-IMOR_M$m.e)
  IMOR_M$var.p.c <- IMOR_M$p.c*(1-IMOR_M$p.c)/(IMOR_M$N.c-IMOR_M$m.c)
  
  IMOR_M$logOR <- log((IMOR_M$p.e/(1-IMOR_M$p.e))/(IMOR_M$p.c/(1-IMOR_M$p.c)))
  IMOR_M$var.logOR <- 
    IMOR_M$var.p.e/(IMOR_M$p.e*(1-IMOR_M$p.e))^2 +
    IMOR_M$var.p.c/(IMOR_M$p.c*(1-IMOR_M$p.c))^2
  
  IMOR_M$logOR.star <- log((IMOR_M$p.star.e/(1-IMOR_M$p.star.e))/(IMOR_M$p.star.c/(1-IMOR_M$p.star.c)))
  IMOR_M$var.logOR.star <- 
    IMOR_M$var.p.star.e/(IMOR_M$p.star.e*(1-IMOR_M$p.star.e))^2 +
    IMOR_M$var.p.star.c/(IMOR_M$p.star.c*(1-IMOR_M$p.star.c))^2
  
  IMOR_M$logRR <- log(IMOR_M$p.e/IMOR_M$p.c)
  IMOR_M$var.logRR <- 
    IMOR_M$var.p.e/(IMOR_M$p.e)^2 +
    IMOR_M$var.p.c/(IMOR_M$p.c)^2
  
  IMOR_M$logRR.star <- log(IMOR_M$p.star.e/IMOR_M$p.star.c)
  IMOR_M$var.logRR.star <- 
    IMOR_M$var.p.star.e/(IMOR_M$p.star.e)^2 +
    IMOR_M$var.p.star.c/(IMOR_M$p.star.c)^2
  
  # Meta-analysis generic inverse variance random-effects meta-analysis
  # Effect measure from the meta-analysis
  EffectMeasure <- MA$sm
  # add the study labels to the front of IMORs
  IMOR <- cbind(Study=as.character(df_Outcome[,4]),IMOR)
  IMOR_01 <- cbind(Study=as.character(df_Outcome[,4]),IMOR_01)
  IMOR_10 <- cbind(Study=as.character(df_Outcome[,4]),IMOR_10)
  IMOR_M <- cbind(Study=as.character(df_Outcome[,4]),IMOR_M)
  
  if (EffectMeasure == "OR" | EffectMeasure == "RR") {
    MA_IMOR <- metagen(
      IMOR[,match(ifelse(EffectMeasure == "OR","logOR.star","logRR.star"),colnames(IMOR))],
      IMOR[,match(ifelse(EffectMeasure == "OR","var.logOR.star","var.logRR.star"),colnames(IMOR))],
      n.e = IMOR$N.e,
      n.c = IMOR$N.c,
      data = IMOR,
      studlab = IMOR$Study,
      text.common = "Fixed effect model",
      text.w.common = "fixed",
      common = MA$common,
      sm = EffectMeasure,
      method.random.ci = MA$method.random.ci,
      method.predict = MA$method.predict,
      prediction = MA$prediction,
      outclab = MA$outclab,
      label.e = MA$label.e,
      label.c = MA$label.c,
      label.left = MA$label.left,
      label.right = MA$label.right
    )
    MA_IMOR_01 <- metagen(
      IMOR_01[,match(ifelse(EffectMeasure == "OR","logOR.star","logRR.star"),colnames(IMOR_01))],
      IMOR_01[,match(ifelse(EffectMeasure == "OR","var.logOR.star","var.logRR.star"),colnames(IMOR_01))],
      n.e = IMOR_01$N.e,
      n.c = IMOR_01$N.c,
      data = IMOR_01,
      studlab = IMOR_01$Study,
      text.common = "Fixed effect model",
      text.w.common = "fixed",
      common = MA$common,
      sm = EffectMeasure,
      method.random.ci = MA$method.random.ci,
      method.predict = MA$method.predict,
      prediction = MA$prediction,
      outclab = MA$outclab,
      label.e = MA$label.e,
      label.c = MA$label.c,
      label.left = MA$label.left,
      label.right = MA$label.right
    )
    MA_IMOR_10 <- metagen(
      IMOR_10[,match(ifelse(EffectMeasure == "OR","logOR.star","logRR.star"),colnames(IMOR_10))],
      IMOR_10[,match(ifelse(EffectMeasure == "OR","var.logOR.star","var.logRR.star"),colnames(IMOR_10))],
      n.e = IMOR_10$N.e,
      n.c = IMOR_10$N.c,
      data = IMOR_10,
      studlab = IMOR_10$Study,
      text.common = "Fixed effect model",
      text.w.common = "fixed",
      common = MA$common,
      sm = EffectMeasure,
      method.random.ci = MA$method.random.ci,
      method.predict = MA$method.predict,
      prediction = MA$prediction,
      outclab = MA$outclab,
      label.e = MA$label.e,
      label.c = MA$label.c,
      label.left = MA$label.left,
      label.right = MA$label.right
    )
    MA_IMOR_M <- metagen(
      IMOR_M[,match(ifelse(EffectMeasure == "OR","logOR.star","logRR.star"),colnames(IMOR_M))],
      IMOR_M[,match(ifelse(EffectMeasure == "OR","var.logOR.star","var.logRR.star"),colnames(IMOR_M))],
      n.e = IMOR_M$N.e,
      n.c = IMOR_M$N.c,
      data = IMOR_M,
      studlab = IMOR_M$Study,
      text.common = "Fixed effect model",
      text.w.common = "fixed",
      common = MA$common,
      sm = EffectMeasure,
      method.random.ci = MA$method.random.ci,
      method.predict = MA$method.predict,
      prediction = MA$prediction,
      outclab = MA$outclab,
      label.e = MA$label.e,
      label.c = MA$label.c,
      label.left = MA$label.left,
      label.right = MA$label.right
    )
    
  } else {
    MA_IMOR <- as.character("Sensitivity analysis is usually conducted for the effect measure used in the primary analysis only")
    MA_IMOR_01 <- as.character("Sensitivity analysis is usually conducted for the effect measure used in the primary analysis only")
    MA_IMOR_10 <- as.character("Sensitivity analysis is usually conducted for the effect measure used in the primary analysis only")
    MA_IMOR_M <- as.character("Sensitivity analysis is usually conducted for the effect measure used in the primary analysis only")
  }
  
  ifelse(tolower(df_Outcome[1,3]) == "worse",
         return(list("Missing outcome analysis (according to reason)" = MA_IMOR,"Best-worst analysis" = MA_IMOR_01,"Worst-best analysis" = MA_IMOR_10,"Missing outcome analysis (no reasons provided)" = MA_IMOR_M)),
         return(list("Missing outcome analysis (according to reason)" = MA_IMOR,"Best-worst analysis" = MA_IMOR_10,"Worst-best analysis" = MA_IMOR_01,"Missing outcome analysis (no reasons provided)" = MA_IMOR_M))
  )
}
