95 % 신뢰 구간의 반복 실험 해석을 시뮬레이션하기 위해 R 스크립트를 작성하려고합니다. 비율의 실제 모집단 값이 표본의 95 % CI에 포함되어있는 시간의 비율을 과대 평가하는 것으로 나타났습니다. 큰 차이는 아니지만 약 96 % 대 95 %이지만 그럼에도 불구하고 관심이 있습니다.
내 함수는 samp_n
확률로 Bernoulli 분포에서 표본을 추출한 pop_p
다음 prop.test()
연속성 보정 을 사용하거나보다 정확하게를 사용하여 95 % 신뢰 구간을 계산합니다 binom.test()
. 실제 모집단 비율 pop_p
이 95 % CI에 포함되어 있으면 1을 반환합니다 . 두 가지 기능을 사용했습니다. 하나는 사용 prop.test()
하고 다른 하나는 사용 binom.test()
하고 비슷한 결과를 얻었습니다.
in_conf_int_normal <- function(pop_p = 0.3, samp_n = 1000, correct = T){
## uses normal approximation to calculate confidence interval
## returns 1 if the CI contain the pop proportion
## returns 0 otherwise
samp <- rbinom(samp_n, 1, pop_p)
pt_result <- prop.test(length(which(samp == 1)), samp_n)
lb <- pt_result$conf.int[1]
ub <- pt_result$conf.int[2]
if(pop_p < ub & pop_p > lb){
return(1)
} else {
return(0)
}
}
in_conf_int_binom <- function(pop_p = 0.3, samp_n = 1000, correct = T){
## uses Clopper and Pearson method
## returns 1 if the CI contain the pop proportion
## returns 0 otherwise
samp <- rbinom(samp_n, 1, pop_p)
pt_result <- binom.test(length(which(samp == 1)), samp_n)
lb <- pt_result$conf.int[1]
ub <- pt_result$conf.int[2]
if(pop_p < ub & pop_p > lb){
return(1)
} else {
return(0)
}
}
실험을 몇 천 번 반복 pop_p
하면 표본의 95 % CI 내에있는 시간의 비율 이 0.95가 아니라 0.96에 가깝다는 것을 알았습니다.
set.seed(1234)
times = 10000
results <- replicate(times, in_conf_int_binom())
sum(results) / times
[1] 0.9562
이것이 왜 그런지에 대한 나의 생각은
- 내 코드가 잘못되었습니다 (그러나 많이 확인했습니다)
- 처음에는 이것이 정상적인 근사 문제로 인한 것이라고 생각했지만
binom.test()
어떤 제안?
답변
당신은 잘못되지 않습니다. 간단하게 구성 할 수 없습니다 이항 비율에 대한 신뢰 구간 항상 의 범위가 정확히 인한 결과의 개별 특성으로 95 %를. Clopper-Pearson ( ‘정확한’) 간격은 최소 95 %의 범위를 보장합니다 . 다른 구간은 실제 비율 에 대해 평균 일 때 평균 95 % 에 가까운 범위를가 집니다.
Jeffreys 간격은 평균 95 %에 가깝고 (Wilson 점수 간격과 달리) 두 꼬리에서 거의 같은 적용 범위를 갖기 때문에 Jeffreys 간격을 선호합니다.
문제의 코드가 약간만 변경되면 시뮬레이션없이 정확한 적용 범위를 계산할 수 있습니다.
p <- 0.3
n <- 1000
# Normal test
CI <- sapply(0:n, function(m) prop.test(m,n)$conf.int[1:2])
caught.you <- which(CI[1,] <= p & p <= CI[2,])
coverage.pr <- sum(dbinom(caught.you - 1, n, p))
# Clopper-Pearson
CI <- sapply(0:n, function(m) binom.test(m,n)$conf.int[1:2])
caught.you.again <- which(CI[1,] <= p & p <= CI[2,])
coverage.cp <- sum(dbinom(caught.you.again - 1, n, p))
결과는 다음과 같습니다.
> coverage.pr
[1] 0.9508569
> coverage.cp
[1] 0.9546087