###############################################################################
#rm(list=ls())
#data=read.table("covid19.csv", sep=",", head=T)

data = read_excel("C:/Users/mindy/Dropbox/Novel Corona Virus/Multi-center Data Analysis/multi_center.xlsx")
death=data$Death

arbidol=data$Arbidol
kaletra=data$Kaletra
tamiflu=data$Tamiflu

trttot=arbidol+10*kaletra+100*tamiflu

data$SPO2[is.na(data$SPO2)]=mean(na.omit(data$SPO2))
x0=cbind(data$Age, data$Sex-1, data$Disease_Status, data$SPO2)

hosp=data$Time2Discharge

####################################

dbfit=function(death, hosp, trt, x){
fitps=glm(trt~x, family="binomial")
ps=fitps$fitted

fit1=glm(death~x, family="binomial", subset=(trt==1))
beta1=fit1$coef
prob1=1/(1+exp(-cbind(1,x)%*%beta1))
mu1death=mean(prob1+trt/ps*(death-prob1))

fit1hosp1=glm((death==0 & hosp<=7)~x, family="binomial", subset=(trt==1))
beta1hosp1=fit1hosp1$coef
prob1hosp1=1/(1+exp(-cbind(1,x)%*%beta1hosp1))
mu1wk1=mean(prob1hosp1+trt/ps*((death==0 & hosp<=7)-prob1hosp1))

fit1hosp2=glm((death==0 & hosp<=14 & hosp>7)~x, family="binomial", subset=(trt==1))
beta1hosp2=fit1hosp2$coef
prob1hosp2=1/(1+exp(-cbind(1,x)%*%beta1hosp2))
mu1wk2=mean(prob1hosp2+trt/ps*((death==0 & hosp<=14 & hosp>7)-prob1hosp2))

mu1wk3=1-mu1wk1-mu1wk2-mu1death

fit0=glm(death~x, family="binomial", subset=(trt==0))
beta0=fit0$coef
prob0=1/(1+exp(-cbind(1,x)%*%beta0))
mu0death=mean(prob0+(1-trt)/(1-ps)*(death-prob0))

fit0hosp1=glm((death==0 & hosp<=7)~x, family="binomial", subset=(trt==0))
beta0hosp1=fit0hosp1$coef
prob0hosp1=1/(1+exp(-cbind(1,x)%*%beta0hosp1))
mu0wk1=mean(prob0hosp1+trt/ps*((death==0 & hosp<=7)-prob0hosp1))

fit0hosp2=glm((death==0 & hosp<=14 & hosp>7)~x, family="binomial", subset=(trt==0))
beta0hosp2=fit0hosp2$coef
prob0hosp2=1/(1+exp(-cbind(1,x)%*%beta0hosp2))
mu0wk2=mean(prob0hosp2+trt/ps*((death==0 & hosp<=14 & hosp>7)-prob0hosp2))

mu0wk3=1-mu0wk1-mu0wk2-mu0death

return(cbind(c(mu1death, mu1wk3, mu1wk2, mu1wk1), c(mu0death, mu0wk3, mu0wk2, mu0wk1)))
}

Compare arbidol

trt=arbidol
x=cbind(x0)

####################################################################

mu1=apply(x0[trt==1,], 2, mean)
mu0=apply(x0[trt==0,], 2, mean)
sd1=apply(x0[trt==1,], 2, sd)
sd0=apply(x0[trt==0,], 2, sd)

pv=rep(0,4)
pv[1]=t.test(x0[trt==1,1], x0[trt==0, 1])$p.value
pv[2]=fisher.test(cbind(c(sum(x0[trt==1, 2]==1), sum(x0[trt==1, 2]==0)), c(sum(x0[trt==0, 2]==1), sum(x0[trt==0, 2]==0))))$p.value
pv[3]=fisher.test(cbind(c(sum(x0[trt==1, 3]==1), sum(x0[trt==1, 3]==0)), c(sum(x0[trt==0, 3]==1), sum(x0[trt==0, 3]==0))))$p.value
pv[4]=t.test(x0[trt==1,4], x0[trt==0, 4])$p.value


balance.table.arbidol=cbind(mu0, sd0, mu1, sd1, pv)
colnames(balance.table.arbidol)=c("mean0", "sd0", "mean1", "sd1", "p-value")
rownames(balance.table.arbidol)=c("age", "sex", "disease", "SPO2")

y=death

p0=mean(y[trt==0])
p1=mean(y[trt==1])
n0=sum(trt==0)
n1=sum(trt==1)
result.arbidol.dth.unadj=cbind( c(p0, p0+c(-1,1)*1.96*sqrt(p0*(1-p0)/n0), NA),
                           c(p1, p1+c(-1,1)*1.96*sqrt(p1*(1-p1)/n1), NA),
                           c(p0-p1, p0-p1+c(-1,1)*1.96*sqrt(p0*(1-p0)/n0+p1*(1-p1)/n1), 1-pchisq((p0-p1)^2/(p0*(1-p0)/n0+p1*(1-p1)/n1), 1)))

colnames(result.arbidol.dth.unadj)=c("mortality0", "mortality1", "difference in mortaltiy")
rownames(result.arbidol.dth.unadj)=c("est", "ci-low", "ci-high", "p-value")

y=(death==0 & hosp<=7)

p0=mean(y[trt==0])
p1=mean(y[trt==1])
n0=sum(trt==0)
n1=sum(trt==1)
result.arbidol.wk1.unadj=cbind( c(p0, p0+c(-1,1)*1.96*sqrt(p0*(1-p0)/n0), NA),
                           c(p1, p1+c(-1,1)*1.96*sqrt(p1*(1-p1)/n1), NA),
                           c(p0-p1, p0-p1+c(-1,1)*1.96*sqrt(p0*(1-p0)/n0+p1*(1-p1)/n1), 1-pchisq((p0-p1)^2/(p0*(1-p0)/n0+p1*(1-p1)/n1), 1)))

colnames(result.arbidol.wk1.unadj)=c("wk1-arm0", "wk1-arm1", "difference in wk1")
rownames(result.arbidol.wk1.unadj)=c("est", "ci-low", "ci-high", "p-value")

y=(death==0 & hosp<=14 & hosp>7)

p0=mean(y[trt==0])
p1=mean(y[trt==1])
n0=sum(trt==0)
n1=sum(trt==1)
result.arbidol.wk2.unadj=cbind( c(p0, p0+c(-1,1)*1.96*sqrt(p0*(1-p0)/n0), NA),
                               c(p1, p1+c(-1,1)*1.96*sqrt(p1*(1-p1)/n1), NA),
                               c(p0-p1, p0-p1+c(-1,1)*1.96*sqrt(p0*(1-p0)/n0+p1*(1-p1)/n1), 1-pchisq((p0-p1)^2/(p0*(1-p0)/n0+p1*(1-p1)/n1), 1)))

colnames(result.arbidol.wk2.unadj)=c("wk2-arm0", "wk2-arm1", "difference in wk2")
rownames(result.arbidol.wk2.unadj)=c("est", "ci-low", "ci-high", "p-value")

y=(death==0 & hosp>14)

p0=mean(y[trt==0])
p1=mean(y[trt==1])
n0=sum(trt==0)
n1=sum(trt==1)
result.arbidol.wk3.unadj=cbind( c(p0, p0+c(-1,1)*1.96*sqrt(p0*(1-p0)/n0), NA),
                               c(p1, p1+c(-1,1)*1.96*sqrt(p1*(1-p1)/n1), NA),
                               c(p0-p1, p0-p1+c(-1,1)*1.96*sqrt(p0*(1-p0)/n0+p1*(1-p1)/n1), 1-pchisq((p0-p1)^2/(p0*(1-p0)/n0+p1*(1-p1)/n1), 1)))

colnames(result.arbidol.wk3.unadj)=c("wk3-arm0", "wk3-arm1", "difference in wk3")
rownames(result.arbidol.wk3.unadj)=c("est", "ci-low", "ci-high", "p-value")

Unadjusted summary

round(result.arbidol.dth.unadj, 3)
##         mortality0 mortality1 difference in mortaltiy
## est          0.297      0.095                   0.201
## ci-low       0.225      0.055                   0.119
## ci-high      0.369      0.136                   0.284
## p-value         NA         NA                   0.000
round(cbind(result.arbidol.wk1.unadj, result.arbidol.wk2.unadj, result.arbidol.wk3.unadj), 3)
##         wk1-arm0 wk1-arm1 difference in wk1 wk2-arm0 wk2-arm1
## est        0.194       NA                NA    0.368       NA
## ci-low     0.131       NA                NA    0.292       NA
## ci-high    0.256       NA                NA    0.444       NA
## p-value       NA       NA                NA       NA       NA
##         difference in wk2 wk3-arm0 wk3-arm1 difference in wk3
## est                    NA    0.142       NA                NA
## ci-low                 NA    0.087       NA                NA
## ci-high                NA    0.197       NA                NA
## p-value                NA       NA       NA                NA

Adjusted Analysis (doubly robust regression)

fit=dbfit(death, hosp, trt, x)
mu1=fit[,1]
mu0=fit[,2]
delta=mu0-mu1

n=length(trt)
B=5000
mu1.bt=mu0.bt=matrix(0, B, 4)
for(b in 1:B)
{ set.seed(b)
  id=sample(n, n, T)
  fit.bt=dbfit(death[id], hosp[id], trt[id], x[id,])
  mu1.bt[b,]=fit.bt[,1]
  mu0.bt[b,]=fit.bt[,2]
}
delta.bt=mu0.bt-mu1.bt

result.arbidol.dth.adj=cbind(
c(mu0[1],   mu0[1]+c(-1, 1)*1.96*sd(mu0.bt[,1]), NA),
c(mu1[1],   mu1[1]+c(-1, 1)*1.96*sd(mu1.bt[,1]), NA),
c(delta[1], delta[1]+c(-1,1)*1.96*sd(delta.bt[,1]),  1-pchisq(delta[1]^2/var(delta.bt[,1]),1))
)

colnames(result.arbidol.dth.adj)=c("mortality0", "mortality1", "difference in mortality")
rownames(result.arbidol.dth.adj)=c("est", "ci-low", "ci-high", "p-value")

result.arbidol.wk3.adj=cbind(
  c(mu0[2],   mu0[2]+c(-1, 1)*1.96*sd(mu0.bt[,2]), NA),
  c(mu1[2],   mu1[2]+c(-1, 1)*1.96*sd(mu1.bt[,2]), NA),
  c(delta[2], delta[2]+c(-1,1)*1.96*sd(delta.bt[,2]),  1-pchisq(delta[2]^2/var(delta.bt[,2]),1))
)

colnames(result.arbidol.wk3.adj)=c("wk1-arm0", "wk1-arm1", "difference in wk1")
rownames(result.arbidol.wk3.adj)=c("est", "ci-low", "ci-high", "p-value")

result.arbidol.wk2.adj=cbind(
  c(mu0[3],   mu0[3]+c(-1, 1)*1.96*sd(mu0.bt[,3]), NA),
  c(mu1[3],   mu1[3]+c(-1, 1)*1.96*sd(mu1.bt[,3]), NA),
  c(delta[3], delta[3]+c(-1,1)*1.96*sd(delta.bt[,3]),  1-pchisq(delta[3]^2/var(delta.bt[,3]),1))
)

colnames(result.arbidol.wk2.adj)=c("wk2-arm0", "wk2-arm1", "difference in wk2")
rownames(result.arbidol.wk2.adj)=c("est", "ci-low", "ci-high", "p-value")

result.arbidol.wk1.adj=cbind(
  c(mu0[4],   mu0[4]+c(-1, 1)*1.96*sd(mu0.bt[,4]), NA),
  c(mu1[4],   mu1[4]+c(-1, 1)*1.96*sd(mu1.bt[,4]), NA),
  c(delta[4], delta[4]+c(-1,1)*1.96*sd(delta.bt[,4]),  1-pchisq(delta[4]^2/var(delta.bt[,4]),1))
)

colnames(result.arbidol.wk1.adj)=c("wk3-arm0", "wk3-arm1", "difference in wk3")
rownames(result.arbidol.wk1.adj)=c("est", "ci-low", "ci-high", "p-value")

kable(round(balance.table.arbidol,3))
mean0 sd0 mean1 sd1 p-value
age 58.665 15.109 59.588 14.844 0.566
sex 0.465 0.500 0.447 0.498 0.748
disease 0.535 0.500 0.508 0.501 0.668
SPO2 89.993 14.047 93.477 5.377 0.004
kable(round(result.arbidol.dth.unadj, 3))
mortality0 mortality1 difference in mortaltiy
est 0.297 0.095 0.201
ci-low 0.225 0.055 0.119
ci-high 0.369 0.136 0.284
p-value NA NA 0.000
kable(round(result.arbidol.dth.adj, 3))
mortality0 mortality1 difference in mortality
est 0.264 0.098 0.166
ci-low 0.199 0.056 0.089
ci-high 0.329 0.140 0.243
p-value NA NA 0.000
kable(round(cbind(result.arbidol.wk1.unadj, result.arbidol.wk2.unadj, result.arbidol.wk3.unadj), 3))
wk1-arm0 wk1-arm1 difference in wk1 wk2-arm0 wk2-arm1 difference in wk2 wk3-arm0 wk3-arm1 difference in wk3
est 0.194 NA NA 0.368 NA NA 0.142 NA NA
ci-low 0.131 NA NA 0.292 NA NA 0.087 NA NA
ci-high 0.256 NA NA 0.444 NA NA 0.197 NA NA
p-value NA NA NA NA NA NA NA NA NA
kable(round(cbind(result.arbidol.wk1.adj, result.arbidol.wk2.adj, result.arbidol.wk3.adj), 3))
wk3-arm0 wk3-arm1 difference in wk3 wk2-arm0 wk2-arm1 difference in wk2 wk1-arm0 wk1-arm1 difference in wk1
est NA NA NA NA NA NA NA NA NA
ci-low NA NA NA NA NA NA NA NA NA
ci-high NA NA NA NA NA NA NA NA NA
p-value NA NA NA NA NA NA NA NA NA

Compare Kaletra (NEEDS to be updated as above)

COmpare Tamiflu

Analysis for two drug combination (only use PS method

trttot=arbidol+10*kaletra
table(trttot)
## trttot
##   0   1  10  11 
##  60 115  95  84
### 0:   no medicine
### 1:   arbidol only
### 10:  kaletra only
### 11:  arbidol+kaletra
psfit=function(death, trttot, x0)
{

fit0=glm((trttot==0)~x0, family="binomial")
fit1=glm((trttot==1)~x0, family="binomial")
fit10=glm((trttot==10)~x0, family="binomial")
fit11=glm((trttot==11)~x0, family="binomial")

ps0=fit0$fitted.values
ps1=fit1$fitted.values
ps10=fit10$fitted.values
ps11=fit11$fitted.values

mu0=mean((trttot==0)/ps0*death)/mean((trttot==0)/ps0)
mu1=mean((trttot==1)/ps1*death)/mean((trttot==1)/ps1)
mu10=mean((trttot==10)/ps10*death)/mean((trttot==10)/ps10)
mu11=mean((trttot==11)/ps11*death)/mean((trttot==11)/ps11)

return(c(mu0, mu1, mu10, mu11))
}

muest=psfit(death, trttot, x0)
n=length(trttot)
B=1000
mubt=matrix(NA, B, 4)
for(b in 1:B)
{ set.seed(b)
  id=sample(n, n, T)
  mubt[b,]=psfit(death[id], trttot[id], x0[id,])
}

result=cbind(muest, muest-1.96*apply(mubt,2,sd), muest+1.96*apply(mubt,2, sd))

colnames(result)=c("est", "ci-low", "ci-high")
rownames(result)=c("none", "arbidol only ", "kaletra only", "arbidol+kaletra")

kable(round(result,3))
est ci-low ci-high
none 0.280 0.183 0.377
arbidol only 0.097 0.038 0.157
kaletra only 0.240 0.158 0.322
arbidol+kaletra 0.085 0.032 0.138

May not have enough sample size for three drug combinations

trttot=arbidol+10*kaletra+100*tamiflu
table(trttot)
## trttot
##   0   1  10  11 100 101 110 111 
##  58  96  65  71   2  19  30  13
fit0=glm((trttot==0)~x0, family="binomial")
fit1=glm((trttot==1)~x0, family="binomial")
fit10=glm((trttot==10)~x0, family="binomial")
fit11=glm((trttot==11)~x0, family="binomial")
fit110=glm((trttot==110)~x0, family="binomial")
fit111=glm((trttot==111)~x0, family="binomial")

ps0=fit0$fitted.values
ps1=fit1$fitted.values
ps10=fit10$fitted.values
ps11=fit11$fitted.values
ps110=fit110$fitted.values
ps111=fit111$fitted.values

mu0=mean((trttot==0)/ps0*death)
mu1=mean((trttot==1)/ps1*death)
mu10=mean((trttot==10)/ps10*death)
mu11=mean((trttot==11)/ps11*death)
mu110=mean((trttot==110)/ps110*death)
mu111=mean((trttot==111)/ps111*death)

### 0:   no medicine
### 1:   arbidol only
### 10:  kaletra only
### 11:  arbidol+kaletra
### 110: kaletra+tamiflu
### 111: arbidol+kaletra+tamiflu