Kapitel 27 Heiler vs. 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.
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)
<-1:100
id<-data.frame(id)
df<-df %>%
dfmutate(randomisation=complete_ra(N = 100, prob_each = c(.5, .5),
conditions=c("Heiler", "Placebo")))
::freq(df$randomisation) summarytools
## 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 %>%
dfmutate(gestorben=case_when(
=="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))) randomisation
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
randomisation | |||
---|---|---|---|
Heiler | Placebo | Total | |
(N=50) | (N=50) | (N=100) | |
gestorben | |||
- Gestorben | 10 (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:
::ctable(df$randomisation, df$gestorben) summarytools
## 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.
::epitab(df$randomisation, df$gestorben, method="riskratio", riskratio="boot") epitools
## $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.
=c("Outcome","Intervention", "Heiler", "Placebo", "Statistik1", "Statistik2", "Statistik3")
Intervention<-data.frame(Intervention)
table
<-table %>%
tablemutate(Gestorben_N=case_when(
=="Heiler"~sum(df$gestorben[df$randomisation=="Heiler"]=="Gestorben"),
Intervention=="Placebo"~sum(df$gestorben[df$randomisation=="Placebo"]=="Gestorben"))) %>%
Interventionmutate(Gestorben_Prob=case_when(
=="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"]))) %>%
Interventionmutate(Geheilt_N=case_when(
=="Heiler"~sum(df$gestorben[df$randomisation=="Heiler"]=="Geheilt"),
Intervention=="Placebo"~sum(df$gestorben[df$randomisation=="Placebo"]=="Geheilt"))) %>%
Interventionmutate(Geheilt_Prob=case_when(
=="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"]))) %>%
Interventionmutate(Risk=case_when(
=="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 )))) %>%
Interventionmutate(Odds=case_when(
=="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 )))) %>%
Interventionmutate(ARR=case_when(
=="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,"%" ))) %>%
Interventionmutate_if(is.numeric, as.character)
is.na(table)] <- ""
table[
::kable(table) knitr
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)
=1
study<-data.frame(study)
data
<-data %>%
datamutate(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) {
=sample(c(10,50,100,200,500, 1000), 1, prob=c(0.2,0.05, 0.2, 0.15, 0.2,0.2))
sampleSize<-1:sampleSize
id<-data.frame(id)
df<-df %>%
dfmutate(randomisation=complete_ra(N = sampleSize, prob_each = c(.5, .5),
conditions=c("Heiler", "Placebo")))
<-df %>%
dfmutate(gestorben=case_when(
=="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)))
randomisation
<- data %>%
data[i,] 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)
<-metabin(data=data,
rct1event.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")
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)
::include_graphics('christmas_tree_fotofabrika_AdobeStock_295242706.jpeg') knitr
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 %>%
datafilter((event.e/n.e)<(event.c/n.c)|n.e>100)
<-metabin(data=data,
rct2event.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.