Trying to calculate a combination of p1 (event in experiment group) and p0 (event in control group) with or (odds ratio) of 1.5. nnt = Number needed to treat (100/(p1-p0))
library(tidyverse)
p1 <- seq(0,1, 0.0001)
p0 <- seq(0,1,0.0001)
or <- 1.5
df <- tibble(p1 = as.numeric(), p0 = as.numeric(), nnt = as.numeric())
for (i in p1) {
for (j in p0) {
or_formula <- round((i/(1-i))/(j/(1-j)),3)
if (or_formula == or & !is.na(or_formula)) {
df <- df %>% add_row(p1 = i, p0 = j, nnt = round(1/(i-j), digits = 0))
}
}
}
We could use outer
or_formula <- function(i, j) round((i/(1-i))/(j/(1-j)), 3)
m1 <- outer(p1, p0, FUN = or_formula)
dim(m1)
#[1] 10001 10001
i1 <- m1 == or & !is.na(m1)
i2 <- which(i1, arr.ind = TRUE)
p1new <- p1[i2[,1]]
p0new <- p0[i2[,2]]
df1 <- tibble(p1 = p1new, p0 = p0new, nnt = round(1/(p1new-p0new), digits = 0))
-using outer
system.time({
m1 <- outer(p1, p0, FUN = or_formula)
i1 <- m1 == or & !is.na(m1)
i2 <- which(i1, arr.ind = TRUE)
p1new <- p1[i2[,1]]
p0new <- p0[i2[,2]]
df1 <- tibble(p1 = p1new, p0 = p0new, nnt = round(1/(p1new-p0new), digits = 0))
})
# user system elapsed
# 5.038 1.288 6.319
-using OP's for loop
system.time({
df <- tibble(p1 = as.numeric(), p0 = as.numeric(), nnt = as.numeric())
for (i in p1) {
for (j in p0) {
or_formula <- round((i/(1-i))/(j/(1-j)),3)
if (or_formula == or & !is.na(or_formula)) {
df <- df %>% add_row(p1 = i, p0 = j, nnt = round(1/(i-j), digits = 0))
}
}
}
})
# user system elapsed
#122.391 0.748 123.128
-testing the equality
identical(df, df1)
#[1] TRUE
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With