R语言 为什么`conf.level`参数对`binom::binom.confint`函数的结果没有影响?

k10s72fa  于 2023-10-13  发布在  其他
关注(0)|答案(1)|浏览(200)
library(binom)

x <- 10  
n <- 20 

binom.confint(x, n, methods = "prop.test", conf.level = 0.80)
#      method  x  n mean    lower    upper
# 1 prop.test 10 20  0.5 0.299298 0.700702
binom.confint(x, n, methods = "prop.test", conf.level = 0.95)
#      method  x  n mean    lower    upper
# 1 prop.test 10 20  0.5 0.299298 0.700702

但它确实适用于binom.test

binom.test(x, n, conf.level=0.80)$conf.int
# [1] 0.3381709 0.6618291
binom.test(x, n, conf.level=0.95)$conf.int
# [1] 0.2719578 0.7280422
fd3cxomn

fd3cxomn1#

这似乎是软件包中的一个bug。根据methods参数的docs
prop.test:相当于prop.test(x = x, n = n, conf.level = conf.level)$conf.int
但是,如果我们看看来源:

if(any(method == "prop.test") || all.methods) {
    ci <- lapply(seq_along(x), function(i) stats::prop.test(x[i], n[i])$conf.int)
}

您可以看到conf.level参数没有传递给prop.test(),因此它始终使用默认值(0.95)。它应该说:

lapply(seq_along(x), function(i) stats::prop.test(x[i], 
    n[i], conf.level = conf.level)$conf.int)

这将导致不同CI的输出不同:

lapply(seq_along(x), function(i) stats::prop.test(x[i], 
        n[i], conf.level = 0.95)$conf.int)
# [[1]]
# [1] 0.299298 0.700702

lapply(seq_along(x), function(i) stats::prop.test(x[i], 
        n[i], conf.level = 0.8)$conf.int)
# [[1]]
# [1] 0.362262 0.637738

我不完全确定如何解决这个问题。Github repo似乎是只读的,因此您无法打开问题或合并请求。也许您可以使用CRAN page上的详细信息联系软件包维护人员。在此期间,你可以尝试下面的热修复。

热修复

这不是构建健壮代码库的方法,但如果你需要一个短期解决方案,你可以像这样修补函数:

# Replace the relevant line
binom_confint_body2  <- sub(
    "function(i) stats::prop.test(x[i], n[i])$conf.int)",
    "function(i) stats::prop.test(x[i], n[i], conf.level = conf.level)$conf.int)",
    body(binom.confint), 
    fixed = TRUE
)

# Get access to binom.methods in the binom environment
binom_confint_body2  <- gsub(
    "binom.methods",
    "binom:::binom.methods",
    binom_confint_body2, 
    fixed = TRUE
)

# Create the function text
binom_confint2_txt  <- paste(c(
    'binom.confint2  <- function (x, n, conf.level = 0.95, methods = "all", ...) {',
    binom_confint_body2,
    "}}",
    collapse = "\n"
))

# eval the function text to create binom.confint2()
eval(parse(text = binom_confint2_txt))

然后我们可以运行binom.confin2

# Run the function
binom.confint2(x, n, methods = "prop.test", conf.level = 0.95)
#      method  x  n mean    lower    upper
# 1 prop.test 10 20  0.5 0.299298 0.700702

binom.confint2(x, n, methods = "prop.test", conf.level = 0.80)
#      method  x  n mean    lower    upper
# 1 prop.test 10 20  0.5 0.362262 0.637738

相关问题