Я знаю, що вона менш елегантна, але мені довелося її моделювати. Я не тільки створив досить просте моделювання, але це неелегантно і повільно працює. Хоча це досить добре. Одна перевага полягає в тому, що, поки деякі основи є правильними, він підкаже мені, коли елегантний підхід впаде.
Розмір вибірки буде змінюватися залежно від твердо кодованого значення.
Отже ось код:
#main code
#want 95% CI to be no more than 3% from prevalence
#expect prevalence around 15% to 30%
#think sample size is ~1000
my_prev <- seq(from=0.15, to=0.30, by = 0.002)
samp_sizes <- seq(from=400, to=800, by = 1)
samp_sizes
N_loops <- 2000
store <- matrix(0,
nrow = length(my_prev)*length(samp_sizes),
ncol = 3)
count <- 1
#for each prevalence
for (i in 1:length(my_prev)){
#for each sample size
for(j in 1:length(samp_sizes)){
temp <- 0
for(k in 1:N_loops){
#draw samples
y <- rbinom(n = samp_sizes[j],
size = 1,
prob = my_prev[i])
#compute prevalence, store
temp[k] <- mean(y)
}
#compute 5% and 95% of temp
width <- diff(quantile(x = temp,probs = c(0.05,0.95)))
#store samp_size, prevalence, and CI half-width
store[count,1] <- my_prev[i]
store[count,2] <- samp_sizes[j]
store[count,3] <- width[[1]]
count <- count+1
}
}
store2 <- numeric(length(my_prev))
#go through store
for(i in 1:length(my_prev)){
#for each prevalence
#find first CI half-width below 3%
#store samp_size
idx_p <- which(store[,1]==my_prev[i],arr.ind = T)
idx_p
temp <- store[idx_p,]
temp
idx_2 <- which(temp[,3] <= 0.03*2, arr.ind = T)
idx_2
temp2 <- temp[idx_2,]
temp2
if (length(temp2[,3])>1){
idx_3 <- which(temp2[,3]==max(temp2[,3]),arr.ind = T)
store2[i] <- temp2[idx_3[1],2]
} else {
store2[i] <- temp2[2]
}
}
#plot it
plot(x=my_prev,y=store2,
xlab = "prevalence", ylab = "sample size")
lines(smooth.spline(x=my_prev,y=store2),col="Red")
grid()
І ось графік розміру вибірки проти поширеності такий, що невизначеність 95% ДІ щодо поширеності максимально наближається до 3%, не переходячи її.±
Від 50%, здається, потрібні "дещо менше спостережень", як запропонував kjetil.
Я думаю, що ви можете отримати гідну оцінку поширеності перед 400 зразками та скоригувати свою стратегію вибірки в процесі роботи. Я не думаю, що в середині має бути пробіжка, і тому ви можете зіткнути N_loops до 10e3 і зіткнути "by" в "my_prev" до 0,001.