
# Install THE PACKAGES before using the MV-DLNM function#####
install.packages("Rtools")
install.packages("dlnm")
install.packages("splines")
install.packages("foreach")
install.packages("tsModel")
install.packages("Epi")



MV.DLNM<-function(directory,dataname,maxlagx)
{
path<-paste(directory,dataname,sep="/")  

library(dlnm) 
library(splines)
library(foreign)
library(tsModel)
library(Epi)

#1 Remove missing values in the RAW DATA  ######
data <- read.csv(path, header=T, sep=",")
data$date<-as.Date(data$date)
rm.data <- data[complete.cases(data), ]
rm.data$tmean<-rm.data$tmp
rm.data$o3mean<-rm.data$O3
rm.data$pm10mean<-rm.data$PM.10
rm.data$pm2.5mean<-rm.data$PM.2.5


#2 create lag mortality outcome####
maxlag <-maxlagx

p<-list()
for (day in 1:maxlag){
  dim<-as.numeric(dim(rm.data)[1])
  today=rm.data[,"death"]
  lag<- list()
  for(i in 1:day) {
    lag[[i]]<- c(matrix(NA,i,1),today[-c((dim-i+1):dim)])
  }
  lagg<-as.data.frame(lag);colnames(lagg)=paste('lag',1:day,sep='')
  sumlagg<-as.data.frame(apply(lagg,1,sum));colnames(sumlagg)="sumlag"
  ne<-cbind(today,lagg,sumlagg,rm.data[,c("year","date","tmean","o3mean","pm10mean","pm2.5mean","weekday_1","weekday_2","weekday_3","weekday_4","weekday_5","weekday_6","weekday_7")])
  newy<-as.data.frame(ne$today+ne$sumlag);colnames(newy)="newy"
  nnew<-cbind(newy,ne)
  
  #3 x generates the CROSS-BASIS#####
  # KNOTS FOR EXPOSURE-RESPONSE FUNCTION
  vk_2 <- quantile(nnew$tmean, c(10, 75, 90) / 100, na.rm = T)
  # KNOTS FOR THE LAG-RESPONSE FUNCTION
  ldf <- 5
  
  lk <- logknots(maxlag, df = ldf)
  # COMPUTE THE CROSS-BASIS
  cb_2<- crossbasis(nnew$tmean, lag = maxlag, argvar = list(fun = "bs",
                                                            degree = 2, knots = vk_2), arglag = list(knots = lk))
  
  
  #5 RUN THE MODEL#####
  #y
  model<- glm(today ~ cb_2+ ns(date, 8 * length(unique(year)))+o3mean+pm2.5mean+offset(log(sumlag))
              +weekday_2+weekday_3+weekday_4+weekday_5+weekday_6+weekday_7,family =quasipoisson(link=log) , nnew)
  
  model_null<- glm(today ~  ns(date, 8 * length(unique(year)))+o3mean+pm2.5mean+offset(log(sumlag))
                   +weekday_2+weekday_3+weekday_4+weekday_5+weekday_6+weekday_7,family =quasipoisson(link=log) , nnew[-c(1:maxlag),])
  p[[i]]<-anova(model,model_null,test="Chisq")[2,5]
  
  #5 crosspred#####
  pred<- crosspred(cb_2, model,cen=23.5)
  #6FIGURE-temp#####
  path2<-paste(directory,"/MV-DLNM",maxlag,"_",day+1,".png",sep="")
  png(path2,width=800,height =600)
  plot(pred, "overall", xlab = "Temperature (C)", ylab = "RR", cex.axis = 0.9,
       ylim =c( min(pred$allRRlow), max(pred$allRRhigh)),main = paste("MV-DLNM with",day,"lag outcome"),col='blue')
  mtext(paste("The overall p-value is", p[[i]], sep=" "))
  dev.off()

  
}

lag_p<-as.data.frame(p);colnames(lag_p)<-paste("lag",1:maxlag,sep='')

ppp<-as.data.frame(t(lag_p))
ppp
}


##Run the function with directory - dataset name and the maximum number of lag exposure
MV.DLNM("C:/Users/GUO/Desktop","taipei_data.csv",30)
