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

标签 r statistical-test

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

最佳答案

这似乎是软件包中的一个错误。根据docs对于 methods 参数:

prop.test: equivalent to prop.test(x = x, n = n, conf.level = conf.level)$conf.int.

但是,如果我们看一下 source :

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

关于r - 为什么 `conf.level` 参数对 `binom::binom.confint` 函数的结果没有影响?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77253457/

相关文章:

r - 要做很多相关测试

r - 在列表上使用 purrr 在不同的列上进行变异

r - 有什么方法可以根据 R 中的 wilcoxon 测试选择单变量特征吗?

r - Levene 测试提取 p 值?

R gbm 为什么 fit$trees 的长度总是数据集 iris 的 n.trees 的 3 倍

r - 如何将字符向量列表转换为单个向量?

将 sdmx-xml 文件读入 R 中的数据帧

bioinformatics - 如何解释两种情况下的对数倍数变化 (log2FC)

python - 将数据集与 Python 中的非标准概率分布进行比较

r - x[floor(d)] + x[ceiling(d)] : non-numeric argument to binary operator 中的错误