Kapitel 27 Heiler vs. Placebo

Wer heilt mehr Patientinnen und Patienten? Der Heiler oder das Placebo?

In diesem Kapitel schauen wir uns nocheinmal eine Situation an, in der es in Wahrheit keinen Unterschied zwischen den Interventionen gibt.

Wir stellen uns vor, dass ein “Heiler” (ehrlich gesagt, ein Scharlatan) die Hälfte der Kranken behandelt und die andere Hälfte der Kranken mit einem Placebo behandelt wird.

Placebo: “Ein Placebo oder Scheinmedikament ist ein Arzneimittel, das meist keinen Arzneistoff enthält und somit auch keine pharmakologische Wirkung hat, die dadurch verursacht werden könnte. Im erweiterten Sinn werden auch andere Heilmittel als Placebos bezeichnet, beispielsweise „Scheinoperationen“.”

Wer mehr zum Thema Placobo lesen möchte, findet hier ein Buch Link

Obschon Placebo Erleichterung schaffen kann, heilt Placebo nicht. Die Forschung hat zwar objektive neurobiologische Mechanismen aufzeigen können, doch diese wirken nur auf die Symptome und nicht therapeutisch auf die Krankheit. Dies sagt nicht euer Lehrer, sondern ein internationl anerkannter Experte in Placebo-Forschung: Link

In dieser Studie werden 100 kranke Studienteilnehmende auf den Heiler und das Placebo randomisiert.

Nach der Behandlung wird dokumentiert, wer trotz Behandlung gestorben ist.

27.1 Randomisation

library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(randomizr)
id<-1:100
df<-data.frame(id)
df<-df %>%  
  mutate(randomisation=complete_ra(N = 100, prob_each = c(.5, .5),
               conditions=c("Heiler", "Placebo")))
summarytools::freq(df$randomisation)
## Frequencies  
## df$randomisation  
## Type: Factor  
## 
##                 Freq   % Valid   % Valid Cum.   % Total   % Total Cum.
## ------------- ------ --------- -------------- --------- --------------
##        Heiler     50     50.00          50.00     50.00          50.00
##       Placebo     50     50.00         100.00     50.00         100.00
##          <NA>      0                               0.00         100.00
##         Total    100    100.00         100.00    100.00         100.00

27.2 Behandlung

set.seed(1234458)
df<-df %>% 
  mutate(gestorben=case_when(
    randomisation=="Heiler"~sample(c("Geheilt", "Gestorben"), length(id), prob=c(0.7, 0.3), replace=TRUE),
    randomisation=="Placebo"~sample(c("Geheilt", "Gestorben"), length(id), prob=c(0.7, 0.3), replace=TRUE)))

27.3 Wir präsentieren die Resultate

Wir können einerseits das Packet pubh benutzen:

library(pubh)
df %>%
  mutate(
    gestorben = relevel(factor(gestorben), ref = "Gestorben")
  ) %>%
  cross_tab( randomisation~gestorben) %>%
  theme_pubh()
## Warning: 'cross_tab' is deprecated.
## Use 'cross_tbl' instead.
## See help("Deprecated")
## Warning in rbind(deparse.level, ...): number of columns of result, 5, is not a
## multiple of vector length 6 of arg 1
Table 22.1:
randomisation
HeilerPlaceboTotal
(N=50)(N=50)(N=100)
gestorben
- Gestorben10 (20.0%)13 (26.0%)23 (23.0%)
- Geheilt 40 (80.0%)37 (74.0%)77 (77.0%)

Oder wir benutzen den Befehl ctable vom summarytools Packet:

summarytools::ctable(df$randomisation, df$gestorben)
## Cross-Tabulation, Row Proportions  
## randomisation * gestorben  
## Data Frame: df  
## 
## --------------- ----------- ------------ ------------ --------------
##                   gestorben      Geheilt    Gestorben          Total
##   randomisation                                                     
##          Heiler               40 (80.0%)   10 (20.0%)    50 (100.0%)
##         Placebo               37 (74.0%)   13 (26.0%)    50 (100.0%)
##           Total               77 (77.0%)   23 (23.0%)   100 (100.0%)
## --------------- ----------- ------------ ------------ --------------
df %>%
  contingency(gestorben ~ randomisation, method="case.control") 
##          Outcome
## Predictor Gestorben Geheilt
##   Placebo        13      37
##   Heiler         10      40
## 
##              Outcome +    Outcome -      Total        Prevalence *        Odds
## Exposed +           13           37         50                  26       0.351
## Exposed -           10           40         50                  20       0.250
## Total               23           77        100                  23       0.299
## 
## Point estimates and 95% CIs:
## -------------------------------------------------------------------
## Odds ratio                                     1.41 (0.55, 3.59)
## Attrib fraction (est) in the exposed (%)      28.60 (-100.77, 75.27)
## Attrib fraction (est) in the population (%)   16.30 (-39.81, 49.90)
## -------------------------------------------------------------------
## Uncorrected chi2 test that OR = 1: chi2(1) = 0.508 Pr>chi2 = 0.476
## Fisher exact test that OR = 1: Pr>chi2 = 0.635
##  Wald confidence limits
##  CI: confidence interval
##  * Outcomes per 100 population units 
## 
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  dat
## X-squared = 0.22586, df = 1, p-value = 0.6346

Wir können auch das den Befehl epitab vom epitools Packet benutzen.

epitools::epitab(df$randomisation, df$gestorben, method="riskratio", riskratio="boot")
## $tab
##          Outcome
## Predictor Geheilt   p0 Gestorben   p1 riskratio     lower upper   p.value
##   Heiler       40 0.80        10 0.20       1.0        NA    NA        NA
##   Placebo      37 0.74        13 0.26       1.3 0.6153846     3 0.6352559
## 
## $measure
## [1] "boot"
## 
## $conf.level
## [1] 0.95
## 
## $pvalue
## [1] "fisher.exact"

Oder wir können auch das Risiko oder die Odds der einzelnen Interventionen selber berechnen.

Intervention=c("Outcome","Intervention", "Heiler", "Placebo", "Statistik1", "Statistik2", "Statistik3")
table<-data.frame(Intervention)

table<-table %>% 
  mutate(Gestorben_N=case_when(
    Intervention=="Heiler"~sum(df$gestorben[df$randomisation=="Heiler"]=="Gestorben"), 
    Intervention=="Placebo"~sum(df$gestorben[df$randomisation=="Placebo"]=="Gestorben"))) %>% 
  mutate(Gestorben_Prob=case_when(
     Intervention=="Heiler"~sum(df$gestorben[df$randomisation=="Heiler"]=="Gestorben")/length(df$gestorben[df$randomisation=="Heiler"]), 
    Intervention=="Placebo"~sum(df$gestorben[df$randomisation=="Placebo"]=="Gestorben")/length(df$gestorben[df$randomisation=="Placebo"]))) %>% 
  mutate(Geheilt_N=case_when(
    Intervention=="Heiler"~sum(df$gestorben[df$randomisation=="Heiler"]=="Geheilt"), 
    Intervention=="Placebo"~sum(df$gestorben[df$randomisation=="Placebo"]=="Geheilt"))) %>% 
  mutate(Geheilt_Prob=case_when(
     Intervention=="Heiler"~sum(df$gestorben[df$randomisation=="Heiler"]=="Geheilt")/length(df$gestorben[df$randomisation=="Heiler"]), 
    Intervention=="Placebo"~sum(df$gestorben[df$randomisation=="Placebo"]=="Geheilt")/length(df$gestorben[df$randomisation=="Placebo"]))) %>% 
  mutate(Risk=case_when(
    Intervention=="Outcome"~"Risk zu sterben", 
    Intervention=="Heiler"~paste(Gestorben_Prob), 
    Intervention=="Placebo"~paste(Gestorben_Prob), 
    Intervention=="Statistik1"~paste("Risk Ratio zu Sterben für mit Placebo Behandelte im Vergleich zu vom Heiler Behandelte: ", round(lag(Gestorben_Prob, n=1L)/lag(Gestorben_Prob, n=2L),2 )), 
    Intervention=="Statistik2"~paste("Risk Ratio zu Sterben für vom Heiler Behandelte im Vergleich zu mit Placebo Behandelte: ", round(lag(Gestorben_Prob, n=3L)/lag(Gestorben_Prob, n=2L),2 )))) %>% 
    mutate(Odds=case_when(
    Intervention=="Outcome"~"Odds zu sterben", 
    Intervention=="Heiler"~paste(round(Gestorben_N/Geheilt_N),2), 
    Intervention=="Placebo"~paste(round(Gestorben_N/Geheilt_N),2), 
    Intervention=="Statistik1"~paste("Odds Ratio zu Sterben für mit Placebo Behandelte im Vergleich zu vom Heiler Behandelte: ", round(lag((Gestorben_N/Geheilt_N), n=1L)/lag((Gestorben_N/Geheilt_N), n=2L),2 )), 
    Intervention=="Statistik2"~paste("Odds Ratio zu Sterben für vom Heiler Behandelte im Vergleich zu mit Placebo Behandelte: ", round(lag((Gestorben_N/Geheilt_N), n=3L)/lag((Gestorben_N/Geheilt_N), n=2L),2 )))) %>% 
      mutate(ARR=case_when(
    Intervention=="Outcome"~"Absolute Risiko-Reduktion", 
    Intervention=="Heiler"~paste(Gestorben_Prob), 
    Intervention=="Placebo"~paste(Gestorben_Prob), 
    Intervention=="Statistik3"~paste("Die absolute Risiko-Reduktion zu sterben, wenn man vom Heiler anstatt mit Placebo behandelt wird, ist: ", lag(Gestorben_Prob, n=3L)-lag(Gestorben_Prob, n=4L), "oder ",(lag(Gestorben_Prob, n=3L)-lag(Gestorben_Prob, n=4L)) *100,"%" ))) %>% 
  mutate_if(is.numeric, as.character)

table[is.na(table)] <- ""  

knitr::kable(table)
Intervention Gestorben_N Gestorben_Prob Geheilt_N Geheilt_Prob Risk Odds ARR
Outcome Risk zu sterben Odds zu sterben Absolute Risiko-Reduktion
Intervention
Heiler 10 0.2 40 0.8 0.2 0 2 0.2
Placebo 13 0.26 37 0.74 0.26 0 2 0.26
Statistik1 Risk Ratio zu Sterben für mit Placebo Behandelte im Vergleich zu vom Heiler Behandelte: 1.3 Odds Ratio zu Sterben für mit Placebo Behandelte im Vergleich zu vom Heiler Behandelte: 1.41
Statistik2 Risk Ratio zu Sterben für vom Heiler Behandelte im Vergleich zu mit Placebo Behandelte: 0.77 Odds Ratio zu Sterben für vom Heiler Behandelte im Vergleich zu mit Placebo Behandelte: 0.71
Statistik3 Die absolute Risiko-Reduktion zu sterben, wenn man vom Heiler anstatt mit Placebo behandelt wird, ist: 0.06 oder 6 %

27.4 Simulation: 100 Studien Heiler versus Placebo

Wir werden jetzt diese Studie sehr oft wiederholen und die Resultate in einer Meta-Analyse darstellen. Wir simulieren 100 Studien mit unterschiedlicher Stichprobengrösse. Wir werden im Forest Plot sehen, dass ein paar Studien statistisch signifikante Resultate zeigen, obschon ja in Wahrheit kein Unterschied zwischen Heiler und Placebo besteht. Wie in den vorherigen Kapitel gesehen, nennen wir das Typ-I Fehler.

Hier unten seht ihr nun den Forest-Plot von 100 simulierten Studien.

library(meta)
study=1
data<-data.frame(study)

data<-data %>% 
  mutate(study=1) %>% 
  mutate(event.e=sum(df$gestorben[df$randomisation=="Heiler"]=="Gestorben")) %>% 
  mutate(n.e=length(df$randomisation[df$randomisation=="Heiler"])) %>% 
  mutate(event.c=sum(df$gestorben[df$randomisation=="Placebo"]=="Gestorben")) %>% 
  mutate(n.c=length(df$randomisation[df$randomisation=="Placebo"])) 

for (i in 2:100) {
  
  sampleSize=sample(c(10,50,100,200,500, 1000), 1, prob=c(0.2,0.05, 0.2, 0.15, 0.2,0.2))
id<-1:sampleSize
df<-data.frame(id)
df<-df %>%  
  mutate(randomisation=complete_ra(N = sampleSize, prob_each = c(.5, .5),
               conditions=c("Heiler", "Placebo"))) 

df<-df %>% 
  mutate(gestorben=case_when(
    randomisation=="Heiler"~sample(c("Geheilt", "Gestorben"), length(id), prob=c(0.7, 0.3), replace=TRUE),
    randomisation=="Placebo"~sample(c("Geheilt", "Gestorben"), length(id), prob=c(0.7, 0.3), replace=TRUE)))  

data[i,] <- data %>% 
  mutate(study=i) %>% 
  mutate(event.e=sum(df$gestorben[df$randomisation=="Heiler"]=="Gestorben")) %>% 
  mutate(n.e=length(df$randomisation[df$randomisation=="Heiler"])) %>% 
  mutate(event.c=sum(df$gestorben[df$randomisation=="Placebo"]=="Gestorben")) %>% 
  mutate(n.c=length(df$randomisation[df$randomisation=="Placebo"])) %>% 
  filter(study==i)

rct1<-metabin(data=data, 
              event.e=event.e, 
              n.e=n.e, 
              event.c=event.c, 
              n.c=n.c, 
              comb.fixed = FALSE)

}
forest(rct1, 
       label.right="Favours Heiler", 
       label.left="Favours Placebo")
Forest Plot der Heiler versus Placebo Studien.

(#fig:ForestPlot_Heiler_Placebo)Forest Plot der Heiler versus Placebo Studien.

27.5 Small Study Bias und Hinweis auf Publication Bias

Wir können nun auch noch ein weiteres Phänomen anschauen. Kleinere Studien zeigen tendenziell eher grösser Effekte - dies aus verschiedenen Gründen Siehe Artikel zum Thema Small Study Effect. Wir sehen dies in einem asymmetrischen Funnel Plot. Dies kann auch ein Hinweis auf den sogenannten Publikationsbias sein: Forschende - und wahrscheinlich auch die Zeitschriften - haben die Tendenz, eher statistisch signifikante Studien zu veröffentlichen. Dies betrifft eher auch kleinere Studien, da die grösseren Studien oft sehr viel Geld gekostet haben und somit doch eher veröffentlicht werden.

Schauen wir uns zuerst einen normalen Funnel-Plot an

funnel(rct1)
knitr::include_graphics('christmas_tree_fotofabrika_AdobeStock_295242706.jpeg')
So sollte ein normaler Funnel-Plot aussehen. Warum nennt man diesen Plot nicht Christmas-Tree-Plot?So sollte ein normaler Funnel-Plot aussehen. Warum nennt man diesen Plot nicht Christmas-Tree-Plot?

Abbildung 1.1: So sollte ein normaler Funnel-Plot aussehen. Warum nennt man diesen Plot nicht Christmas-Tree-Plot?

Hier ist der umgekehrte Trichter symmetrisch - eigentlich sieht es eher wie ein Tannenbaum mit Schmuck aus, wir sollten die Graphik eher Christmas-Tree-Plot nennen.

Nun spielen wir Forscher und Herausgeber der Zeitschriften und lassen ein paar Studien, die zugunsten von Placebo waren, nicht veröffentlichen (d.h. wir löschen sie)

data<-data %>% 
  filter((event.e/n.e)<(event.c/n.c)|n.e>100)


rct2<-metabin(data=data, 
              event.e=event.e, 
              n.e=n.e, 
              event.c=event.c, 
              n.c=n.c, 
              comb.fixed = FALSE)
funnel(rct2)

Jetzt sehen wir, dass der Funnel-Plot asymmetrisch geworden ist. Dies ist ein Hinweis auf einen Small-Study-Effekt, was oft auf einen Publikationsbias zurückzuführen ist. Falls Sie mehr wissen möchten über den Small-Study Effekt oder den Publication-Bias, finden Sie hier mehr Informationen. Ein Beispiel finden Sie hier.