
# Library
##################################################################################################################################

suppressWarnings(suppressPackageStartupMessages(library('DiagrammeR')))
suppressWarnings(suppressPackageStartupMessages(library('DiagrammeRsvg')))
suppressWarnings(suppressPackageStartupMessages(library('rsvg')))
suppressWarnings(suppressPackageStartupMessages(library('lubridate')))
suppressWarnings(suppressPackageStartupMessages(library('data.table')))
suppressWarnings(suppressPackageStartupMessages(library('tibble')))
suppressWarnings(suppressPackageStartupMessages(library('plyr')))
suppressWarnings(suppressPackageStartupMessages(library('dplyr')))
suppressWarnings(suppressPackageStartupMessages(library('tidyr')))
suppressWarnings(suppressPackageStartupMessages(library('forcats')))
suppressWarnings(suppressPackageStartupMessages(library('encode')))
suppressWarnings(suppressPackageStartupMessages(library('Matching')))
suppressWarnings(suppressPackageStartupMessages(library('compareGroups')))
suppressWarnings(suppressPackageStartupMessages(library('stddiff')))
suppressWarnings(suppressPackageStartupMessages(library('pscl')))
suppressWarnings(suppressPackageStartupMessages(library('survival')))
suppressWarnings(suppressPackageStartupMessages(library('ggplot2'))) 
suppressWarnings(suppressPackageStartupMessages(library('scales')))
suppressWarnings(suppressPackageStartupMessages(library('splines')))
suppressWarnings(suppressPackageStartupMessages(library('gridExtra')))
suppressWarnings(suppressPackageStartupMessages(library('survminer')))
suppressWarnings(suppressPackageStartupMessages(library('DT')))
suppressWarnings(suppressPackageStartupMessages(library('kableExtra'))) 
suppressWarnings(suppressPackageStartupMessages(library('knitr')))
suppressWarnings(suppressPackageStartupMessages(library('writexl')))
##################################################################################################################################





# Parameters
##################################################################################################################################

set.seed(12345678)
data_fi_seg <- as.Date("2021-12-05")
##################################################################################################################################





# Flowchart
##################################################################################################################################

fin <- c(seq(1,20,1))
tiff("flowchart.jpg", 
     units="mm", width=150, height = 100, res=300)
grViz("
      digraph a_nice_graph
      {
      
      node[fontname = Helvetica,
           fontcolor = black,
           shape = box,
           width = 1,
           style = filled,
           fillcolor = whitesmoke]
      
      '@@1' -> '@@2';
      '@@1' -> '@@3';
      '@@1' -> '@@4';
      '@@2' -> '@@5';
      '@@3' -> '@@6';
      '@@5' -> '@@7';
      '@@6' -> '@@8';
      '@@7' -> '@@9';
      '@@8' -> '@@10';
      }
      
      [1]: paste0('People between 19 and 59 years old receiving a first dose of ChAdOx1','\\n','N = 213,590')
      [2]: paste0('ChAdOx1-ChAdOx1 (Homologous vaccination)','\\n','N = 181,592')
      [3]: paste0('ChAdOx1-BNT162b2 (Heterologous vaccination)','\\n','N = 22,473')
      [4]: paste0('Without second dose','\\n','N = 9,525')
      [5]: paste0('No previous COVID-19','\\n','N = 179,935')
      [6]: paste0('No previous COVID-19','\\n','N = 21,621')
      [7]: paste0('Electronic health records linkage','\\n','N = 149,386')
      [8]: paste0('Electronic health records linkage','\\n','N = 17,849')
      [9]: paste0('Exact matching','\\n','N = 14,325')
      [10]: paste0('Exact matching','\\n','N = 14,325 (80.3%)')
      ", height= 600, width = 800)
##################################################################################################################################





# Exact Matching (1:1)
##################################################################################################################################
# Data: 
# - dt.matching
# - dt.cohorts.seg

  dt.matching <- dt.matching[,pauta1:=0]
  dt.matching <- dt.matching[pauta=='Heteròloga',pauta1:=1]
  X <- cbind('edat' = dt.matching$edatfinal,
             'sexe' = dt.matching$sexe,
             'abs' = dt.matching$abs,
             'vac_2_data' = dt.matching$vac_2_data)
  rr <- Match(Y = NULL, Tr = dt.matching$pauta1, X = X, exact = c(F,T,T,F), replace = F, M = 1, caliper = 1/5)
  summary(rr)
  dt.matching$match <- NA
  dt.matching$match[c(rr$index.treated,rr$index.control)] <- sprintf("%d", rep(1:length(rr$index.treated), times=2))
  dt.matching$match_c <- 0
  dt.matching[!is.na(match), match_c:=1]
  table(dt.matching[,.(pauta, match_c)])
  
  ggplot(dt.matching[match_c==1,], aes(x=edatfinal, color=pauta)) +
    geom_density()
  ggplot(dt.matching[match_c==1,], aes(x=vac_2_data, color=pauta)) +
    geom_density()
  
  dt.homo.vac <- dt.matching[match_c==1,][pauta=="Homòloga", .(match, vac_2_data)]
  setnames(dt.homo.vac, "vac_2_data", "vac_2_data_homo")
  dt.hete.vac <- dt.matching[match_c==1,][pauta=="Heteròloga", .(match, vac_2_data)]
  setnames(dt.hete.vac, "vac_2_data", "vac_2_data_hete")
  dt.vac <- merge(dt.homo.vac,
                  dt.hete.vac,
                  by.x="match",
                  by.y = "match")
  dt.vac <- dt.vac[, vac_dif:=vac_2_data_homo-vac_2_data_hete]
  dt.vac.diff <- dt.vac[, .N, by=vac_dif][order(vac_dif),]
  dt.vac.diff
  
  dt.homo.edat <- dt.matching[match_c==1,][pauta=="Homòloga", .(match, edatfinal)]
  setnames(dt.homo.edat, "edatfinal", "edat_homo")
  dt.hete.edat <- dt.matching[match_c==1,][pauta=="Heteròloga", .(match, edatfinal)]
  setnames(dt.hete.edat, "edatfinal", "edat_hete")
  dt.vac <- merge(dt.homo.edat,
                  dt.hete.edat,
                  by.x = "match",
                  by.y = "match")
  dt.edat <- dt.vac[, edat_dif:= edat_homo - edat_hete]
  dt.edat.diff <- dt.edat[, .N, by=edat_dif][order(edat_dif),]
  dt.edat.diff
##################################################################################################################################
  
# SMD
##################################################################################################################################
  dt.smd <- dt.matching[match_c==1,]
  t <- do.call("rbind", 
                 lapply(c("edatfinal", "sexe",
                          "rural", "medea_c1",
                          "nproves_estudi",                      
                          fr,
                          tx),
                        function(x){
                          if (is.integer(dt.smd[, get(x)])){
                            t <- dt.smd[, .(V1 = paste0(format(round(mean(get(x), na.rm = T), 2), decimal.mark = ".", big.mark = ","), " (", format(round(sd(get(x), na.rm = T), 2), decimal.mark = ".", big.mark = ","), ")"),
                                            N = sum(!is.na(get(x)))), c("pauta")]
                            t[, Variable := x]
                            t[, cat := ""]
                            t[, c("pauta", "Variable", "cat", "N", "V1")]
                          } 
                          else {
                            t <- dt.smd[, .N, c("pauta", x)]
                            t[, tot := sum(N), c("pauta")]
                            t[, V1 := paste0(format(N, decimal.mark = ".", big.mark = ","), " (", format(round(N/tot*100, 2), decimal.mark = ".", big.mark = ","), "%)")]
                            t[, Variable := x]
                            names(t)[2] <- "cat"
                            t[, c("pauta", "Variable", "cat", "N", "V1")]
                          }
                        }))
    t_cast <- dcast(t, Variable + cat ~ pauta, value.var = c("V1"))
    
    tsmd <- do.call("rbind", 
                    lapply(c("edatfinal", "sexe",
                             "rural", "medea_c1",
                             "nproves_estudi",
                             fr,
                             tx),
                           function(x){
                             #print(x)
                             d <- dt.smd[, .SD, .SDcols = c("pauta", x)]
                             if (is.integer(dt.smd[, get(x)]) | is.numeric(dt.smd[, get(x)])) {
                               smd <- tryCatch(stddiff.numeric(data = d, gcol = 1, vcol = 2)[,"stddiff"], error=function(e) NA)
                               t <- data.table(V1 = c(smd))
                               t[, Variable := x]
                               t[, c("Variable", "V1")]
                             } 
                             else {
                               smd <- tryCatch(stddiff.category(data = d, gcol = 1, vcol = 2)[1,"stddiff"], error=function(e) NA)
                               t <- data.table(V1 = c(smd))
                               t[, Variable := x]
                               t[, c("Variable", "V1")]
                             }
                           }))
    fwrite(merge(t_cast,
                 tsmd, 
                 by = c("Variable"), all.x = T),
           "smd.csv", sep = ";", dec = ".", row.names = F)
    t <- merge(t_cast, tsmd, by = c("Variable"), all.x = T)
    kable(t)
    
    # LABELS
      labels <- fread("tts_fr_labels.csv", 
                       sep = ";", header = F)
      
      smd_dades_labels <- merge(tsmd, labels, by.x = "Variable", by.y = "V1")
      smd_dades_labels <- smd_dades_labels[V2 != 'Gender']
      smd_dades_labels <- smd_dades_labels[V3 != 0]
      smd_dades_labels <- smd_dades_labels[order(V4)]
    
    tiff("smd.jpg",
         units="mm", width=200, height = 150, res=300)
    ggplot(smd_dades_labels, aes(x = V2)) +
      geom_point(aes(y = V1, pch = "Unweighted"), size = 3) +
      coord_flip() +
      theme_classic() +  
      theme(legend.position="none") + 
      labs(x = "", y = "SMD", shape = "Weight") +
      geom_hline(yintercept = 0.1, linetype = 2)
    dev.off()
##################################################################################################################################

# Survival analysis
##################################################################################################################################
  # Update follow-up
    dt.matching.seg <- merge(dt.matching[match_c==1,],
                             dt.cohorts.seg,
                             by.x = "hash",
                             by.y = "hash_seg",
                             all.x = TRUE)
    
  # Prepare data
    dt.seg.surv <- dt.matching.seg[, c("hash",
                                       "edat_v", "pauta", "vac_2_data", "vac_3_data_seg", 
                                       "cas_data", "cas",
                                       "cas_data_seg", "cas_seg", "exitus_covid_seg", "match")]
    
    dt.seg.surv[cas_seg=="No", status_seg:=1]
    dt.seg.surv[cas_seg=="Sí", status_seg:=2]
    dt.seg.surv[vac_3_data_seg < cas_data_seg | is.na(cas_seg), status_seg:=1]
    
    dt.seg.surv[, data_min := pmin(cas_data_seg, vac_3_data_seg, na.rm = TRUE)]
    dt.seg.surv[, time_seg := pmin(data_min, data_fi_seg, na.rm = TRUE) - vac_2_data]
    dt.seg.surv <- dt.seg.surv[,pauta_surv_seg:=0][pauta=='Heteròloga', pauta_surv_seg:=1]
        
  # Kaplan Meier
  ##############################################################################################
    survfit <- survfit(Surv(time_seg, status_seg) ~ pauta_surv_seg, data = dt.seg.surv)

      # Data
      km_results <- data.table(
          Type  =c(rep("Homòloga", survfit$strata[[1]]), rep("Heteròloga", survfit$strata[[2]])),
          time = survfit$time_seg,
          N_risk = survfit$n.risk,
          N_event = survfit$n.event,
          N_censor= survfit$n.censor,
          Prop_surv = survfit$surv,
          IC95_low = survfit$lower,
          IC95_upp = survfit$upper,
          std_error = survfit$std.err,
          cum_hazard = survfit$cumhaz,
          std_chaz = survfit$std.chaz
      )
      fwrite(km_results, "seg.km.csv",
             sep = ";", dec = ".", row.names = F)
      
      # Figure
      tiff("seg.km.jpg", 
           units="mm", width=150, height = 100, res=300)
      ggsurvplot(survfit,  size = 1,
                 linetype = "strata",
                 break.time.by = 21,
                 palette = "grey",
                 conf.int = TRUE,
                 pval = FALSE,
                 pval.coord = c(150, 0.995),
                 ylim = c(.90, 1),
                 xlim = c(0, 180),
                 ggtheme = theme_classic(),
                 xlab = "Days after second dose",
                 legend.labs = c( "Homologous vaccination", "Heterologous vaccination"),
                 title = "SARS-CoV-2 infection",
                 subtitle = "",
                 legend.title = "",
                 legend = c(0.2, 0.2),
                 censor = TRUE
      )
    ##############################################################################################
      
    # Cox Regression
    ##############################################################################################
      coxph_seg <- coxph(Surv(time_seg, status_seg) ~ pauta_surv_seg,
                         robust = TRUE,
                         cluster = match,
                         data = dt.seg.surv)
      summary(coxph_seg)
      hr <-  summary(coxph_seg)$conf.int
      hr
      test <- cox.zph(coxph_seg)
      ggcoxzph(test)
    ##############################################################################################
##################################################################################################################################      
      
### Absolute Risk Reduction (ARR)
##################################################################################################################################    
      
taula_2_arr <- dt.seg.surv[, .(N = .N,
                             casos = sum(status_seg == 2)
), pauta]
taula_2_arr[, ":=" (rate = casos/N)]
      
taula_arr <- taula_2_arr[pauta == "Homòloga"]$rate - taula_2_arr[pauta == "Heteròloga"]$rate
taula_sd <- sqrt((((taula_2_arr[pauta == "Homòloga"]$rate)*(1 - taula_2_arr[pauta == "Homòloga"]$rate))/taula_2_arr[pauta == "Homòloga"]$N) +
                         (((taula_2_arr[pauta == "Heteròloga"]$rate)*(1 - taula_2_arr[pauta == "Heteròloga"]$rate))/taula_2_arr[pauta == "Heteròloga"]$N))
      
taula_arrinf <- taula_arr - (1.96*taula_sd)
taula_arrsup <- taula_arr + (1.96*taula_sd)
      
ARR <- paste0("Absolute Risk Reduction (ARR): ",
              format(round((taula_arr), 4), decimal.mark = ".", big.mark = ","),
              " IC95%: [",
              format(round((taula_arrinf), 4), decimal.mark = ".", big.mark = ","),
              " - ",
              format(round((taula_arrsup), 4), decimal.mark = ".", big.mark = ","),
              "]")
ARR
##################################################################################################################################      
##################################################################################################################################
      
      
      
      
      
# Tests
##################################################################################################################################
# Data: 
#  - dt.matching
#  - dt.proves.seg

# All tests
  # Prepare data
    dt.proves.seg.flt <- dt.proves.seg[data_prova_seg >= vac_2_data,]
    
    dt.proves.seg.agr <- dt.proves.seg.flt[, j=list(nproves_estudi_seg=.N), by=.(hash_seg)]
    setkey(dt.matching, 'hash')
    setkey(dt.proves.seg.agr, 'hash_seg')
    dt.matching <- data.table(merge(dt.matching,
                                    dt.proves.seg.agr,
                                    by.x = 'hash',
                                    by.y = 'hash_seg',
                                    all.x = TRUE))[is.na(nproves_estudi_seg), nproves_estudi_seg:=0]

    dt.proves.seg.count <- dt.matching[match_c==1, c("pauta", 
                                                     "nproves_estudi_seg")]
    dt.proves.seg.count[nproves_estudi_seg>0, prova_seg:=1][nproves_estudi_seg==0, prova_seg:=0]
    
  # Zero-inflated negative binomial regression
    m.zinb.proves.seg <- zeroinfl(nproves_estudi_seg ~ pauta, 
                                  data = dt.proves.seg.count,
                                  dist = c("negbin"))
    m.zinb.proves.seg
    summary(m.zinb.proves.seg)
    est <- cbind(Estimate = coef(m.zinb.proves.seg), confint(m.zinb.proves.seg))
    exp(est)
    
  
  # Figure (Figure 2 article)
    
    # Prepare data
      dt.proves.corbes.seg <- merge(dt.proves.seg.flt,
                                    dt.matching[match_c==1,],
                                    by.x = 'hash_seg',
                                    by.y = 'hash',
                                    all.y = TRUE)
      dt.corbes.prova.seg <- dt.proves.corbes.seg[!is.na(data_prova_seg), .N, by=c('pauta', 'data_prova_seg')]
      dt.corbes.prova.seg <- dt.corbes.prova.seg[order(pauta,data_prova_seg)]
      dt.corbes.prova.seg[order(pauta,data_prova_seg),
                          acumulat_7 := Reduce(`+`, shift(N, 0:6)), by=.(pauta)]
      dt.corbes.prova.seg[, figura:="Testing rates"]
      setnames(dt.corbes.prova.seg, "data_prova_seg", "data")  
    
      # Vaccination
        dt.corbes.vac <- dt.matching[match_c==1 & !is.na(vac_2_data), .N, by=c('pauta','vac_2_data')]
        dt.corbes.vac[, figura:="Vaccine uptake"]
        setnames(dt.corbes.vac, "vac_2_data", "data")  
    
      # Merge
        dt.corbes.all.wide <- merge(dt.corbes.prova.seg[,.(data, pauta, acumulat_7)],
                                    dt.corbes.vac[,.(data, pauta, N)],
                                    by.x = c('data','pauta'),
                                    by.y = c('data','pauta'),
                                    all = TRUE)
        
        dt.corbes.all.wide[pauta=="Heteròloga", pauta:="Heterologous vaccination"]
        dt.corbes.all.wide[pauta=="Homòloga", pauta:="Homologous vaccination"]
    

    # Figure
    Sys.setlocale("LC_TIME", "C")
    tiff("seg_figure2.jpg", 
         units="mm", width=150, height = 100, res=300)
    ggplot(dt.corbes.all.wide, aes(x=data)) +
      geom_line( aes(y=acumulat_7, group=pauta, color=pauta), size=1, linetype = "dashed") + 
      geom_line( aes(y=N, group=pauta, color=pauta), size=1) +
      scale_y_continuous(
        sec.axis = sec_axis(~.*1, name = "Weekly number of tests")
      ) +
      theme_classic2() +
      theme(legend.title = element_blank(), legend.position = c(0.75, 0.85), 
            axis.title.y.right = element_text(angle = 90),
            axis.text.x = element_text(angle=90, vjust=0.2)) +        
      scale_x_date(breaks = "14 days", limits = c(as.Date("2021-04-21"), as.Date("2021-12-05")), expand=c(0,0), date_labels = "%d-%b") +
      scale_color_grey() +
      xlab("Date of the year (2021)") +
      ylab("Daily number of second doses") +
      labs(caption = "Solid lines: Number of second doses; Dashed lines: Number of tests")    
    
# PCR tests    
  # Prepare data
    dt.proves.seg.pcr.agr <- dt.proves.seg.flt[tipus_prova_seg=='PCR', j=list(nproves_pcr_estudi_seg=.N), by=.(hash_seg)]
    setkey(dt.matching, 'hash')
    setkey(dt.proves.seg.pcr.agr, 'hash_seg')
    dt.proves.seg.pcr <- data.table(merge(dt.matching[match_c==1,.(hash, pauta)],
                                          dt.proves.seg.pcr.agr,
                                          by.x = 'hash',
                                          by.y = 'hash_seg',
                                          all.x = TRUE))[is.na(nproves_pcr_estudi_seg), nproves_pcr_estudi_seg:=0]
    
  # Zero-inflated negative binomial regression
    m.zinb.proves.seg.pcr <- zeroinfl(nproves_pcr_estudi_seg ~ pauta, data = dt.proves.seg.pcr, dist = c("negbin"))
    m.zinb.proves.seg.pcr
    summary(m.zinb.proves.seg.pcr)
    est <- cbind(Estimate = coef(m.zinb.proves.seg.pcr), confint(m.zinb.proves.seg.pcr))
    exp(est)
    
# LFT tests    
    # Prepare data
      dt.proves.tar.seg.agr <- dt.proves.seg.flt[tipus_prova_seg=='Antigen', j=list(nproves_tar_estudi_seg=.N), by=.(hash_seg)]
      setkey(dt.matching, 'hash')
      setkey(dt.proves.tar.seg.agr, 'hash_seg')
      dt.proves.seg.tar <- data.table(merge(dt.matching[match_c==1,.(hash, pauta)],
                                            dt.proves.tar.seg.agr,
                                            by.x = 'hash',
                                            by.y = 'hash_seg',
                                            all.x = TRUE))[is.na(nproves_tar_estudi_seg), nproves_tar_estudi_seg:=0]
    
    # Zero-inflated negative binomial regression
      m.zinb.proves.seg.tar <- zeroinfl(nproves_tar_estudi_seg ~ pauta, data = dt.proves.seg.tar, dist = c("negbin"))
      m.zinb.proves.seg.tar
      summary(m.zinb.proves.seg.tar)
      est <- cbind(Estimate = coef(m.zinb.proves.seg.tar), confint(m.zinb.proves.seg.tar))
      exp(est)      
##################################################################################################################################





# Safety
##################################################################################################################################
# Data: 
#  - dt.matching
#  - dt.safety.seg
    
  # Prepare data

    # Venous thromboembolism events
      # Vac 1
        dt.safety.seg[, mte_vac_1_seg := ifelse(exposicio_seg=='vac_1' & mte_seg == 1, "Sí", "No")]
        dt.eadversos.mte.seg <- dt.safety.seg[mte_vac_1_seg=="Sí", j=list(n=.N), by=.(hash_seg, mte_vac_1_seg)][,.(hash_seg,mte_vac_1_seg)]
        setkey(dt.matching, 'hash')
        setkey(dt.eadversos.mte.seg, 'hash_seg')
        dt.matching <- data.table(merge(dt.matching,
                                        dt.eadversos.mte.seg,
                                        by.x = 'hash',
                                        by.y = 'hash_seg',
                                        all.x = TRUE))[is.na(mte_vac_1_seg), mte_vac_1_seg:="No"]
      
      # Vac 2
        dt.safety.seg[, mte_vac_2_seg := ifelse(exposicio_seg=='vac_2' & mte_seg == 1, "Sí", "No")]
        dt.eadversos.mte.seg <- dt.safety.seg[mte_vac_2_seg=="Sí", j=list(n=.N), by=.(hash_seg, mte_vac_2_seg)][,.(hash_seg,mte_vac_2_seg)]
        setkey(dt.matching, 'hash')
        setkey(dt.eadversos.mte.seg, 'hash_seg')
        dt.matching <- data.table(merge(dt.matching,
                                        dt.eadversos.mte.seg,
                                        by.x = 'hash',
                                        by.y = 'hash_seg',
                                        all.x = TRUE))[is.na(mte_vac_2_seg), mte_vac_2_seg:="No"]

    # Venous thromboembolism events with thrombocytopenia
      # Vac 1
        dt.safety.seg[, mtetcp_vac_1_seg := ifelse(exposicio_seg=='vac_1' & mte_tcp_seg == 1, "Sí", "No")]
        dt.eadversos.mtetcp.seg <- dt.safety.seg[mtetcp_vac_1_seg=="Sí", j=list(n=.N), by=.(hash_seg, mtetcp_vac_1_seg)][,.(hash_seg,mtetcp_vac_1_seg)]
        setkey(dt.matching, 'hash')
        setkey(dt.eadversos.mtetcp.seg, 'hash_seg')
        dt.matching <- data.table(merge(dt.matching,
                                        dt.eadversos.mtetcp.seg,
                                        by.x = 'hash',
                                        by.y = 'hash_seg',
                                        all.x = TRUE))[is.na(mtetcp_vac_1_seg), mtetcp_vac_1_seg:="No"]
        
      # Vac 2
        dt.safety.seg[, mtetcp_vac_2_seg := ifelse(exposicio_seg=='vac_2' & mte_tcp_seg == 1, "Sí", "No")]
        dt.eadversos.mtetcp.seg <- dt.safety.seg[mtetcp_vac_2_seg=="Sí", j=list(n=.N), by=.(hash_seg, mtetcp_vac_2_seg)][,.(hash_seg,mtetcp_vac_2_seg)]
        setkey(dt.matching, 'hash')
        setkey(dt.eadversos.mtetcp.seg, 'hash_seg')
        dt.matching <- data.table(merge(dt.matching,
                                        dt.eadversos.mtetcp.seg,
                                        by.x = 'hash',
                                        by.y = 'hash_seg',
                                        all.x = TRUE))[is.na(mtetcp_vac_2_seg), mtetcp_vac_2_seg:="No"]

    # Myopericarditis
      # Vac 1
        dt.safety.seg[, peri_vac_1_seg := ifelse(exposicio_seg=='vac_1' & es_perimiocarditis_seg == 1, "Sí", "No")]
        dt.eadversos.peri.seg <- dt.safety.seg[peri_vac_1_seg=="Sí", j=list(n=.N), by=.(hash_seg, peri_vac_1_seg)][,.(hash_seg,peri_vac_1_seg)]
        setkey(dt.matching, 'hash')
        setkey(dt.eadversos.peri.seg, 'hash_seg')
        dt.matching <- data.table(merge(dt.matching,
                                        dt.eadversos.peri.seg,
                                        by.x = 'hash',
                                        by.y = 'hash_seg',
                                        all.x = TRUE))[is.na(peri_vac_1_seg), peri_vac_1_seg:="No"]
        
      # Vac 2
        dt.safety.seg[, peri_vac_2_seg := ifelse(exposicio_seg=='vac_2' & es_perimiocarditis_seg == 1, "Sí", "No")]
        dt.eadversos.peri.seg <- dt.safety.seg[peri_vac_2_seg=="Sí", j=list(n=.N), by=.(hash_seg, peri_vac_2_seg)][,.(hash_seg,peri_vac_2_seg)]
        setkey(dt.matching, 'hash')
        setkey(dt.eadversos.peri.seg, 'hash_seg')
        dt.matching <- data.table(merge(dt.matching,
                                        dt.eadversos.peri.seg,
                                        by.x = 'hash',
                                        by.y = 'hash_seg',
                                        all.x = TRUE))[is.na(peri_vac_2_seg), peri_vac_2_seg:="No"]  

  # Comparison
    df <- data.frame(dt.matching[match_c==1,])
    res <- compareGroups(pauta ~ mte_vac_1_seg + mte_vac_2_seg + 
                                 mtetcp_vac_1_seg + mtetcp_vac_2_seg +
                                 peri_vac_1_seg + peri_vac_2_seg
                         , df
                         , method = NA
                         , include.label = FALSE)
    export2md(createTable(res,
                          show.ratio=FALSE))
##################################################################################################################################





# Negative Control
##################################################################################################################################
# Data: 
#  - dt.matching
#  - dt.cohortn.seg
    
  # Prepare data
  setnames(dt.cohortn.seg, c("dde"), c("dde_seg"))
  setkey(dt.matching, 'hash')
  setkey(dt.cohortn.seg, 'hash')
  dt.cohortn.seg <- merge(dt.cohortn.seg,
                          dt.matching[match_c==1,.(hash, vac_2_data)],
                          by.x = 'hash',
                          by.y = 'hash',
                          all.x = TRUE)
  
  dt.cohortn.seg[, lumb_estudi_seg := ifelse(ps=='Lumbalgia/dorsalgia' & dde_seg >= vac_2_data, "Sí", "No")]
  dt.cohortn.lumb.seg <- dt.cohortn.seg[lumb_estudi_seg=="Sí", j=list(lumb_data_seg=min(dde_seg)), by=.(hash, lumb_estudi_seg)]
  setkey(dt.matching, 'hash')
  setkey(dt.cohortn.lumb.seg, 'hash')
  dt.matching.ps.cn.seg <- data.table(merge(dt.matching[match_c==1,],
                                            dt.cohortn.lumb.seg,
                                            by.x = 'hash',
                                            by.y = 'hash',
                                            all.x = TRUE))[is.na(lumb_estudi_seg), lumb_estudi_seg:="No"]
  
  dt.surv <- dt.matching.ps.cn.seg[match_c==1, c("edat_v", "pauta", "vac_2_data",
                                                 "lumb_data", "lumb_estudi",
                                                 "lumb_data_seg", "lumb_estudi_seg",
                                                 "exitus_covid", "match")]
  dt.surv[,lumb_data_seg:=as.Date(lumb_data_seg)]
  dt.surv[lumb_estudi_seg=="No", status:=1]
  dt.surv[lumb_estudi_seg=="Sí", status:=2]
  dt.surv[, time := pmin(lumb_data_seg, data_fi_seg, na.rm = TRUE) - vac_2_data]
  dt.surv <- dt.surv[,pauta_surv:=0][pauta=='Heteròloga', pauta_surv:=1]
  
  # Survival Analysis
  survfit <- survfit(Surv(time, status) ~ pauta_surv, 
                     data = dt.surv)
  
    ## Figure
      tiff("seg_lowblackppain_km090.jpg", 
           units="mm", width=150, height = 100, res=300)
      ggsurvplot(survfit,  size = 1,
                 linetype = "strata",
                 break.time.by = 14,
                 palette = "grey",
                 conf.int = TRUE,
                 pval = FALSE,
                 pval.coord = c(180, 1),
                 ylim = c(.90, 1),
                 xlim = c(0, 180),
                 ggtheme = theme_classic(),
                 xlab = "Days after second dose",
                 legend.labs = c( "Homologous vaccination", "Heterologous vaccination"),
                 title = "Low back pain",
                 subtitle = "",
                 legend.title = "",
                 legend = c(0.2, 0.2),
                 censor = TRUE
    )
    
  # Cox Regression
    coxph_seg <- coxph(Surv(time, status) ~ pauta_surv,
                       robust = TRUE,
                       cluster = match,
                       data = dt.surv)
    summary(coxph_seg)
    hr <-  summary(coxph_seg)$conf.int
    hr
    test <- cox.zph(coxph_seg)
    ggcoxzph(test)
##################################################################################################################################
    
    
    
    
    
# Sensitivity analyses (Matching 1:2)
##################################################################################################################################
# Data: 
#  - dt.matching
#  - dt.cohorts.seg
    
# Matching
  dt.matching.12 <- dt.matching
  X <- cbind('edat' = dt.matching.12$edatfinal,
             'sexe' = dt.matching.12$sexe,
             'abs' = dt.matching.12$abs,
             'vac_2_data' = dt.matching.12$vac_2_data)
  rr12 <- Match(Y = NULL,
                Tr = dt.matching.12$pauta1, X = X,
                exact = c(F,T,T,F),
                replace = F,
                M = 2,
                caliper = 1/5)
  summary(rr12)
  dt.matching.12$match12 <- NA
  dt.matching.12$match12[c(unique(rr12$index.treated))] <- sprintf("%d",
                                                             rep(1:length(unique(rr12$index.treated)),
                                                             times=1))
  dt.matching.12$match12[c(rr12$index.control)] <- sprintf("%d",
                                                             rep(1:length(unique(rr12$index.treated)),
                                                             each=2))
  dt.matching.12$match12_c <- 0
  dt.matching.12[!is.na(match12), match12_c:=1]
  
  dt.homo.vac <- dt.matching.12[match12_c==1,][pauta=="Homòloga", .(match12, vac_2_data)]
  setnames(dt.homo.vac, "vac_2_data", "vac_2_data_homo")
  dt.hete.vac <- dt.matching.12[match12_c==1,][pauta=="Heteròloga", .(match12, vac_2_data)]
  setnames(dt.hete.vac, "vac_2_data", "vac_2_data_hete")
  dt.vac <- merge(dt.homo.vac,
                  dt.hete.vac,
                  by.x="match12",
                  by.y = "match12")
  dt.vac <- dt.vac[, vac_dif:=vac_2_data_homo-vac_2_data_hete]
  dt.vac.diff <- dt.vac[, .N, by=vac_dif][order(vac_dif),]
  dt.vac.diff
  
  dt.homo.edat <- dt.matching.12[match12_c==1,][pauta=="Homòloga", .(match12, edatfinal)]
  setnames(dt.homo.edat, "edatfinal", "edat_homo")
  dt.hete.edat <- dt.matching.12[match12_c==1,][pauta=="Heteròloga", .(match12, edatfinal)]
  setnames(dt.hete.edat, "edatfinal", "edat_hete")
  dt.vac <- merge(dt.homo.edat,
                  dt.hete.edat,
                  by.x = "match12",
                  by.y = "match12")
  dt.edat <- dt.vac[, edat_dif:= edat_homo - edat_hete]
  dt.edat.diff <- dt.edat[, .N, by=edat_dif][order(edat_dif),]
  dt.edat.diff
  
# SMD
  dt.smd.12 <- dt.matching.12[match12_c==1,]
  tsmd <- do.call("rbind", 
                  lapply(c("edatfinal", "sexe",
                           "rural", "medea_c1",
                           fr,
                           tx),
                         function(x){
                           #print(x)
                           d <- dt.smd.12[, .SD, .SDcols = c("pauta", x)]
                           if (is.integer(dt.smd.12[, get(x)]) | is.numeric(dt.smd.12[, get(x)])) {
                             smd <- tryCatch(stddiff.numeric(data = d, gcol = 1, vcol = 2)[,"stddiff"], error=function(e) NA)
                             t <- data.table(V1 = c(smd))
                             t[, Variable := x]
                             t[, c("Variable", "V1")]
                           } 
                           else {
                             smd <- tryCatch(stddiff.category(data = d, gcol = 1, vcol = 2)[1,"stddiff"], error=function(e) NA)
                             t <- data.table(V1 = c(smd))
                             t[, Variable := x]
                             t[, c("Variable", "V1")]
                           }
                         }))
  kable(data.table(tsmd)[order(-V1)]) 
  
# Survival analysis
  
  # Update Follow-up
    dt.matching.seg <- merge(dt.matching.12[match12_c==1,],
                             dt.cohorts.seg,
                             by.x = "hash",
                             by.y = "hash_seg",
                             all.x = TRUE)
    dt.matching.seg[is.na(cas_seg), .(cas_data, cas, cas_data_seg, cas_seg)]
    dt.matching.seg[is.na(cas_seg), cas_data_seg := cas_data]
    dt.matching.seg[is.na(cas_seg), cas_seg := cas]  
  
  # Prepare data
    dt.seg.surv <- dt.matching.seg[, c("hash",
                                     "edat_v", "pauta", "vac_2_data", "vac_3_data_seg", 
                                     "cas_data", "cas",
                                     "cas_data_seg", "cas_seg", "exitus_covid_seg", "match12")]
    dt.seg.surv[, .(.N, sum(!is.na(vac_3_data_seg))), pauta]

    dt.seg.surv[cas_seg=="No", status_seg:=1]
    dt.seg.surv[cas_seg=="Sí", status_seg:=2]
    dt.seg.surv[vac_3_data_seg < cas_data_seg | is.na(cas_seg), status_seg:=1]

    # Folow-up
      dt.seg.surv[, data_min := pmin(cas_data_seg, vac_3_data_seg, na.rm = TRUE)]
      dt.seg.surv[, time_seg := pmin(data_min, data_fi_seg, na.rm = TRUE) - vac_2_data]

    dt.seg.surv <- dt.seg.surv[,pauta_surv_seg:=0][pauta=='Heteròloga', pauta_surv_seg:=1]
    
  # Kaplan-Meier
    # Data  
      km_results <- data.table(
        Type  =c(rep("Homòloga", survfit$strata[[1]]), rep("Heteròloga", survfit$strata[[2]])),
        time = survfit$time_seg,
        N_risk = survfit$n.risk,
        N_event = survfit$n.event,
        N_censor= survfit$n.censor,
        Prop_surv = survfit$surv,
        IC95_low = survfit$lower,
        IC95_upp = survfit$upper,
        std_error = survfit$std.err,
        cum_hazard = survfit$cumhaz,
        std_chaz = survfit$std.chaz
      )
      fwrite(km_results, "seg.matching12.km.csv",
             sep = ";", dec = ".", row.names = F)
    
    # Figure
    tiff("seg.matching12.km.jpg", 
         units="mm", width=150, height = 100, res=300)
    ggsurvplot(survfit,  size = 1,
               linetype = "strata",
               break.time.by = 21,
               palette = "grey",
               conf.int = TRUE,
               pval = TRUE,
               pval.coord = c(150, 0.995),
               ylim = c(.90, 1),
               xlim = c(0, 180),
               ggtheme = theme_classic(),
               xlab = "Days after second dose",
               legend.labs = c( "Homologous vaccination", "Heterologous vaccination"),
               title = "SARS-CoV-2 infection",
               subtitle = "",
               legend.title = "",
               legend = c(0.2, 0.2),
               censor = TRUE
     )
    
  # Cox Regression
  coxph_seg <- coxph(Surv(time_seg, status_seg) ~ pauta_surv_seg,
                     robust = TRUE,
                     cluster = match12,
                     data = dt.seg.surv)
  summary(coxph_seg)
  hr <-  summary(coxph_seg)$conf.int
  hr
  test <- cox.zph(coxph_seg)
  ggcoxzph(test)  
##################################################################################################################################
    
    
    
    
    
# Sensitivity analyses (Matching 1:5)
##################################################################################################################################
# Data: 
#  - dt.matching
#  - dt.cohorts.seg
  
  # Matching
  dt.matching.15 <- dt.matching
  X <- cbind('edat' = dt.matching.15$edatfinal,
             'sexe' = dt.matching.15$sexe,
             'abs' = dt.matching.15$abs,
             'vac_2_data' = dt.matching.15$vac_2_data)
  rr15 <- Match(Y = NULL,
              Tr = dt.matching.15$pauta1, X = X,
              exact = c(F,T,T,F),
              replace = F,
              M = 5,
              caliper = 1/5)
  summary(rr15)
  dt.matching.15$match15 <- NA
  dt.matching.15$match15[c(unique(rr15$index.treated))] <- sprintf("%d",
                                                           rep(1:length(unique(rr15$index.treated)),
                                                           times=1))
  dt.matching.15$match15[c(rr15$index.control)] <- sprintf("%d",
                                                           rep(1:length(unique(rr15$index.treated)),
                                                           each=5))
  dt.matching.15$match15_c <- 0
  dt.matching.15[!is.na(match15), match15_c:=1]
  table(dt.matching.15[,.(pauta, match15_c)])
  
  dt.homo.vac <- dt.matching.15[match15_c==1,][pauta=="Homòloga", .(match15, vac_2_data)]
  setnames(dt.homo.vac, "vac_2_data", "vac_2_data_homo")
  dt.hete.vac <- dt.matching.15[match15_c==1,][pauta=="Heteròloga", .(match15, vac_2_data)]
  setnames(dt.hete.vac, "vac_2_data", "vac_2_data_hete")
  dt.vac <- merge(dt.homo.vac,
                  dt.hete.vac,
                  by.x="match15",
                  by.y = "match15")
  dt.vac <- dt.vac[, vac_dif:=vac_2_data_homo-vac_2_data_hete]
  dt.vac.diff <- dt.vac[, .N, by=vac_dif][order(vac_dif),]
  dt.vac.diff
  
  dt.homo.edat <- dt.matching.15[match15_c==1,][pauta=="Homòloga", .(match15, edatfinal)]
  setnames(dt.homo.edat, "edatfinal", "edat_homo")
  dt.hete.edat <- dt.matching.15[match15_c==1,][pauta=="Heteròloga", .(match15, edatfinal)]
  setnames(dt.hete.edat, "edatfinal", "edat_hete")
  dt.vac <- merge(dt.homo.edat,
                  dt.hete.edat,
                  by.x = "match15",
                  by.y = "match15")
  dt.edat <- dt.vac[, edat_dif:= edat_homo - edat_hete]
  dt.edat.diff <- dt.edat[, .N, by=edat_dif][order(edat_dif),]
  dt.edat.diff
  
  
  # SMD
  dt.smd.15 <- dt.matching.15[match15_c==1,]
  tsmd <- do.call("rbind", 
                  lapply(c("edatfinal", "sexe",
                           "rural", "medea_c1",
                           fr,
                           tx),
                         function(x){
                           #print(x)
                           d <- dt.smd.15[, .SD, .SDcols = c("pauta", x)]
                           if (is.integer(dt.smd.15[, get(x)]) | is.numeric(dt.smd.15[, get(x)])) {
                             smd <- tryCatch(stddiff.numeric(data = d, gcol = 1, vcol = 2)[,"stddiff"], error=function(e) NA)
                             t <- data.table(V1 = c(smd))
                             t[, Variable := x]
                             t[, c("Variable", "V1")]
                           } 
                           else {
                             smd <- tryCatch(stddiff.category(data = d, gcol = 1, vcol = 2)[1,"stddiff"], error=function(e) NA)
                             t <- data.table(V1 = c(smd))
                             t[, Variable := x]
                             t[, c("Variable", "V1")]
                           }
                         }))
  kable(data.table(tsmd)[order(-V1)])

  
  # Survival analysis
  
    # Update Follow-up
      dt.matching.seg <- merge(dt.matching.15[match15_c==1,],
                               dt.cohorts.seg,
                               by.x = "hash",
                               by.y = "hash_seg",
                               all.x = TRUE)
      dt.matching.seg[is.na(cas_seg), .(cas_data, cas, cas_data_seg, cas_seg)]
      dt.matching.seg[is.na(cas_seg), cas_data_seg := cas_data]
      dt.matching.seg[is.na(cas_seg), cas_seg := cas]

    # Prepare data
      dt.seg.surv <- dt.matching.seg[, c("hash",
                                         "edat_v", "pauta", "vac_2_data", "vac_3_data_seg", 
                                         "cas_data", "cas",
                                         "cas_data_seg", "cas_seg", "exitus_covid_seg", "match15")]
      dt.seg.surv[cas_seg=="No", status_seg:=1]
      dt.seg.surv[cas_seg=="Sí", status_seg:=2]
      dt.seg.surv[vac_3_data_seg < cas_data_seg | is.na(cas_seg), status_seg:=1]

      # Follow-up
        dt.seg.surv[, data_min := pmin(cas_data_seg, vac_3_data_seg, na.rm = TRUE)]
        dt.seg.surv[, time_seg := pmin(data_min, data_fi_seg, na.rm = TRUE) - vac_2_data]


    # Kaplan Meier     
      dt.seg.surv <- dt.seg.surv[,pauta_surv_seg:=0][pauta=='Heteròloga', pauta_surv_seg:=1]
      survfit <- survfit(Surv(time_seg, status_seg) ~ pauta_surv_seg, data = dt.seg.surv)
      
      # Data
        km_results <- data.table(
          Type  =c(rep("Homòloga", survfit$strata[[1]]), rep("Heteròloga", survfit$strata[[2]])),
          time = survfit$time_seg,
          N_risk = survfit$n.risk,
          N_event = survfit$n.event,
          N_censor= survfit$n.censor,
          Prop_surv = survfit$surv,
          IC95_low = survfit$lower,
          IC95_upp = survfit$upper,
          std_error = survfit$std.err,
          cum_hazard = survfit$cumhaz,
          std_chaz = survfit$std.chaz
        )
        fwrite(km_results, "seg.matching15.km.csv",
               sep = ";", dec = ".", row.names = F)

      # Figure 
        tiff("seg.matching15.km.jpg", 
             units="mm", width=150, height = 100, res=300)
        ggsurvplot(survfit,  size = 1,
                   linetype = "strata",
                   break.time.by = 21,
                   palette = "grey",
                   conf.int = TRUE,
                   pval = TRUE,
                   pval.coord = c(150, 0.995),
                   ylim = c(.90, 1),
                   xlim = c(0, 180),
                   ggtheme = theme_classic(),
                   xlab = "Days after second dose",
                   legend.labs = c( "Homologous vaccination", "Heterologous vaccination"),
                   title = "SARS-CoV-2 infection",
                   subtitle = "",
                   legend.title = "",
                   legend = c(0.2, 0.2),
                   censor = TRUE
        )
        
    # Cox Regression
      coxph_seg <- coxph(Surv(time_seg, status_seg) ~ pauta_surv_seg,
                         robust = TRUE,
                         cluster = match15,
                         data = dt.seg.surv)
      summary(coxph_seg)
      hr <-  summary(coxph_seg)$conf.int
      hr
      test <- cox.zph(coxph_seg)
      ggcoxzph(test)
##################################################################################################################################    
