Temperature Data Management

Creating Database only with summer months

villes_s<-list()

for(i in 1:length(villes)) {
  villes_s[[i]]<-villes[[i]][villes[[i]]$saison=="summer",]
  villes_s[[i]]$temps <- ave(villes_s[[i]]$time,villes_s[[i]]$annee,  FUN = seq_along)
  }

names(villes_s)<-cities

table of N obs per months to check to have only summer month

for (i in 1:length(villes)){
print(table(villes_s[[i]]$mois))
}
## 
##   1   2   3   4   5   6   7   8   9  10  11  12 
##   0   0   0   0   0 480 496 496 480   0   0   0 
## 
##   1   2   3   4   5   6   7   8   9  10  11  12 
##   0   0   0   0   0 480 496 496 480   0   0   0 
## 
##   1   2   3   4   5   6   7   8   9  10  11  12 
##   0   0   0   0   0 480 496 496 480   0   0   0 
## 
##   1   2   3   4   5   6   7   8   9  10  11  12 
##   0   0   0   0   0 480 496 496 480   0   0   0 
## 
##   1   2   3   4   5   6   7   8   9  10  11  12 
##   0   0   0   0   0 480 496 496 480   0   0   0 
## 
##   1   2   3   4   5   6   7   8   9  10  11  12 
##   0   0   0   0   0 480 496 496 480   0   0   0 
## 
##   1   2   3   4   5   6   7   8   9  10  11  12 
##   0   0   0   0   0 480 496 496 480   0   0   0 
## 
##   1   2   3   4   5   6   7   8   9  10  11  12 
##   0   0   0   0   0 480 496 496 480   0   0   0 
## 
##   1   2   3   4   5   6   7   8   9  10  11  12 
##   0   0   0   0   0 480 496 496 480   0   0   0 
## 
##   1   2   3   4   5   6   7   8   9  10  11  12 
##   0   0   0   0   0 480 496 496 480   0   0   0 
## 
##   1   2   3   4   5   6   7   8   9  10  11  12 
##   0   0   0   0   0 480 496 496 480   0   0   0 
## 
##   1   2   3   4   5   6   7   8   9  10  11  12 
##   0   0   0   0   0 480 496 496 480   0   0   0 
## 
##   1   2   3   4   5   6   7   8   9  10  11  12 
##   0   0   0   0   0 480 496 496 480   0   0   0 
## 
##   1   2   3   4   5   6   7   8   9  10  11  12 
##   0   0   0   0   0 480 496 496 480   0   0   0 
## 
##   1   2   3   4   5   6   7   8   9  10  11  12 
##   0   0   0   0   0 480 496 496 480   0   0   0

Creating Heat Wave variable

## First condition for heat wave
for (i in 1:length(villes_s)){
  villes_s[[i]]$heat_wave1<-NA
  for (r in 3:nrow(villes_s[[i]])){
  villes_s[[i]]$heat_wave1[r]<-  if (villes_s[[i]]$tempmoy[r] >= trshld975[i] & villes_s[[i]]$tempmoy[r-1] >= trshld975[i] & villes_s[[i]]$tempmoy[r-2] >= trshld975[i] ) 1 else 0
  }}

## Second condition for heat wave
for (i in 1:length(villes_s)){
  for (r in 3:nrow(villes_s[[i]])){
  villes_s[[i]]$heat_wave[r]<-  if (villes_s[[i]]$heat_wave1[r] == 1 & (villes_s[[i]]$tempmoy[r] >= trshld995[i] | villes_s[[i]]$tempmoy[r-1] >= trshld995[i] | villes_s[[i]]$tempmoy[r-2] >= trshld995[i])) 1 else 0
  }}

 

Number of Heat Wave for each city, for the period from 2000 to 2015:

Heat wave=0 Heat wave=1
bordeaux 1924 26
clermont 1926 24
grenoble 1914 36
lehavre 1927 23
lyon 1918 32
marseille 1915 35
montpellier 1922 28
nancy 1918 32
nantes 1926 24
nice 1924 26
paris 1923 27
rennes 1918 32
rouen 1925 25
strasbourg 1912 38
toulouse 1921 29

Creating Ozone binary variable

Number of O3>90 perc episodes per city:

O3>90perc=0 O3>90perc=1
bordeaux 1756 196
clermont 1756 196
grenoble 1756 196
lehavre 1756 196
lyon 1756 196
marseille 1757 195
montpellier 1756 196
nancy 1756 196
nantes 1756 196
nice 1757 195
paris 1756 196
rennes 1756 196
rouen 1756 196
strasbourg 1757 195
toulouse 1756 196

Analysis On Non-Accidental Mortality

Continuous Ozone

Code:

# some data management
 for (i in 1:length(villes_s)){
   villes_s[[i]]$time<-1:nrow(villes_s[[i]]) # Create a new variable for time 
 } 
   

    
  # start bootstrap
     
  nreps=800 #number of bootstrap reps
  results<-matrix(NA,nrow = 15,ncol=10)
  colnames(results)<-c("city","NDE","NDE_2.5","NDE_97.5","NIE","NIE_2.5","NIE_97.5","PMM","PMM_2.5","PMM_97.5")
  
for (i in (1:length(villes_s))){
  boot.nde<- rep(NA,nreps)
  boot.nie <- rep(NA,nreps)
  boot.pmm <- rep(NA,nreps)
  for (rep in 1:nreps)
      
    {
      dat_resample <- sample(1:nrow(villes_s[[i]]),nrow(villes_s[[i]]),replace=T)
      dat_boot <- villes_s[[i]][dat_resample,]
        
      # outcome model - Poisson Regression: Mortality, HW and O3
      m.outcome<-glm(nocc_tot~heat_wave+o3+ns(time,df=round(3*length(time)/122))+Jours+Vacances+hol,data=dat_boot,family=quasipoisson)
      
      # mediator model - multinomial linear regression
      m.mediator<-lm(o3~heat_wave+no2moy+ns(time,df=round(3*length(time)/122))+Jours+Vacances+hol,data=dat_boot) 
      
      # save coefficients
      theta1<-coef(m.outcome)[2]
      
      theta2<-coef(m.outcome)[3]
     
      beta1<-coef(m.mediator)[2]
      
      # estimate CDE and NIE
      
      boot.nde[rep] <- exp(theta1) #NDE
      
      boot.nie[rep] <-exp(theta2*beta1) #NIE 
      
      boot.pmm[rep] <-boot.nde[rep]*(boot.nie[rep]-1)/(boot.nde[rep]*boot.nie[rep]-1) #PMM 
                   
      
    } #end bootstrap

  results[i,1]<-cities[[i]]
  results[i,2]<-median(boot.nde, na.rm=T)
  results[i,3]<-quantile(boot.nde, 0.025, na.rm=T)
  results[i,4]<-quantile(boot.nde, 0.975, na.rm=T)
  results[i,5]<-median(boot.nie, na.rm=T)
  results[i,6]<-quantile(boot.nie, 0.025, na.rm=T)
  results[i,7]<-quantile(boot.nie, 0.975, na.rm=T)
  results[i,8]<-median(boot.pmm, na.rm=T)
  results[i,9]<-quantile(boot.pmm, 0.025, na.rm=T)
  results[i,10]<-quantile(boot.pmm, 0.975, na.rm=T)
       }
  
  
  # output CDE and NIE and confidence intervals

Binary Ozone

Code:

  # start bootstrap
     
  nreps=800 #number of bootstrap reps
  results_bin<-matrix(NA,nrow = 15,ncol=10)
  colnames(results_bin)<-c("city","NDE","NDE_2.5","NDE_97.5","NIE","NIE_2.5","NIE_97.5","PMM","PMM_2.5","PMM_97.5")
  
for (i in (1:length(villes_s))){
  boot.nde<- rep(NA,nreps)
  boot.nie <- rep(NA,nreps)
  boot.pmm <- rep(NA,nreps)
  for (rep in 1:nreps)
      
    {
      dat_resample <- sample(1:nrow(villes_s[[i]]),nrow(villes_s[[i]]),replace=T)
      dat_boot <- villes_s[[i]][dat_resample,] 
        
      # outcome model - Poisson Regression: Mortality, HW and O3
      m.outcome<-glm(nocc_tot~heat_wave+o3_90+ns(time,df=round(3*length(time)/122))+Jours+Vacances+hol,data=dat_boot,family=quasipoisson)
      
      # mediator model - multinomial linear regression
      m.mediator<-lm(o3~heat_wave+no2moy+ns(time,df=round(3*length(time)/122))+Jours+Vacances+hol,data=dat_boot) 
      
      # save coefficients
      theta1<-coef(m.outcome)[2]
      
      theta2<-coef(m.outcome)[3]
     
      beta1<-coef(m.mediator)[2]
      
      # estimate CDE and NIE
      
      boot.nde[rep] <- exp(theta1) #NDE
      
      boot.nie[rep] <-exp(theta2*beta1) #NIE 
      
      boot.pmm[rep] <-boot.nde[rep]*(boot.nie[rep]-1)/(boot.nde[rep]*boot.nie[rep]-1) #PMM 
                   
      
    } #end bootstrap

  results_bin[i,1]<-cities[[i]]
  results_bin[i,2]<-median(boot.nde, na.rm=T)
  results_bin[i,3]<-quantile(boot.nde, 0.025, na.rm=T)
  results_bin[i,4]<-quantile(boot.nde, 0.975, na.rm=T)
  results_bin[i,5]<-median(boot.nie, na.rm=T)
  results_bin[i,6]<-quantile(boot.nie, 0.025, na.rm=T)
  results_bin[i,7]<-quantile(boot.nie, 0.975, na.rm=T)
  results_bin[i,8]<-median(boot.pmm, na.rm=T)
  results_bin[i,9]<-quantile(boot.pmm, 0.025, na.rm=T)
  results_bin[i,10]<-quantile(boot.pmm, 0.975, na.rm=T)
       }
  
  
  # output CDE and NIE and confidence intervals

Results

Results For Continuous Ozone:

city NDE NDE_2.5 NDE_97.5 NIE NIE_2.5 NIE_97.5 PMM PMM_2.5 PMM_97.5
bordeaux 1.5059 1.2886 1.7479 1.0276 1.0044 1.0549 0.0758 0.0120 0.1560
clermont 1.4536 1.2305 1.7438 1.0181 0.9922 1.0502 0.0552 -0.0249 0.1641
grenoble 1.1647 1.0264 1.3217 1.0321 1.0095 1.0581 0.1845 0.0517 0.5914
lehavre 1.2822 1.0348 1.5426 1.0317 0.9870 1.0837 0.1282 -0.0637 0.5612
lyon 1.3798 1.1874 1.6187 1.0324 1.0166 1.0516 0.1054 0.0522 0.2088
marseille 1.1492 1.0366 1.2496 1.0045 0.9996 1.0126 0.0339 -0.0026 0.1167
montpellier 1.1000 0.9299 1.2816 1.0075 0.9934 1.0235 0.0616 -0.3205 0.7226
nancy 1.2492 1.0689 1.4631 0.9989 0.9787 1.0232 -0.0048 -0.1434 0.1407
nantes 1.2098 1.0231 1.4676 1.0688 1.0278 1.1145 0.2901 0.1110 0.7687
nice 1.2238 1.0513 1.3998 1.0041 0.9984 1.0149 0.0226 -0.0108 0.1225
paris 1.7157 1.4008 2.1435 1.0511 1.0312 1.0821 0.1111 0.0680 0.1658
rennes 1.2876 1.0893 1.5107 1.0548 1.0067 1.1114 0.2027 0.0230 0.4782
rouen 1.3871 1.2058 1.6102 1.0664 1.0281 1.1079 0.1917 0.0864 0.3304
strasbourg 1.4538 1.3017 1.6112 1.0227 1.0019 1.0496 0.0690 0.0052 0.1552
toulouse 1.2413 1.1007 1.3838 1.0333 1.0131 1.0585 0.1493 0.0569 0.3111

Results For Binary Ozone:

city NDE NDE_2.5 NDE_97.5 NIE NIE_2.5 NIE_97.5 PMM PMM_2.5 PMM_97.5
bordeaux 1.4898 1.2908 1.7319 8.9659 2.5989 41.4950 0.9606 0.8343 0.9926
clermont 1.4086 1.1966 1.6779 8.2179 2.0807 51.7838 0.9617 0.7799 0.9951
grenoble 1.1759 1.0366 1.3386 3.3319 0.6802 17.9409 0.9461 0.1979 1.4579
lehavre 1.3147 1.0697 1.6148 2.5642 0.2251 24.8367 0.9348 -1.6233 3.0791
lyon 1.4056 1.1916 1.6575 2.4020 0.7954 7.3337 0.8368 -0.5225 0.9758
marseille 1.1490 1.0471 1.2523 1.1894 0.9801 1.6733 0.6092 -0.1111 0.8782
montpellier 1.1044 0.9343 1.2851 1.1873 0.6129 2.4631 0.8209 -1.3505 3.4000
nancy 1.2417 1.0633 1.4514 1.1643 0.3542 3.8211 0.8220 -3.6223 5.1768
nantes 1.2410 1.0478 1.4735 25.6910 2.4893 359.7313 0.9929 0.8659 0.9998
nice 1.2100 1.0464 1.3894 1.4231 0.9286 2.9250 0.7282 -0.0964 0.9781
paris 1.7279 1.3741 2.1536 15.2519 5.9191 50.6905 0.9712 0.9273 0.9909
rennes 1.2601 1.0633 1.4940 33.5869 2.8043 703.5327 0.9940 0.8863 0.9998
rouen 1.3990 1.2104 1.6335 32.7542 4.2233 394.9961 0.9911 0.9183 0.9993
strasbourg 1.4281 1.2823 1.5834 7.8511 1.9582 35.4654 0.9576 0.7534 0.9928
toulouse 1.2558 1.1202 1.4032 3.1359 1.0964 10.3081 0.9151 0.3947 0.9831

Forestplot

Natural Direct Effect

Natural Indirect Effect

Analysis On Cardiovascual Mortality

Continuous Ozone

Code:

# some data management
 for (i in 1:length(villes_s)){
   villes_s[[i]]$time<-1:nrow(villes_s[[i]]) # Create a new variable for time 
 } 
   

  # start bootstrap
     
  nreps=800 #number of bootstrap reps
  results<-matrix(NA,nrow = 15,ncol=10)
  colnames(results)<-c("city","NDE","NDE_2.5","NDE_97.5","NIE","NIE_2.5","NIE_97.5","PMM","PMM_2.5","PMM_97.5")
  
for (i in (1:length(villes_s))){
  boot.nde<- rep(NA,nreps)
  boot.nie <- rep(NA,nreps)
  boot.pmm <- rep(NA,nreps)
  for (rep in 1:nreps)
      
    {
      dat_resample <- sample(1:nrow(villes_s[[i]]),nrow(villes_s[[i]]),replace=T)
      dat_boot <- villes_s[[i]][dat_resample,]
        
      # outcome model - Poisson Regression: Mortality, HW and O3
      m.outcome<-glm(cv_tot~heat_wave+o3+ns(time,df=round(3*length(time)/122))+Jours+Vacances+hol,data=dat_boot,family=quasipoisson)
      
      # mediator model - multinomial linear regression
      m.mediator<-lm(o3~heat_wave+no2moy+ns(time,df=round(3*length(time)/122))+Jours+Vacances+hol,data=dat_boot) 
      
      # save coefficients
      theta1<-coef(m.outcome)[2]
      
      theta2<-coef(m.outcome)[3]
     
      beta1<-coef(m.mediator)[2]
      
      # estimate CDE and NIE
      
      boot.nde[rep] <- exp(theta1) #NDE
      
      boot.nie[rep] <-exp(theta2*beta1) #NIE 
      
      boot.pmm[rep] <-boot.nde[rep]*(boot.nie[rep]-1)/(boot.nde[rep]*boot.nie[rep]-1) #PMM 
                   
      
    } #end bootstrap

  results[i,1]<-cities[[i]]
  results[i,2]<-median(boot.nde, na.rm=T)
  results[i,3]<-quantile(boot.nde, 0.025, na.rm=T)
  results[i,4]<-quantile(boot.nde, 0.975, na.rm=T)
  results[i,5]<-median(boot.nie, na.rm=T)
  results[i,6]<-quantile(boot.nie, 0.025, na.rm=T)
  results[i,7]<-quantile(boot.nie, 0.975, na.rm=T)
  results[i,8]<-median(boot.pmm, na.rm=T)
  results[i,9]<-quantile(boot.pmm, 0.025, na.rm=T)
  results[i,10]<-quantile(boot.pmm, 0.975, na.rm=T)
       }
  
  
  # output CDE and NIE and confidence intervals

Binary Ozone

Code:

  # start bootstrap
     
  nreps=800 #number of bootstrap reps
  results_bin<-matrix(NA,nrow = 15,ncol=10)
  colnames(results_bin)<-c("city","NDE","NDE_2.5","NDE_97.5","NIE","NIE_2.5","NIE_97.5","PMM","PMM_2.5","PMM_97.5")
  
for (i in (1:length(villes_s))){
  boot.nde<- rep(NA,nreps)
  boot.nie <- rep(NA,nreps)
  boot.pmm <- rep(NA,nreps)
  for (rep in 1:nreps)
      
    {
      dat_resample <- sample(1:nrow(villes_s[[i]]),nrow(villes_s[[i]]),replace=T)
      dat_boot <- villes_s[[i]][dat_resample,] 
        
      # outcome model - Poisson Regression: Mortality, HW and O3
      m.outcome<-glm(nocc_tot~heat_wave+o3_90+ns(time,df=round(3*length(time)/122))+Jours+Vacances+hol,data=dat_boot,family=quasipoisson)
      
      # mediator model - multinomial linear regression
      m.mediator<-lm(o3~heat_wave+no2moy+ns(time,df=round(3*length(time)/122))+Jours+Vacances+hol,data=dat_boot) 
      
      # save coefficients
      theta1<-coef(m.outcome)[2]
      
      theta2<-coef(m.outcome)[3]
     
      beta1<-coef(m.mediator)[2]
      
      # estimate CDE and NIE
      
      boot.nde[rep] <- exp(theta1) #NDE
      
      boot.nie[rep] <-exp(theta2*beta1) #NIE 
      
      boot.pmm[rep] <-boot.nde[rep]*(boot.nie[rep]-1)/(boot.nde[rep]*boot.nie[rep]-1) #PMM 
                   
      
    } #end bootstrap

  results_bin[i,1]<-cities[[i]]
  results_bin[i,2]<-median(boot.nde, na.rm=T)
  results_bin[i,3]<-quantile(boot.nde, 0.025, na.rm=T)
  results_bin[i,4]<-quantile(boot.nde, 0.975, na.rm=T)
  results_bin[i,5]<-median(boot.nie, na.rm=T)
  results_bin[i,6]<-quantile(boot.nie, 0.025, na.rm=T)
  results_bin[i,7]<-quantile(boot.nie, 0.975, na.rm=T)
  results_bin[i,8]<-median(boot.pmm, na.rm=T)
  results_bin[i,9]<-quantile(boot.pmm, 0.025, na.rm=T)
  results_bin[i,10]<-quantile(boot.pmm, 0.975, na.rm=T)
       }
  
  
  # output CDE and NIE and confidence intervals

Results

Results For Continuous Ozone:

city NDE NDE_2.5 NDE_97.5 NIE NIE_2.5 NIE_97.5 PMM PMM_2.5 PMM_97.5
bordeaux 1.5333 1.2879 1.8535 1.0275 0.9912 1.0704 0.0739 -0.0246 0.1949
clermont 1.7926 1.3603 2.3460 0.9962 0.9493 1.0481 -0.0088 -0.1381 0.1154
grenoble 1.2618 0.9899 1.5835 1.0561 1.0117 1.1022 0.2107 0.0144 0.9073
lehavre 1.2471 0.8745 1.7303 1.1107 1.0178 1.2255 0.3460 -0.8233 2.6958
lyon 1.4485 1.1374 1.7946 1.0328 1.0055 1.0635 0.0987 0.0164 0.2424
marseille 1.0635 0.9270 1.2312 1.0059 0.9994 1.0178 0.0562 -0.6345 0.9293
montpellier 1.0789 0.7463 1.5156 1.0089 0.9842 1.0408 0.0266 -0.6698 1.0073
nancy 1.5422 1.1576 2.0306 0.9915 0.9508 1.0389 -0.0256 -0.2020 0.1335
nantes 1.2502 0.9106 1.6383 1.0843 0.9961 1.1797 0.2926 -0.0766 1.5830
nice 1.1255 0.8554 1.4127 1.0091 0.9980 1.0314 0.0570 -0.5099 0.9636
paris 1.7815 1.3652 2.2762 1.0524 1.0240 1.0879 0.1085 0.0538 0.1729
rennes 1.4659 0.9452 2.1707 1.0306 0.9395 1.1293 0.0896 -0.3871 0.9082
rouen 1.3011 0.9760 1.6338 1.0783 1.0131 1.1663 0.2576 0.0043 0.9911
strasbourg 1.5298 1.2436 1.8193 0.9850 0.9377 1.0251 -0.0449 -0.2148 0.0740
toulouse 1.2398 1.0020 1.5241 1.0525 1.0171 1.0983 0.2181 0.0574 0.7908

Results For Binary Ozone:

city NDE NDE_2.5 NDE_97.5 NIE NIE_2.5 NIE_97.5 PMM PMM_2.5 PMM_97.5
bordeaux 1.4841 1.2752 1.7013 8.8887 2.6331 41.8605 0.9600 0.8278 0.9930
clermont 1.4163 1.1848 1.6678 8.2661 1.9440 48.4141 0.9620 0.7678 0.9951
grenoble 1.1833 1.0378 1.3343 3.1608 0.6627 16.7460 0.9476 0.2158 1.5972
lehavre 1.3053 1.0667 1.5928 2.5796 0.2944 22.8162 0.9300 -1.1118 4.7234
lyon 1.4182 1.1801 1.6414 2.4633 0.8491 8.0006 0.8386 -0.6336 0.9721
marseille 1.1532 1.0565 1.2540 1.1816 0.9813 1.6420 0.5930 -0.1955 0.8699
montpellier 1.1002 0.9424 1.2836 1.1609 0.5908 2.3586 0.8209 -3.5830 4.3788
nancy 1.2322 1.0532 1.4399 1.1399 0.3048 4.2635 0.8406 -4.6805 6.2442
nantes 1.2492 1.0553 1.5183 24.6077 2.4769 373.8229 0.9925 0.8823 0.9996
nice 1.2149 1.0447 1.3933 1.4447 0.9278 2.6317 0.7252 -0.1852 0.9668
paris 1.7238 1.3804 2.1752 15.2836 6.0095 51.6234 0.9727 0.9283 0.9912
rennes 1.2685 1.0590 1.4783 37.6765 2.8967 579.5126 0.9943 0.8898 0.9998
rouen 1.3930 1.2034 1.6152 35.5309 4.0903 318.8118 0.9922 0.9125 0.9992
strasbourg 1.4272 1.2829 1.5698 7.7021 2.0842 38.4858 0.9580 0.7676 0.9935
toulouse 1.2554 1.1286 1.4090 3.3125 1.2356 10.4968 0.9204 0.5148 0.9816

Forestplot

Natural Direct Effect

Natural Indirect Effect

Analysis On Respiratory Mortality

Continuous Ozone

Code:

# some data management
 for (i in 1:length(villes_s)){
   villes_s[[i]]$time<-1:nrow(villes_s[[i]]) # Create a new variable for time 
 } 
   

    
  # start bootstrap
     
  nreps=800 #number of bootstrap reps
  results<-matrix(NA,nrow = 15,ncol=10)
  colnames(results)<-c("city","NDE","NDE_2.5","NDE_97.5","NIE","NIE_2.5","NIE_97.5","PMM","PMM_2.5","PMM_97.5")
  
for (i in (1:length(villes_s))){
  boot.nde<- rep(NA,nreps)
  boot.nie <- rep(NA,nreps)
  boot.pmm <- rep(NA,nreps)
  for (rep in 1:nreps)
      
    {
      dat_resample <- sample(1:nrow(villes_s[[i]]),nrow(villes_s[[i]]),replace=T)
      dat_boot <- villes_s[[i]][dat_resample,]
        
      # outcome model - Poisson Regression: Mortality, HW and O3
      m.outcome<-glm(nocc_tot~heat_wave+o3+ns(time,df=round(3*length(time)/122))+Jours+Vacances+hol,data=dat_boot,family=quasipoisson)
      
      # mediator model - multinomial linear regression
      m.mediator<-lm(o3~heat_wave+no2moy+ns(time,df=round(3*length(time)/122))+Jours+Vacances+hol,data=dat_boot) 
      
      # save coefficients
      theta1<-coef(m.outcome)[2]
      
      theta2<-coef(m.outcome)[3]
     
      beta1<-coef(m.mediator)[2]
      
      # estimate CDE and NIE
      
      boot.nde[rep] <- exp(theta1) #NDE
      
      boot.nie[rep] <-exp(theta2*beta1) #NIE 
      
      boot.pmm[rep] <-boot.nde[rep]*(boot.nie[rep]-1)/(boot.nde[rep]*boot.nie[rep]-1) #PMM 
                   
      
    } #end bootstrap

  results[i,1]<-cities[[i]]
  results[i,2]<-median(boot.nde, na.rm=T)
  results[i,3]<-quantile(boot.nde, 0.025, na.rm=T)
  results[i,4]<-quantile(boot.nde, 0.975, na.rm=T)
  results[i,5]<-median(boot.nie, na.rm=T)
  results[i,6]<-quantile(boot.nie, 0.025, na.rm=T)
  results[i,7]<-quantile(boot.nie, 0.975, na.rm=T)
  results[i,8]<-median(boot.pmm, na.rm=T)
  results[i,9]<-quantile(boot.pmm, 0.025, na.rm=T)
  results[i,10]<-quantile(boot.pmm, 0.975, na.rm=T)
       }
  
  
  # output CDE and NIE and confidence intervals

Binary Ozone

Code:

  # start bootstrap
     
  nreps=800 #number of bootstrap reps
  results_bin<-matrix(NA,nrow = 15,ncol=10)
  colnames(results_bin)<-c("city","NDE","NDE_2.5","NDE_97.5","NIE","NIE_2.5","NIE_97.5","PMM","PMM_2.5","PMM_97.5")
  
for (i in (1:length(villes_s))){
  boot.nde<- rep(NA,nreps)
  boot.nie <- rep(NA,nreps)
  boot.pmm <- rep(NA,nreps)
  for (rep in 1:nreps)
      
    {
      dat_resample <- sample(1:nrow(villes_s[[i]]),nrow(villes_s[[i]]),replace=T)
      dat_boot <- villes_s[[i]][dat_resample,] 
        
      # outcome model - Poisson Regression: Mortality, HW and O3
      m.outcome<-glm(nocc_tot~heat_wave+o3_90+ns(time,df=round(3*length(time)/122))+Jours+Vacances+hol,data=dat_boot,family=quasipoisson)
      
      # mediator model - multinomial linear regression
      m.mediator<-lm(o3~heat_wave+no2moy+ns(time,df=round(3*length(time)/122))+Jours+Vacances+hol,data=dat_boot) 
      
      # save coefficients
      theta1<-coef(m.outcome)[2]
      
      theta2<-coef(m.outcome)[3]
     
      beta1<-coef(m.mediator)[2]
      
      # estimate CDE and NIE
      
      boot.nde[rep] <- exp(theta1) #NDE
      
      boot.nie[rep] <-exp(theta2*beta1) #NIE 
      
      boot.pmm[rep] <-boot.nde[rep]*(boot.nie[rep]-1)/(boot.nde[rep]*boot.nie[rep]-1) #PMM 
                   
      
    } #end bootstrap

  results_bin[i,1]<-cities[[i]]
  results_bin[i,2]<-median(boot.nde, na.rm=T)
  results_bin[i,3]<-quantile(boot.nde, 0.025, na.rm=T)
  results_bin[i,4]<-quantile(boot.nde, 0.975, na.rm=T)
  results_bin[i,5]<-median(boot.nie, na.rm=T)
  results_bin[i,6]<-quantile(boot.nie, 0.025, na.rm=T)
  results_bin[i,7]<-quantile(boot.nie, 0.975, na.rm=T)
  results_bin[i,8]<-median(boot.pmm, na.rm=T)
  results_bin[i,9]<-quantile(boot.pmm, 0.025, na.rm=T)
  results_bin[i,10]<-quantile(boot.pmm, 0.975, na.rm=T)
       }
  
  
  # output CDE and NIE and confidence intervals

Results

Results For Continuous Ozone:

city NDE NDE_2.5 NDE_97.5 NIE NIE_2.5 NIE_97.5 PMM PMM_2.5 PMM_97.5
bordeaux 1.5050 1.2832 1.7276 1.0290 1.0048 1.0547 0.0793 0.0138 0.1613
clermont 1.4575 1.2424 1.7386 1.0182 0.9934 1.0492 0.0541 -0.0197 0.1569
grenoble 1.1607 1.0357 1.3005 1.0319 1.0109 1.0594 0.1811 0.0593 0.5154
lehavre 1.2826 1.0664 1.5591 1.0313 0.9845 1.0809 0.1272 -0.0703 0.4345
lyon 1.3855 1.1770 1.6093 1.0316 1.0165 1.0533 0.1039 0.0525 0.1865
marseille 1.1504 1.0623 1.2458 1.0044 0.9994 1.0120 0.0335 -0.0041 0.1109
montpellier 1.1056 0.9316 1.2813 1.0066 0.9946 1.0233 0.0522 -0.5118 0.8170
nancy 1.2491 1.0625 1.4763 1.0000 0.9790 1.0240 0.0005 -0.1528 0.1475
nantes 1.2142 1.0268 1.4716 1.0701 1.0315 1.1185 0.2900 0.1149 0.7626
nice 1.2177 1.0558 1.3937 1.0044 0.9987 1.0145 0.0249 -0.0069 0.1193
paris 1.7142 1.3965 2.1080 1.0527 1.0297 1.0819 0.1117 0.0688 0.1623
rennes 1.2778 1.0931 1.5216 1.0548 1.0084 1.1068 0.2050 0.0320 0.4856
rouen 1.3878 1.1961 1.5856 1.0677 1.0327 1.1092 0.1989 0.1024 0.3290
strasbourg 1.4572 1.3111 1.6261 1.0228 0.9999 1.0485 0.0673 -0.0004 0.1419
toulouse 1.2404 1.1066 1.3871 1.0333 1.0117 1.0572 0.1484 0.0586 0.2961

Results For Binary Ozone:

city NDE NDE_2.5 NDE_97.5 NIE NIE_2.5 NIE_97.5 PMM PMM_2.5 PMM_97.5
bordeaux 1.4884 1.2809 1.7147 9.5017 2.5775 42.7266 0.9641 0.8230 0.9925
clermont 1.4059 1.1814 1.6595 7.9246 1.7550 50.3589 0.9626 0.7004 0.9953
grenoble 1.1821 1.0369 1.3463 3.0242 0.6917 12.8590 0.9410 0.0130 1.6424
lehavre 1.2952 1.0518 1.5673 2.6227 0.2832 26.3602 0.9352 -2.5239 3.3444
lyon 1.4067 1.2263 1.6264 2.3063 0.8004 7.2868 0.8334 -0.3017 0.9719
marseille 1.1503 1.0437 1.2595 1.1967 0.9620 1.7491 0.6133 -0.3138 0.8829
montpellier 1.1137 0.9498 1.2964 1.1958 0.5976 2.3984 0.8153 -3.8212 3.7594
nancy 1.2364 1.0645 1.4529 1.1312 0.3020 4.5906 0.8364 -3.6178 5.9662
nantes 1.2397 1.0337 1.4809 24.5893 2.8541 293.7958 0.9927 0.9064 0.9997
nice 1.2053 1.0432 1.3894 1.4174 0.9059 2.8411 0.7220 -0.6344 0.9785
paris 1.7291 1.3905 2.1342 15.7180 6.4250 55.4055 0.9731 0.9300 0.9920
rennes 1.2613 1.0730 1.4972 33.9426 3.0054 633.0013 0.9940 0.8957 0.9998
rouen 1.3948 1.2153 1.5980 34.9744 4.3325 314.7414 0.9921 0.9205 0.9992
strasbourg 1.4303 1.2697 1.5754 7.7439 2.0084 38.0677 0.9577 0.7610 0.9935
toulouse 1.2528 1.1139 1.3932 3.2039 1.1726 10.6449 0.9185 0.4458 0.9841

Forestplot

Natural Direct Effect

Natural Indirect Effect