【问题标题】:Calling prop.test function in R with dplyr使用 dplyr 在 R 中调用 prop.test 函数
【发布时间】:2018-12-01 07:20:27
【问题描述】:

我正在尝试计算几个二项式比例置信区间。我的数据在数据框中,虽然我可以从prop.test 返回的对象中成功提取estimate,但在数据框上运行时conf.int 变量似乎为空。

library(dplyr)

cases <- c(50000, 1000, 10, 2343242)
population <- c(100000000, 500000000, 100000, 200000000)

df <- as.data.frame(cbind(cases, population))
df %>% mutate(rate = prop.test(cases, population, conf.level=0.95)$estimate)

这会适当地返回

    cases population       rate
1   50000      1e+08 0.00050000
2    1000      5e+08 0.00000200
3      10      1e+05 0.00010000
4 2343242      2e+08 0.01171621

但是,当我跑步时

df %>% mutate(confint.lower= prop.test(cases, pop, conf.level=0.95)$conf.int[1])

我很伤心

Error in mutate_impl(.data, dots) : 
  Column `confint.lower` is of unsupported type NULL

有什么想法吗?我知道计算二项式比例置信区间的其他方法,但我真的很想学习如何使用dplyr

谢谢!

【问题讨论】:

  • @akrun 我的道歉 - 真实数据的残留证据与我尝试共享可重现块的尝试。我编辑了代码。谢谢。
  • 什么是sumcases? :)
  • 如果我们在Value 部分中深入了解?prop.test 的帮助页面,conf.int 的描述告诉我们“如果有一组,则为真实比例的置信区间,或者如果有 2 个组且未给出 p,则比例差异,否则为 NULL”,因此您需要测试一个或两个组以为您生成一个非NULLconf.int,而不是当前正在生成的 4 个组测试
  • @Nate 我看到了,但我认为dplyr 将执行prop.test 的一种逐行调用,因此每行都将被单独考虑,并且第一部分您引用的部分(“如果有一组,则为真实比例的置信区间”)将适用。我是不是误会dplyr
  • 试试library(purrr) ; library(dplyr) ; df %&gt;% mutate(confint.lower = map2(.x = cases, .y = population, .f = ~ prop.test(.x, .y, conf.level=0.95)$conf.int[1]))。我还没有真正深入研究 htest 类来弄清楚为什么你的版本不起作用,但这应该。编辑:实际上,经过快速思考,它可能不起作用,因为 prop.test 没有矢量化。

标签: r dplyr


【解决方案1】:

您可以使用dplyr::rowwise() 对行进行分组:

df %>%
    rowwise() %>%
    mutate(lower_ci = prop.test(cases, pop, conf.level=0.95)$conf.int[1])

默认情况下dplyr 采用列名并将它们视为向量。所以矢量化函数,比如上面提到的@Jake Fisher,在不添加rowwise() 的情况下也能正常工作。

这就是我一次捕获所有置信区间分量的方法:

df %>%
    rowwise %>%
    mutate(tst = list(broom::tidy(prop.test(cases, pop, conf.level=0.95)))) %>%
    tidyr::unnest(tst)

【讨论】:

  • 太棒了,非常感谢 Nate 和 @JakeFisher。感谢您提供解释和有用的代码 - 非常感谢。
  • 非常干净的代码,运行良好,谢谢!
【解决方案2】:

从 1.0.0 版开始,rowwise() 不再受到质疑。

dplyr 的 0.8.3 版本开始,rowwise() 函数的生命周期状态为“正在询问”。

作为替代方案,我宁愿推荐使用purrr::map2() 来实现目标:

df %>%
  mutate(rate = map2(cases, pop, ~ prop.test(.x, .y, conf.level=0.95) %>%
                                     broom::tidy())) %>%
  unnest(rate)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-05
    相关资源
    最近更新 更多