From 0d3e9e62bffb2ceb0a369d811bd874edbba20705 Mon Sep 17 00:00:00 2001 From: SamCH93 <samuel.pawel@gmail.com> Date: Thu, 4 May 2023 15:50:08 +0200 Subject: [PATCH] Make command to extract code, last polish of MS --- data/preprocess-rpcb-data.R | 2 +- paper/Makefile | 4 + paper/rsabsence.R | 380 ++++++++++++++++++++++++++++++++++++ paper/rsabsence.Rnw | 43 +--- rsabsence.pdf | Bin 309327 -> 309295 bytes 5 files changed, 391 insertions(+), 38 deletions(-) create mode 100755 paper/rsabsence.R mode change 100755 => 100644 rsabsence.pdf diff --git a/data/preprocess-rpcb-data.R b/data/preprocess-rpcb-data.R index 06cda7b..80bf782 100755 --- a/data/preprocess-rpcb-data.R +++ b/data/preprocess-rpcb-data.R @@ -156,7 +156,7 @@ datClean2 %>% geom_hline(yintercept = 0, lty = 2, alpha = 0.9, linewidth = 0.4) + geom_vline(xintercept = 0, lty = 2, alpha = 0.9, linewidth = 0.4) + geom_point(aes(fill = rsig), shape = 21, size = 2) + - geom_rug(aes(color = rsig), size = 0.3, show.legend = FALSE) + + geom_rug(aes(color = rsig), linewidth = 0.3, show.legend = FALSE) + labs(x = "Original effect estimate (SMD)", y = "Replication effect estimate (SMD)", fill = "") + diff --git a/paper/Makefile b/paper/Makefile index 3df9c3d..c7f3aa5 100755 --- a/paper/Makefile +++ b/paper/Makefile @@ -23,6 +23,10 @@ pdf2: pdflatex $(FILE) pdflatex $(FILE) +## extract the R code from Rnw file +code: + Rscript -e "knitr::purl('$(FILE).Rnw')" --vanilla + ## clean clean: -rm $(FILE).aux $(FILE).blg $(FILE).log $(FILE).tex $(FILE).bbl \ diff --git a/paper/rsabsence.R b/paper/rsabsence.R new file mode 100755 index 0000000..ec52a89 --- /dev/null +++ b/paper/rsabsence.R @@ -0,0 +1,380 @@ +## ----"setup", include = FALSE------------------------------------------------- +## knitr options +library(knitr) +opts_chunk$set(fig.height = 4, + echo = FALSE, + warning = FALSE, + message = FALSE, + cache = FALSE, + eval = TRUE) + +## should sessionInfo be printed at the end? +Reproducibility <- TRUE + +## packages +library(ggplot2) # plotting +library(gridExtra) # combining ggplots +library(dplyr) # data manipulation +library(reporttools) # reporting of p-values + +## not show scientific notation for small numbers +options("scipen" = 10) + +## the replication Bayes factor under normality +BFr <- function(to, tr, so, sr) { + bf <- dnorm(x = tr, mean = 0, sd = so) / + dnorm(x = tr, mean = to, sd = sqrt(so^2 + sr^2)) + return(bf) +} +## function to format Bayes factors +formatBF. <- function(BF) { + if (is.na(BF)) { + BFform <- NA + } else if (BF > 1) { + if (BF > 1000) { + BFform <- "> 1000" + } else { + BFform <- as.character(signif(BF, 2)) + } + } else { + if (BF < 1/1000) { + BFform <- "< 1/1000" + } else { + BFform <- paste0("1/", signif(1/BF, 2)) + } + } + if (!is.na(BFform) && BFform == "1/1") { + return("1") + } else { + return(BFform) + } +} +formatBF <- Vectorize(FUN = formatBF.) + +## Bayes factor under normality with unit-information prior under alternative +BF01 <- function(estimate, se, null = 0, unitvar = 4) { + bf <- dnorm(x = estimate, mean = null, sd = se) / + dnorm(x = estimate, mean = null, sd = sqrt(se^2 + unitvar)) + return(bf) +} + + +## ----"data"------------------------------------------------------------------- +## data +rpcbRaw <- read.csv(file = "../data/rpcb-effect-level.csv") +rpcb <- rpcbRaw %>% + mutate( + ## recompute one-sided p-values based on normality + ## (in direction of original effect estimate) + zo = smdo/so, + zr = smdr/sr, + po1 = pnorm(q = abs(zo), lower.tail = FALSE), + pr1 = pnorm(q = abs(zr), lower.tail = ifelse(sign(zo) < 0, TRUE, FALSE)), + ## compute some other quantities + c = so^2/sr^2, # variance ratio + d = smdr/smdo, # relative effect size + po2 = 2*(1 - pnorm(q = abs(zo))), # two-sided original p-value + pr2 = 2*(1 - pnorm(q = abs(zr))), # two-sided replication p-value + sm = 1/sqrt(1/so^2 + 1/sr^2), # standard error of fixed effect estimate + smdm = (smdo/so^2 + smdr/sr^2)*sm^2, # fixed effect estimate + pm2 = 2*(1 - pnorm(q = abs(smdm/sm))), # two-sided fixed effect p-value + Q = (smdo - smdr)^2/(so^2 + sr^2), # Q-statistic + pQ = pchisq(q = Q, df = 1, lower.tail = FALSE), # p-value from Q-test + BForig = BF01(estimate = smdo, se = so), # unit-information BF for original + BForigformat = formatBF(BF = BForig), + BFrep = BF01(estimate = smdr, se = sr), # unit-information BF for replication + BFrepformat = formatBF(BF = BFrep) + ) + +rpcbNull <- rpcb %>% + filter(resulto == "Null") + +## 2 examples +study1 <- "(20, 1, 1)" # evidence of absence +study2 <- "(29, 2, 2)" # absence of evidence +plotDF1 <- rpcbNull %>% + filter(id %in% c(study1, study2)) %>% + mutate(label = ifelse(id == study1, + "Goetz et al. (2011)\nEvidence of absence", + "Dawson et al. (2011)\nAbsence of evidence")) +conflevel <- 0.95 + + +## ----"2-example-studies", fig.height = 3-------------------------------------- +## create plot showing two example study pairs with null results +ggplot(data = plotDF1) + + facet_wrap(~ label) + + geom_hline(yintercept = 0, lty = 2, alpha = 0.3) + + geom_pointrange(aes(x = "Original", y = smdo, + ymin = smdo - qnorm(p = (1 + conflevel)/2)*so, + ymax = smdo + qnorm(p = (1 + conflevel)/2)*so), fatten = 3) + + geom_pointrange(aes(x = "Replication", y = smdr, + ymin = smdr - qnorm(p = (1 + conflevel)/2)*sr, + ymax = smdr + qnorm(p = (1 + conflevel)/2)*sr), fatten = 3) + + geom_text(aes(x = 1.05, y = 2.5, + label = paste("italic(n) ==", no)), col = "darkblue", + parse = TRUE, size = 3.8, hjust = 0) + + geom_text(aes(x = 2.05, y = 2.5, + label = paste("italic(n) ==", nr)), col = "darkblue", + parse = TRUE, size = 3.8, hjust = 0) + + geom_text(aes(x = 1.05, y = 3, + label = paste("italic(p) ==", formatPval(po))), col = "darkblue", + parse = TRUE, size = 3.8, hjust = 0) + + geom_text(aes(x = 2.05, y = 3, + label = paste("italic(p) ==", formatPval(pr))), col = "darkblue", + parse = TRUE, size = 3.8, hjust = 0) + + labs(x = "", y = "Standardized mean difference") + + theme_bw() + + theme(panel.grid.minor = element_blank(), + panel.grid.major.x = element_blank(), + strip.text = element_text(size = 12, margin = margin(4), vjust = 1.5), + strip.background = element_rect(fill = alpha("tan", 0.4)), + axis.text = element_text(size = 12)) + + +## ----"plot-null-findings-rpcb", fig.height = 8.25, fig.width = "0.95\\linewidth"---- +## compute TOST p-values +## Wellek (2010): strict - 0.36 # liberal - .74 +# Cohen: small - 0.3 # medium - 0.5 # large - 0.8 +## 80-125% convention for AUC and Cmax FDA/EMA +## 1.3 for oncology OR/HR -> log(1.3)*sqrt(3)/pi = 0.1446 +margin <- 0.74 +conflevel <- 0.9 +rpcbNull$ptosto <- with(rpcbNull, pmax(pnorm(q = smdo, mean = margin, sd = so, + lower.tail = TRUE), + pnorm(q = smdo, mean = -margin, sd = so, + lower.tail = FALSE))) +rpcbNull$ptostr <- with(rpcbNull, pmax(pnorm(q = smdr, mean = margin, sd = sr, + lower.tail = TRUE), + pnorm(q = smdr, mean = -margin, sd = sr, + lower.tail = FALSE))) +## highlight the studies from Goetz and Dawson +ex1 <- "(20, 1, 1)" +ind1 <- which(rpcbNull$id == ex1) +ex2 <- "(29, 2, 2)" +ind2 <- which(rpcbNull$id == ex2) +rpcbNull$id <- ifelse(rpcbNull$id == ex1, + "(20, 1, 1) - Goetz et al. (2011)", rpcbNull$id) +rpcbNull$id <- ifelse(rpcbNull$id == ex2, + "(29, 2, 2) - Dawson et al. (2011)", rpcbNull$id) + +## create plots of all study pairs with null results in original study +ggplot(data = rpcbNull) + + ## order in ascending original paper order and label with id variable + facet_wrap(~ paper + experiment + effect + id, + labeller = label_bquote(.(id)), scales = "free", ncol = 3) + + geom_hline(yintercept = 0, lty = 2, alpha = 0.25) + + ## equivalence margin + geom_hline(yintercept = c(-margin, margin), lty = 3, col = 2, alpha = 0.9) + + ## ## also show the 95% CIs + ## geom_linerange(aes(x = "Original", y = smdo, + ## ymin = smdo - qnorm(p = (1 + 0.95)/2)*so, + ## ymax = smdo + qnorm(p = (1 + 0.95)/2)*so), size = 0.2, alpha = 0.6) + + ## geom_linerange(aes(x = "Replication", y = smdr, + ## ymin = smdr - qnorm(p = (1 + 0.95)/2)*sr, + ## ymax = smdr + qnorm(p = (1 + 0.95)/2)*sr), size = 0.2, alpha = 0.6) + + ## 90% CIs + geom_pointrange(aes(x = "Original", y = smdo, + ymin = smdo - qnorm(p = (1 + conflevel)/2)*so, + ymax = smdo + qnorm(p = (1 + conflevel)/2)*so), + size = 0.5, fatten = 1.5) + + geom_pointrange(aes(x = "Replication", y = smdr, + ymin = smdr - qnorm(p = (1 + conflevel)/2)*sr, + ymax = smdr + qnorm(p = (1 + conflevel)/2)*sr), + size = 0.5, fatten = 1.5) + + annotate(geom = "ribbon", x = seq(0, 3, 0.01), ymin = -margin, ymax = margin, + alpha = 0.05, fill = 2) + + labs(x = "", y = "Standardized mean difference") + + geom_text(aes(x = 1.05, y = pmax(smdo + 2.5*so, smdr + 2.5*sr, 1.1*margin), + label = paste("italic(n) ==", no)), col = "darkblue", + parse = TRUE, size = 2.3, hjust = 0, vjust = 2) + + geom_text(aes(x = 2.05, y = pmax(smdo + 2.5*so, smdr + 2.5*sr, 1.1*margin), + label = paste("italic(n) ==", nr)), col = "darkblue", + parse = TRUE, size = 2.3, hjust = 0, vjust = 2) + + geom_text(aes(x = 1.05, y = pmax(smdo + 2.5*so, smdr + 2.5*sr, 1.1*margin), + label = paste("italic(p)", + ifelse(po < 0.0001, "", "=="), + formatPval(po))), col = "darkblue", + parse = TRUE, size = 2.3, hjust = 0) + + geom_text(aes(x = 2.05, y = pmax(smdo + 2.5*so, smdr + 2.5*sr, 1.1*margin), + label = paste("italic(p)", + ifelse(pr < 0.0001, "", "=="), + formatPval(pr))), col = "darkblue", + parse = TRUE, size = 2.3, hjust = 0) + + geom_text(aes(x = 1.05, y = pmax(smdo + 2.5*so, smdr + 2.5*sr, 1.1*margin), + label = paste("italic(p)['TOST']", + ifelse(ptosto < 0.0001, "", "=="), + formatPval(ptosto))), + col = "darkblue", parse = TRUE, size = 2.3, hjust = 0, vjust = 3) + + geom_text(aes(x = 2.05, y = pmax(smdo + 2.5*so, smdr + 2.5*sr, 1.1*margin), + label = paste("italic(p)['TOST']", + ifelse(ptostr < 0.0001, "", "=="), + formatPval(ptostr))), + col = "darkblue", parse = TRUE, size = 2.3, hjust = 0, vjust = 3) + + geom_text(aes(x = 1.05, y = pmax(smdo + 2.5*so, smdr + 2.5*sr, 1.1*margin), + label = paste("BF['01']", ifelse(BForig <= 1/1000, "", "=="), + BForigformat)), col = "darkblue", parse = TRUE, + size = 2.3, hjust = 0, vjust = 4.5) + + geom_text(aes(x = 2.05, y = pmax(smdo + 2.5*so, smdr + 2.5*sr, 1.1*margin), + label = paste("BF['01']", ifelse(BFrep <= 1/1000, "", "=="), + BFrepformat)), col = "darkblue", parse = TRUE, + size = 2.3, hjust = 0, vjust = 4.5) + + coord_cartesian(x = c(1.1, 2.4)) + + theme_bw() + + theme(panel.grid.minor = element_blank(), + panel.grid.major = element_blank(), + strip.text = element_text(size = 8, margin = margin(3), vjust = 2), + strip.background = element_rect(fill = alpha("tan", 0.4)), + axis.text = element_text(size = 8)) + + +## ----"successes-RPCB"--------------------------------------------------------- +ntotal <- nrow(rpcbNull) + +## successes non-significance criterion +nullSuccesses <- sum(rpcbNull$po > 0.05 & rpcbNull$pr > 0.05) + +## success equivalence testing criterion +equivalenceSuccesses <- sum(rpcbNull$ptosto <= 0.05 & rpcbNull$ptostr <= 0.05) +ptosto1 <- rpcbNull$ptosto[ind1] +ptostr1 <- rpcbNull$ptostr[ind1] +ptosto2 <- rpcbNull$ptosto[ind2] +ptostr2 <- rpcbNull$ptostr[ind2] + +## success BF criterion +bfSuccesses <- sum(rpcbNull$BForig > 3 & rpcbNull$BFrep > 3) +BForig1 <- rpcbNull$BForig[ind1] +BFrep1 <- rpcbNull$BFrep[ind1] +BForig2 <- rpcbNull$BForig[ind2] +BFrep2 <- rpcbNull$BFrep[ind2] + + +## ----"sensitivity", fig.height = 6.5------------------------------------------ +## compute number of successful replications as a function of the equivalence margin +marginseq <- seq(0.01, 4.5, 0.01) +alphaseq <- c(0.01, 0.05, 0.1) +sensitivityGrid <- expand.grid(m = marginseq, a = alphaseq) +equivalenceDF <- lapply(X = seq(1, nrow(sensitivityGrid)), FUN = function(i) { + m <- sensitivityGrid$m[i] + a <- sensitivityGrid$a[i] + rpcbNull$ptosto <- with(rpcbNull, pmax(pnorm(q = smdo, mean = m, sd = so, + lower.tail = TRUE), + pnorm(q = smdo, mean = -m, sd = so, + lower.tail = FALSE))) + rpcbNull$ptostr <- with(rpcbNull, pmax(pnorm(q = smdr, mean = m, sd = sr, + lower.tail = TRUE), + pnorm(q = smdr, mean = -m, sd = sr, + lower.tail = FALSE))) + successes <- sum(rpcbNull$ptosto <= a & rpcbNull$ptostr <= a) + data.frame(margin = m, alpha = a, + successes = successes, proportion = successes/nrow(rpcbNull)) +}) %>% + bind_rows() + +## plot number of successes as a function of margin +nmax <- nrow(rpcbNull) +bks <- c(0, 3, 6, 9, 11, 15) +labs <- paste0(bks, " (", round(bks/nmax*100, 0), "%)") +rpcbSuccesses <- 11 +marbks <- c(0, margin, 1, 2, 3, 4) +plotA <- ggplot(data = equivalenceDF, + aes(x = margin, y = successes, + color = factor(alpha, ordered = TRUE, levels = rev(alphaseq)))) + + facet_wrap(~ 'italic("p")["TOST"] <= alpha ~ "in original and replication study"', + labeller = label_parsed) + + geom_vline(xintercept = margin, lty = 3, alpha = 0.4) + + annotate(geom = "segment", x = margin + 0.25, xend = margin + 0.01, y = 2, yend = 2, + arrow = arrow(type = "closed", length = unit(0.02, "npc")), alpha = 0.9, + color = "darkgrey") + + annotate(geom = "text", x = margin + 0.28, y = 2, color = "darkgrey", + label = "margin used in main analysis", + size = 3, alpha = 0.9, hjust = 0) + + geom_hline(yintercept = rpcbSuccesses, lty = 2, alpha = 0.4) + + annotate(geom = "segment", x = 0.1, xend = 0.1, y = 13, yend = 11.2, + arrow = arrow(type = "closed", length = unit(0.02, "npc")), alpha = 0.9, + color = "darkgrey") + + annotate(geom = "text", x = -0.04, y = 13.5, color = "darkgrey", + label = "non-significance criterion successes", + size = 3, alpha = 0.9, hjust = 0) + + geom_step(alpha = 0.8, linewidth = 0.8) + + scale_y_continuous(breaks = bks, labels = labs) + + scale_x_continuous(breaks = marbks) + + coord_cartesian(xlim = c(0, max(equivalenceDF$margin))) + + labs(x = bquote("Equivalence margin" ~ Delta), + y = "Successful replications", + color = bquote("threshold" ~ alpha)) + + theme_bw() + + theme(panel.grid.minor = element_blank(), + panel.grid.major = element_blank(), + strip.background = element_rect(fill = alpha("tan", 0.4)), + strip.text = element_text(size = 12), + legend.position = c(0.85, 0.25), + plot.background = element_rect(fill = "transparent", color = NA), + legend.box.background = element_rect(fill = "transparent", colour = NA)) + +## compute number of successful replications as a function of the prior scale +priorsdseq <- seq(0, 40, 0.1) +bfThreshseq <- c(3, 6, 10) +sensitivityGrid2 <- expand.grid(s = priorsdseq, thresh = bfThreshseq) +bfDF <- lapply(X = seq(1, nrow(sensitivityGrid2)), FUN = function(i) { + priorsd <- sensitivityGrid2$s[i] + thresh <- sensitivityGrid2$thresh[i] + rpcbNull$BForig <- with(rpcbNull, BF01(estimate = smdo, se = so, unitvar = priorsd^2)) + rpcbNull$BFrep <- with(rpcbNull, BF01(estimate = smdr, se = sr, unitvar = priorsd^2)) + successes <- sum(rpcbNull$BForig >= thresh & rpcbNull$BFrep >= thresh) + data.frame(priorsd = priorsd, thresh = thresh, + successes = successes, proportion = successes/nrow(rpcbNull)) +}) %>% + bind_rows() + +## plot number of successes as a function of prior sd +priorbks <- c(0, 2, 10, 20, 30, 40) +plotB <- ggplot(data = bfDF, + aes(x = priorsd, y = successes, color = factor(thresh, ordered = TRUE))) + + facet_wrap(~ '"BF"["01"] >= gamma ~ "in original and replication study"', + labeller = label_parsed) + + geom_vline(xintercept = 2, lty = 3, alpha = 0.4) + + geom_hline(yintercept = rpcbSuccesses, lty = 2, alpha = 0.4) + + annotate(geom = "segment", x = 7, xend = 2 + 0.2, y = 0.5, yend = 0.5, + arrow = arrow(type = "closed", length = unit(0.02, "npc")), alpha = 0.9, + color = "darkgrey") + + annotate(geom = "text", x = 7.5, y = 0.5, color = "darkgrey", + label = "standard deviation used in main analysis", + size = 3, alpha = 0.9, hjust = 0) + + annotate(geom = "segment", x = 0.5, xend = 0.5, y = 13, yend = 11.2, + arrow = arrow(type = "closed", length = unit(0.02, "npc")), alpha = 0.9, + color = "darkgrey") + + annotate(geom = "text", x = 0.05, y = 13.5, color = "darkgrey", + label = "non-significance criterion successes", + size = 3, alpha = 0.9, hjust = 0) + + geom_step(alpha = 0.8, linewidth = 0.8) + + scale_y_continuous(breaks = bks, labels = labs, limits = c(0, nmax)) + + scale_x_continuous(breaks = priorbks) + + coord_cartesian(xlim = c(0, max(bfDF$priorsd))) + + labs(x = "Prior standard deviation", + y = "Successful replications ", + color = bquote("threshold" ~ gamma)) + + theme_bw() + + theme(panel.grid.minor = element_blank(), + panel.grid.major = element_blank(), + strip.background = element_rect(fill = alpha("tan", 0.4)), + strip.text = element_text(size = 12), + legend.position = c(0.85, 0.25), + plot.background = element_rect(fill = "transparent", color = NA), + legend.box.background = element_rect(fill = "transparent", colour = NA)) + +grid.arrange(plotA, plotB, ncol = 1) + + +## ----"interesting-study"------------------------------------------------------ +studyInteresting <- filter(rpcbNull, id == "(48, 2, 4)") +noInteresting <- studyInteresting$no +nrInteresting <- studyInteresting$nr + + + + +## ----"sessionInfo2", echo = Reproducibility, results = Reproducibility-------- +cat(paste(Sys.time(), Sys.timezone(), "\n")) +sessionInfo() + diff --git a/paper/rsabsence.Rnw b/paper/rsabsence.Rnw index 744da7c..714edba 100755 --- a/paper/rsabsence.Rnw +++ b/paper/rsabsence.Rnw @@ -247,42 +247,14 @@ rpcb <- rpcbRaw %>% rpcbNull <- rpcb %>% filter(resulto == "Null") -## check the sample sizes -## paper 5 (https://osf.io/q96yj) - 1 Cohen's d - sample size correspond to forest plot -## paper 9 (https://osf.io/yhq4n) - 3 Cohen's w- sample size do not correspond at all -## paper 15 (https://osf.io/ytrx5) - 1 r - sample size correspond to forest plot -## paper 19 (https://osf.io/465r3) - 2 Cohen's dz - sample size correspond to forest plot -## paper 20 (https://osf.io/acg8s) - 1 r and 1 Cliff's delta - sample size correspond to forest plot -## paper 21 (https://osf.io/ycq5g) - 1 Cohen's d - sample size correspond to forest plot -## paper 24 (https://osf.io/pcuhs) - 2 Cohen's d - sample size correspond to forest plot -## paper 28 (https://osf.io/gb7sr/) - 3 Cohen's d - sample size correspond to forest plot -## paper 29 (https://osf.io/8acw4) - 1 Cohen's d - sample size do not correspond, seem to be double -## paper 41 (https://osf.io/qnpxv) - 1 Hazard ratio - sample size correspond to forest plot -## paper 47 (https://osf.io/jhp8z) - 2 r - sample size correspond to forest plot -## paper 48 (https://osf.io/zewrd) - 1 r - sample size do not correspond to forest plot for original study - ## 2 examples -## some evidence for absence of effect https://doi.org/10.7554/eLife.45120 I -## can't find the replication effect like reported in the data set :( let's take -## it at face value we are not data detectives -## https://iiif.elifesciences.org/lax/45120%2Felife-45120-fig4-v1.tif/full/1500,/0/default.jpg -study1 <- "(20, 1, 1)" -## absence of evidence -study2 <- "(29, 2, 2)" -## https://iiif.elifesciences.org/lax/25306%2Felife-25306-fig5-v2.tif/full/1500,/0/default.jpg +study1 <- "(20, 1, 1)" # evidence of absence +study2 <- "(29, 2, 2)" # absence of evidence plotDF1 <- rpcbNull %>% filter(id %in% c(study1, study2)) %>% mutate(label = ifelse(id == study1, "Goetz et al. (2011)\nEvidence of absence", "Dawson et al. (2011)\nAbsence of evidence")) -## ## RH: this data is really a mess. turns out for Dawson n represents the group -## ## size (n = 6 in https://osf.io/8acw4) while in Goetz it is the sample size of -## ## the whole experiment (n = 34 and 61 in https://osf.io/acg8s). in study 2 the -## ## so multiply by 2 to have the total sample size, see Figure 5A -## ## https://doi.org/10.7554/eLife.25306.012 -## plotDF1$no[plotDF1$id == study2] <- plotDF1$no[plotDF1$id == study2]*2 -## plotDF1$nr[plotDF1$id == study2] <- plotDF1$nr[plotDF1$id == study2]*2 - conflevel <- 0.95 @ @@ -627,9 +599,6 @@ effect estimates even lie outside the equivalence margin. -% We chose the margin $\Delta = \Sexpr{margin}$ primarily for illustrative -% purposes and because effect sizes in preclinical research are typically much -% larger than in clinical research. The post-hoc specification of equivalence margins is controversial. Ideally, the margin should be specified on a case-by-case basis in a pre-registered protocol before the studies are conducted by researchers familiar with the subject @@ -656,7 +625,7 @@ replications as a function of the margin $\Delta$ and for different TOST proposed by \citet{Hauck1986}. We see that for realistic margins between $0$ and $1$, the proportion of replication successes remains below $50\%$ for the conventional $\alpha = 0.05$ level. To achieve a success rate of -$11/15 = \Sexpr{round(11/15*100, 1)}\%$, as was achieved with the +$11/15 = \Sexpr{round(11/15*100, 0)}\%$, as was achieved with the non-significance criterion from the RPCB, unrealistic margins of $\Delta > 2$ are required, highlighting the paucity of evidence provided by these studies. Changing the success criterion to a more lenient level ($\alpha = 0.1$) or a @@ -892,18 +861,18 @@ deviations larger than the unit-information standard deviation of $2$, as this corresponds to the assumption of very large effect sizes under the alternatives. However, to achieve replication success for a larger proportion of replications than the observed -$\Sexpr{bfSuccesses}/\Sexpr{ntotal} = \Sexpr{round(bfSuccesses/ntotal*100, 1)}\%$, +$\Sexpr{bfSuccesses}/\Sexpr{ntotal} = \Sexpr{round(bfSuccesses/ntotal*100, 0)}\%$, unreasonably large prior standard deviations have to be specified. For instance, a standard deviation of roughly $5$ is required to achieve replication success in $50\%$ of the replications at a lenient Bayes factor threshold of $\gamma = 3$. The standard deviation needs to be almost $20$ so that the same -success rate $11/15 = \Sexpr{round(11/15*100, 1)}\%$ as with the +success rate $11/15 = \Sexpr{round(11/15*100, 0)}\%$ as with the non-significance criterion is achieved. The necessary standard deviations are even higher for stricter Bayes factor threshold, such as $\gamma = 6$ or $\gamma = 10$. -<< >>= +<< "interesting-study" >>= studyInteresting <- filter(rpcbNull, id == "(48, 2, 4)") noInteresting <- studyInteresting$no nrInteresting <- studyInteresting$nr diff --git a/rsabsence.pdf b/rsabsence.pdf old mode 100755 new mode 100644 index 964b30c0c38966696683489c029888239df95dde..7e2e8680c4a3b98936af4777beb42470e9824070 GIT binary patch delta 11497 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 SgCv3H<l=y*q7qk>fd5}vnGRzB delta 11574 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 -- GitLab