April 10, 2020

Hydroxychloroquine

  • Anti-malaria drug (not antiviral)
  • Related to chloroquine (but not identical)
  • Shown to be effective against SARS-CoV activity in vitro Wang M et al, 2020 Biot C et al, 2006
  • Early human studies have suggested that it might be effective against COVID-19 (China, France)

The Study

Figure 1

Figure 1. Percentage of patients with PCR-positive nasopharyngeal samples from inclusion to day6 post-inclusion in COVID-19 patients treated with hydroxychloroquine and in COVID-19 control patients.

Data

raw.dat = read.csv("chloroquine.csv")
head(raw.dat)
##   Patient Age Sex ClinicalStatus TimeBeforeInclusion Hydroxychloroquine
## 1       1  10   M   Asymptomatic                  NA                 No
## 2       2  12   F   Asymptomatic                  NA                 No
## 3       3  14   F   Asymptomatic                  NA                 No
## 4       4  10   M   Asymptomatic                  NA                 No
## 5       5  20   M           URTI                   4                 No
## 6       6  65   F           URTI                   2                 No
##   Concentration ConcentrationTime Azithromycin  D0  D1  D2  D3  D4  D5  D6
## 1            NA                             No  31 NEG NEG NEG NEG NEG NEG
## 2            NA                             No  26  ND  33  34 NEG  34 NEG
## 3            NA                             No  26  31  23  22  27 NEG  26
## 4            NA                             No  24 NEG  33  33 NEG NEG  32
## 5            NA                             No  24  24  24  27 NEG  31  29
## 6            NA                             No POS  ND POS  ND POS  ND POS

PCR

  • PCR = polymerise chain reaction test for COVID-19
  • Directly test for the presence of COVID-19 antigen (as opposed to testing for the bodies immune response)
  • False negatives can occur up to 30% of the time
  • Given as CT values (the number of cycles after which a PCR becomes positive, the lower the number, the more virus is present)
  • NEG if \(\geq 35\)
  • Measured at days 0-6 (D0, D1, D2, D3, D4, D5, D6)
raw.dat$D0
##  [1] 31  26  26  24  24  POS 28  POS POS POS POS ND  POS POS ND  POS 30  29  23 
## [20] 30  34  28  22  17  22  27  34  19  25  15  28  23  30  27  24  29 
## Levels: 15 17 19 22 23 24 25 26 27 28 29 30 31 34 ND POS

Cleaning PCR

raw.dat$D0
##  [1] 31  26  26  24  24  POS 28  POS POS POS POS ND  POS POS ND  POS 30  29  23 
## [20] 30  34  28  22  17  22  27  34  19  25  15  28  23  30  27  24  29 
## Levels: 15 17 19 22 23 24 25 26 27 28 29 30 31 34 ND POS
cleaned.dat = raw.dat
for (j in 10:16) {
  cleaned.dat[,j][raw.dat[,j]=="ND"] = NA
  cleaned.dat[,j][as.numeric(as.character(raw.dat[,j]))<35] = "POS"
  cleaned.dat[,j][as.numeric(as.character(raw.dat[,j]))>=35] = "NEG"
}
cleaned.dat = droplevels(cleaned.dat)
cleaned.dat$D0
##  [1] POS  POS  POS  POS  POS  POS  POS  POS  POS  POS  POS  <NA> POS  POS  <NA>
## [16] POS  POS  POS  POS  POS  POS  POS  POS  POS  POS  POS  POS  POS  POS  POS 
## [31] POS  POS  POS  POS  POS  POS 
## Levels: POS

What should we do next with the data?

  • Remove outcomes!
names(cleaned.dat)
##  [1] "Patient"             "Age"                 "Sex"                
##  [4] "ClinicalStatus"      "TimeBeforeInclusion" "Hydroxychloroquine" 
##  [7] "Concentration"       "ConcentrationTime"   "Azithromycin"       
## [10] "D0"                  "D1"                  "D2"                 
## [13] "D3"                  "D4"                  "D5"                 
## [16] "D6"
dat = cleaned.dat[,-c(11:16)]
names(dat)
##  [1] "Patient"             "Age"                 "Sex"                
##  [4] "ClinicalStatus"      "TimeBeforeInclusion" "Hydroxychloroquine" 
##  [7] "Concentration"       "ConcentrationTime"   "Azithromycin"       
## [10] "D0"

Making Treatment 0/1

library("tidyverse")
dat = dat %>%
  mutate(Hydroxychloroquine = recode(Hydroxychloroquine, "Yes"= 1, "No"=0))

What do we want to know about treatment???

Assignment Mechanism

“French Confirmed COVID-19 patients were included in a single arm protocol from early March to March 16th, to receive 600mg of hydroxychloroquine daily and their viral load in nasopharyngeal swabs was tested daily in a hospital setting. Depending on their clinical presentation, azithromycin was added to the treatment. Untreated patients from another center and cases refusing the protocol were included as negative controls.”

“Patients who were proposed a treatment with hydroxychloroquine were recruited and managed in Marseille centre. Controls without hydroxychloroquine treatment were recruited in Marseille, Nice, Avignon and Briançon centers, all located in South France.”

=> Give up?

Covariates

names(dat)
##  [1] "Patient"             "Age"                 "Sex"                
##  [4] "ClinicalStatus"      "TimeBeforeInclusion" "Hydroxychloroquine" 
##  [7] "Concentration"       "ConcentrationTime"   "Azithromycin"       
## [10] "D0"
  • Age
  • Sex
  • ClinicalStatus
  • TimeBeforeInclusion
  • D0

Unconfounded???

Age

boxplot(dat$Age~dat$Hydroxychloroquine)

Sex

table(dat$Hydroxychloroquine, dat$Sex)
##    
##      F  M
##   0 10  6
##   1 11  9

Time Before Inclusion

boxplot(dat$TimeBeforeInclusion~dat$Hydroxychloroquine)

Clinical Presentation

table(dat$Hydroxychloroquine, dat$ClinicalStatus)
##    
##     Asymptomatic LRTI URTI
##   0            4    2   10
##   1            2    6   12
  • URTI = Upper Respiratory Tract Infection
  • LRTI = Lower Respiratory Tract Infection (Pneumonia confirmed in all)
  • Again imbalanced, but again in favor of control

Binary for Balance Assessment

source("/Users/Kari/OneDrive - The Pennsylvania State University/Teaching/Causal/CausalFunctions.R")
dat = cbind(dat, dummies(dat$ClinicalStatus))

Day 0

All positive at baseline:

table(dat$Hydroxychloroquine, dat$D0)
##    
##     POS
##   0  14
##   1  20

Day 0: Numeric Values Only

table(raw.dat$Hydroxychloroquine, !(raw.dat$D0 == "POS" | raw.dat$D0 == "ND"))
##      
##       FALSE TRUE
##   No     10    6
##   Yes     0   20

Day 0: Numeric Values Only

boxplot(as.numeric(as.character(raw.dat$D0))~raw.dat$Hydroxychloroquine)
## Warning in eval(predvars, data, env): NAs introduced by coercion

Love Plot

covs = c("Age", "Sex", "TimeBeforeInclusion", "Asymptomatic", "URTI","LRTI")
x = select(dat, one_of(covs))
cov.balance(x, dat$Hydroxychloroquine)

Error in plot.window(…) : need finite ‘xlim’ values

table(dat$Sex)
## 
##  F  M 
## 21 15
dat = mutate(dat, Female = recode(Sex, "F" = 1, "M" = 0))

Love Plot

covs = c("Age", "Female", "TimeBeforeInclusion", "Asymptomatic", "URTI","LRTI")
x = select(dat, one_of(covs))
cov.balance(x, dat$Hydroxychloroquine, left.mar = 1.8)

Covariate Balance

  • Relatively good balance on observed covariates
  • Propensity score methods won’t change the results much
  • What’s the real problem here?
  • The problem is the unobserved covariates

Assignment Mechanism

“French Confirmed COVID-19 patients were included in a single arm protocol from early March to March 16th, to receive 600mg of hydroxychloroquine daily and their viral load in nasopharyngeal swabs was tested daily in a hospital setting. Depending on their clinical presentation, azithromycin was added to the treatment. Untreated patients from another center and cases refusing the protocol were included as negative controls.”

“Patients who were proposed a treatment with hydroxychloroquine were recruited and managed in Marseille centre. Controls without hydroxychloroquine treatment were recruited in Marseille, Nice, Avignon and Briançon centers, all located in South France.”

Unobserved Covariates

  • Treatment groups drawn from different locations
  • Different types of people
  • Different types of care
  • What’s different about people who refused the protocol?
  • Absolutely no way to balance these aspects!
  • IMPORTANT: Propensity score methods can only correct for imbalance on observed covariates.

Propensity Score

  • TimeBeforeInclusion is based on onset of symptoms - missing for asymptomatic individuals.
  • It’s well-balanced anyway, so exclude from propensity score model.)
ps.model = glm(Hydroxychloroquine~Age+Female+Asymptomatic+URTI, data = dat, family=binomial(link = "logit"))
summary(ps.model)$coefficients
##                 Estimate Std. Error    z value  Pr(>|z|)
## (Intercept)  -0.50966473  1.4482756 -0.3519114 0.7249047
## Age           0.03336289  0.0214164  1.5578195 0.1192760
## Female       -0.82264302  0.8115238 -1.0137017 0.3107251
## Asymptomatic -0.74480711  1.3941319 -0.5342444 0.5931725
## URTI         -0.23357741  1.0291615 -0.2269589 0.8204557

Estimated Propensity Scores

lps = predict(ps.model)
plot.ps(lps, dat$Hydroxychloroquine)

Overlap

overlap(lps, dat$Hydroxychloroquine)
## [1] "6 controls below any treated"
## [1] "0 treated above any controls"
table(dat$Hydroxychloroquine)
## 
##  0  1 
## 16 20
  • Should we trim???

Trimmed Sample

trim = lps<min(lps[dat$Hydroxychloroquine==1]) | lps > max(lps[dat$Hydroxychloroquine==0])
trimmed.units = dat$Patient[trim]
trimmed.dat = dat[!trim,]
ps.model = glm(Hydroxychloroquine~Age+Female+Asymptomatic+URTI, data = trimmed.dat, family=binomial(link = "logit"))
lps = predict(ps.model)
overlap(lps, trimmed.dat$Hydroxychloroquine)
## [1] "0 controls below any treated"
## [1] "2 treated above any controls"
kept = rep(TRUE, dim(dat)[1])
kept[trimmed.units] = FALSE

Trimmed Sample: Repeat

trim = lps<min(lps[trimmed.dat$Hydroxychloroquine==1]) | lps > max(lps[trimmed.dat$Hydroxychloroquine==0])
trimmed.units = c(trimmed.units, trimmed.dat$Patient[trim])
trimmed.dat = trimmed.dat[!trim,]
ps.model = glm(Hydroxychloroquine~Age+Female+Asymptomatic+URTI, data = trimmed.dat, family=binomial(link = "logit"))
lps = predict(ps.model)
overlap(lps, trimmed.dat$Hydroxychloroquine)
## [1] "0 controls below any treated"
## [1] "0 treated above any controls"
kept = rep(TRUE, dim(dat)[1])
kept[trimmed.units] = FALSE

Who did we drop?

dat[!kept,1:5]
##    Patient Age Sex ClinicalStatus TimeBeforeInclusion
## 1        1  10   M   Asymptomatic                  NA
## 2        2  12   F   Asymptomatic                  NA
## 3        3  14   F   Asymptomatic                  NA
## 4        4  10   M   Asymptomatic                  NA
## 12      12  23   F           URTI                   5
## 16      16  23   F           URTI                   6
## 18      18  54   M   Asymptomatic                  NA
## 20      20  59   F   Asymptomatic                  NA
  • All the asymptomatic individuals (and 2 others)
  • Easier to explain: just drop asymptomatic individuals?

Propensity Scores after Trimming

plot.ps(lps, trimmed.dat$Hydroxychloroquine)

Covariate Balance after Trimming

covs = c("Age", "Female", "TimeBeforeInclusion", "URTI","LRTI")
x = select(dat, one_of(covs))
x.trimmed = select(trimmed.dat, one_of(covs))
cov.balance(x, dat$Hydroxychloroquine, new.x = x[kept,], new.w = trimmed.dat$Hydroxychloroquine, left.mar = 1.8)

Subclassification

  • How many subclasses?
table(trimmed.dat$Hydroxychloroquine)
## 
##  0  1 
## 10 18

Subclassification

breaks = quantile(lps, .5)
breaks
##       50% 
## 0.4671619
subclass = subclasses(lps, breaks = breaks)
subclass
##  [1] 2 1 2 2 1 1 1 1 2 1 1 2 1 2 2 2 1 1 1 1 1 2 2 1 2 2 2 2

Subclassification

plot.ps(lps, trimmed.dat$Hydroxychloroquine, breaks = breaks)

Covariate Balance

cov.balance(x=x.trimmed, w=trimmed.dat$Hydroxychloroquine, subclass=subclass, left.mar = 1.8)

Subclass Balance

library(knitr)
kable(round(subclass.balance(x.trimmed, trimmed.dat$Hydroxychloroquine, subclass = subclass),2))
Age Female TimeBeforeInclusion URTI LRTI
Diff Means (no subclasses) 0.01 -0.04 0.56 -0.13 0.13
Diff Means (subclasses) 2.42 0.06 0.70 -0.05 0.05
Subclass 1 -5.92 -0.38 -0.12 0.00 0.00
Subclass 2 10.75 0.50 1.53 -0.10 0.10

Trimmed Units Back

ps.model = glm(Hydroxychloroquine~Age+Female+Asymptomatic+URTI, data = dat, family=binomial(link = "logit"))
lps = predict(ps.model)

Subclassification

  • How many subclasses?
table(dat$Hydroxychloroquine)
## 
##  0  1 
## 16 20
breaks = quantile(lps, c(.33, .67))
breaks
##        33%        67% 
## -0.0858544  0.5964168
subclass = subclasses(lps, breaks = breaks)
subclass
##  [1] 1 1 1 1 2 3 3 3 2 3 3 1 2 1 1 1 1 2 2 1 2 1 3 3 2 3 2 1 3 2 2 3 2 2 3 3

Subclassification

plot.ps(lps, dat$Hydroxychloroquine, breaks = breaks)

Covariate Balance

covs = c("Age", "Female", "TimeBeforeInclusion", "LRTI","URTI","Asymptomatic")
x = select(dat, one_of(covs))
cov.balance(x=x, w=dat$Hydroxychloroquine, subclass=subclass, left.mar = 1.8)

Subclass Balance

diff.means.results = as.data.frame(matrix(NA, nrow=3, ncol=length(covs)))
names(diff.means.results) = covs
row.names(diff.means.results) = c("Raw", "Subclassification (after trimming)", "Subclassification (no trimming)")
diff.means.results[1,] = round(subclass.balance(x, dat$Hydroxychloroquine, subclass = subclass),2)[1,]
diff.means.results[2,1:5]= round(subclass.balance(x.trimmed, trimmed.dat$Hydroxychloroquine, subclass = subclass),2)[2,]
diff.means.results[3,] = round(subclass.balance(x, dat$Hydroxychloroquine, subclass = subclass),2)[2,]

kable(diff.means.results)
Age Female TimeBeforeInclusion LRTI URTI Asymptomatic
Raw 13.83 -0.07 0.16 0.18 -0.03 -0.15
Subclassification (after trimming) 1.43 -0.04 0.50 -0.20 0.20 NA
Subclassification (no trimming) 8.94 -0.01 -0.05 0.13 -0.08 -0.05

Outcome Data

“The primary endpoint was virological clearance at day-6 post-inclusion.”

y = rep(NA, dim(dat)[1])
y[cleaned.dat$D6=="POS"] = 1
y[cleaned.dat$D6=="NEG"] = 0
w = dat$Hydroxychloroquine

Raw Data

prop.table(table(dat$Hydroxychloroquine, y),1)
##    y
##             0         1
##   0 0.1818182 0.8181818
##   1 0.6842105 0.3157895
  • 32% tested positive after 6 days of treatment
  • 82% tested positive after 6 days of no treatment
  • Estimated treatment effect (difference in proportions): -0.5

After Subclassification

subclass.average(y, dat$Hydroxychloroquine, subclass = subclass)
## $`Difference in Means within Each Subclass`
## [1]  0.0000000 -0.6666667 -0.8333333
## 
## $`Weighted Average Difference in Means`
##      [,1]
## [1,] -0.5
  • Exact same overall result.
  • (Not surprising - balance on observed covariates was pretty good to begin with)
  • With larger samples we might read into the differences across subclasses (treatment effect better for those most likely to be treated), but within subclasses samples too small to say much of anything here

Variance

subclass.var(y, dat$Hydroxychloroquine, subclass = subclass)
## $`Variance within Each Subclass`
## [1] 0.12500000 0.02777778 0.02380952
## 
## $`Overall Variance`
##            [,1]
## [1,] 0.01962081
## 
## $`Overall SE`
##           [,1]
## [1,] 0.1400743

Problems

  • Imbalance on observed covariates was not the problem with this study.
  • THIS IS ALL PROPENSITY SCORE METHODS ARE ABLE TO FIX
  • What are the problems?

Problem 1: Unobserved Covariates

We have absolutely no way of knowing whether the observed differences are due to…

  • the treatment
  • the fact that people who come to Marseille centre may differ at baseline from people who come to other centres in the south of France
  • the fact that the level of care may be different at Marseille center than the other centres
  • the fact that people who refused the protocol were lumped into the control group
  • something else…

Problem 2: Attrition

sum(is.na(y))
## [1] 6
table(is.na(y), dat$Hydroxychloroquine)
##        
##          0  1
##   FALSE 11 19
##   TRUE   5  1

Problem 2: Attrition

  • In the paper, they looked at the number of negative test results, lumping “not determined” with the positive results!
  • This certainly biases their results against the control group!!

Problem 2: Attrition

The units with “not determined” PCR at Day 6:

cleaned.dat[is.na(y),c(10:16)]
##      D0   D1   D2   D3   D4   D5   D6
## 11  POS <NA>  POS <NA>  POS <NA> <NA>
## 12 <NA> <NA>  POS <NA>  POS <NA> <NA>
## 14  POS <NA>  POS <NA> <NA>  POS <NA>
## 15 <NA> <NA> <NA>  POS <NA>  POS <NA>
## 16  POS <NA> <NA> <NA> <NA>  POS <NA>
## 29  POS <NA>  NEG  NEG  NEG <NA> <NA>

Problem 2: Attrition

  • Missing at random?
  • How to deal with a variable that’s part numeric and part factor in imputation???
dat = raw.dat
for (j in 10:16) dat[,j][dat[,j]=="ND"] = NA
dat = droplevels(dat)
M = 5
imp = mice(dat, m = M)
imp.dat = vector("list", M)
for (m in 1:M) imp.dat[[m]] = complete(imp, action = m)
save(imp.dat, file="imp.rData")
M=5
load("imp.rData")

Problem 2: Attrition

library(mice)
for (m in 1:5) {
  imp.dat[[m]]$D6[as.numeric(as.character(imp.dat[[m]]$D6))<35] = "POS"
  imp.dat[[m]]$D6[as.numeric(as.character(imp.dat[[m]]$D6))>=35] = "NEG"
}
ests = rep(NA,m)
for (m in 1:M) ests[m] = mean(imp.dat[[m]]$D6[imp.dat[[m]]$Hydroxychloroquine=="Yes"]=="POS")-mean(imp.dat[[m]]$D6[imp.dat[[m]]$Hydroxychloroquine=="No"]=="POS")
ests
## [1] -0.575 -0.575 -0.575 -0.525 -0.575
mean(ests)
## [1] -0.565

Problem 2: Attrition

Imputing after dichotomizing PCR results:

dat = cleaned.dat
imp = mice(dat, m = M)
imp.dat = vector("list", M)
for (m in 1:M) imp.dat[[m]] = complete(imp, action = m)
for (m in 1:M) ests[m] = mean(imp.dat[[m]]$D6[imp.dat[[m]]$Hydroxychloroquine=="Yes"]=="POS")-mean(imp.dat[[m]]$D6[imp.dat[[m]]$Hydroxychloroquine=="No"]=="POS")
ests
## [1] -0.575 -0.450 -0.575 -0.450 -0.575
mean(ests)
## [1] -0.525

Problem 2: Attrition

  • We can only impute the missing outcomes for the people that remained in the study but had “ND” PCR tests.

  • However, 6 other units attrited, whom we have no data for.

  • Nothing we can do about them analytically
  • But we should investigate reasons for attrition

Problem 2: Attrition

“Six hydroxychloroquine-treated patients were lost in follow-up during the survey because of early cessation of treatment. Reasons are as follows: three patients were transferred to intensive care unit, including one transferred on day2 post-inclusion who was PCR-positive on day1, one transferred on day3 post-inclusion who was PCR-positive on days1-2 and one transferred on day4 post-inclusion who was PCR-positive on day1 and day3; one patient died on day3 post inclusion and was PCR-negative on day2; one patient decided to leave the hospital on day3 post-inclusion and was PCR-negative on days1-2; finally, one patient stopped the treatment on day3 post-inclusion because of nausea and was PCR-positive on days1-2-3. The results presented here are therefore those of 36 patients (20 hydroxychloroquine-treated patients and 16 control patients). None of the control patients was lost in follow-up.”

THIS IS A HUGE PROBLEM!!!

Problem 3: Azithromycin

  • Azithromycin is an antibiotic

  • “Depending on their clinical presentation, azithromycin was added to the treatment.”

table(dat$Hydroxychloroquine, dat$Azithromycin)
##      
##       No Yes
##   No  16   0
##   Yes 14   6
  • Is the effect due to hydroxychloroquine or azithromycin??

Problem 3: Azithromycin

  • We can look at the units who received only hydroxychloroquine, but this is injecting certain bias, because patients only received this as needed (probably the sickest patients)
prop.table(table(dat$Hydroxychloroquine[dat$Azithromycin=="No"], y[dat$Azithromycin=="No"]),1)
##      
##               0         1
##   No  0.1818182 0.8181818
##   Yes 0.5384615 0.4615385
  • Estimated treatment effect: -0.36

Problem 3: Azithromycin

Excluding those who received Azithromycin:

prop.test(table(dat$Hydroxychloroquine[dat$Azithromycin=="No"], y[dat$Azithromycin=="No"]))
## Warning in prop.test(table(dat$Hydroxychloroquine[dat$Azithromycin == "No"], :
## Chi-squared approximation may be incorrect
## 
##  2-sample test for equality of proportions with continuity correction
## 
## data:  table(dat$Hydroxychloroquine[dat$Azithromycin == "No"], y[dat$Azithromycin ==     "No"])
## X-squared = 1.8909, df = 1, p-value = 0.1691
## alternative hypothesis: two.sided
## 95 percent confidence interval:
##  -0.79466068  0.08137397
## sample estimates:
##    prop 1    prop 2 
## 0.1818182 0.5384615

Problem: Units Excluding

We are now excluding the sickest units from the treatment group for several reasons:

  • got transferred to ICU
  • died
  • needed antibiotics

It’s not surprising that those left are healthier!

Problem 4: Sloppy Work

“Hospitalized patients with confirmed COVID-19 were included in this study if they fulfilled two primary criteria: i) age >12 years; ii) PCR documented SARS-CoV-2 carriage in nasopharyngeal sample at admission whatever their clinical status.”

min(dat$Age)
## [1] 10
dat$D0
##  [1] POS  POS  POS  POS  POS  POS  POS  POS  POS  POS  POS  <NA> POS  POS  <NA>
## [16] POS  POS  POS  POS  POS  POS  POS  POS  POS  POS  POS  POS  POS  POS  POS 
## [31] POS  POS  POS  POS  POS  POS 
## Levels: POS

Other Problems and Blog Post

  • Remaining problems are pointed out in Bik, E. (2020).
  • Highly recommend reading!
  • Highlights many potential problem invalidating any causal conclusions.
  • Great points to consider for causal inference in general.
  • Bottom links to other posts

Problem 5: Breach of Protocol

“In the EU Clinical Trial Register page, the study was described as evaluating PCR data on Day 1, Day 4, Day 7 and Day 14. However, the study show the data for Day 6, which is different than planned. Why did the authors not show the results on Day 7? Did the data on day 7 not look as good?”

Problem 5: Breach of Protocol

“Assuming a 50% efficacy of hydroxychloroquine in reducing the viral load at day 7, a 85% power, a type I error rate of 5% and 10% loss to follow-up, we calculated that a total of 48 COVID-19 patients (ie, 24 cases in the hydroxychloroquine group and 24 in the control group) would be required for the analysis (Fleiss with CC).”

table(dat$Hydroxychloroquine)
## 
##  No Yes 
##  16  20

Even with the 6 missing, that still only brings us up to 42…

“Statistics” section

“Assuming a 50% efficacy of hydroxychloroquine in reducing the viral load at day 7, a 85% power, a type I error rate of 5% and 10% loss to follow-up, we calculated that a total of 48 COVID-19 patients (ie, 24 cases in the hydroxychloroquine group and 24 in the control group) would be required for the analysis (Fleiss with CC). Statistical differences were evaluated by Pearson’s chi-square or Fisher’s exact tests as categorical variables, as appropriate. Means of quantitative data were compared using Student’s t-test. Analyses were performed in Stata version 14.2.”

Twitter Thread

Bayesian Reanalysis of Gautret Data

Reply to Gautret et al. 2020: A Bayesian reanalysis of the effects of hydroxychloroquine and azithromycin on viral carriage in patients with COVID-19

“Here we apply Bayesian statistics to assess the robustness of the original papers claims by testing four variants of the data: 1) The original data; 2) Data including patients who deteriorated; 3) Data including patients who deteriorated with exclusion of untested patients in the comparison group; 4) Data that includes patients who deteriorated with the assumption that untested patients were negative. To ask if HCQ monotherapy is effective, we performed an A/B test for a model which assumes a positive effect, compared to a model of no effect. We find that the statistical evidence is highly sensitive to these data variants. Statistical evidence for the positive effect model ranged from strong for the original data (BF ~11), to moderate when including patients who deteriorated (BF ~4.35), to anecdotal when excluding untested patients (BF ~2), and to anecdotal negative evidence if untested patients were assumed positive (BF ~0.6).”

More Information

China Randomized Trial

Paris Observational Study

  • Study in Paris
  • Peer-reviewed
  • \(n = 11\)
  • no treatment effect
  • 8 of the 11 had significant comorbidities
  • One died, 8/10 still positive after days 5/6
  • One had to discontinue treatment because of QT prolongation…

NYU

Mouse Data

US Administration