【问题标题】:Calculating upper and lower confidence intervals by group in dplyr summarise()在 dplyr summarise() 中按组计算上下置信区间
【发布时间】:2020-05-08 18:04:12
【问题描述】:

我正在尝试制作一个表格,显示 N(观察次数)、百分比频率(答案 > 0)以及百分比频率的上下置信区间,我想按类型分组。

数据示例

dat <- data.frame(
  "type" = c("B","B","A","B","A","A","B","A","A","B","A","A","A","B","B","B"),
  "num" = c(3,0,0,9,6,0,4,1,1,5,6,1,3,0,0,0)
)

预期输出(已填写值):

Type   N   Percent   Lower 95% CI   Upper 95% CI
A
B

尝试

library(dplyr)
library(qwraps2)

table<-dat %>%
  group_by(type) %>%
  summarise(N=n(),
            mean.ci = mean_ci(dat$num),
            "Percent"=n_perc(num > 0))

这可以得到 N 和百分比频率,但是当我在 mean_ci 中添加时返回错误:“列必须是长度 1(汇总值),而不是 3”

我试了第二个代码,发现here

table2<-dat %>%
  group_by(type) %>%
  summarise(N.num=n(),
            mean.num = mean(dat$num),
            sd.num = sd(dat$num),
            "Percent"=n_perc(num > 0)) %>%
  mutate(se.num = sd.num / sqrt(N.num),
         lower.ci = 100*(mean.num - qt(1 - (0.05 / 2), N.num - 1) * se.num),
         upper.ci = 100*(mean.num + qt(1 - (0.05 / 2), N.num - 1) * se.num))

# A tibble: 2 x 8
#  type  N.num mean.num sd.num Percent        se.num lower.ci upper.ci
# <fct> <int>    <dbl>  <dbl> <chr>           <dbl>    <dbl>    <dbl>
#1 A         8     2.44   2.83 "6 (75.00\\%)"   1.00     7.35     480.
#2 B         8     2.44   2.83 "4 (50.00\\%)"   1.00     7.35     480.

这给了我一个输出,但置信区间不合逻辑。

【问题讨论】:

  • 您需要删除data$。您想要按组的平均值,但前缀 data$ 会为您提供表中的完整列。
  • 谢谢!当我删除 data$ 时,我确实得到了不同的结果,但 CI 间隔仍然很大。现在我得到 16.6、433 和 -12.6、538。这看起来是正确的还是还有其他问题?

标签: r dplyr summarize group-summaries qwraps2


【解决方案1】:

IceCreamToucan 的回答非常好。我发布这个答案是为了提供一个 呈现信息的不同方式。

library(dplyr)
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union
library(qwraps2)

dat <- data.frame("type" = c("B","B","A","B","A","A","B","A","A","B","A","A","A","B","B","B"),
                  "num"  = c(3,0,0,9,6,0,4,1,1,5,6,1,3,0,0,0))

在构建dplyr::summarize 调用时,您可以使用qwraps2::frmtci 调用将qwraps2::mean_ci 的输出格式化为字符串 长度一。

我还建议使用数据代词.data,这样您就可以明确表达 关于要总结的变量。

dat %>%
  dplyr::group_by(type) %>%
  dplyr::summarize(N = n(),
                   mean.ci = qwraps2::frmtci(qwraps2::mean_ci(.data$num)),
                   Percent = qwraps2::n_perc(.data$num > 0))
#> `summarise()` ungrouping output (override with `.groups` argument)
#> # A tibble: 2 x 4
#>   type      N mean.ci           Percent       
#>   <chr> <int> <chr>             <chr>         
#> 1 A         8 2.25 (0.52, 3.98) "6 (75.00\\%)"
#> 2 B         8 2.62 (0.34, 4.91) "4 (50.00\\%)"

reprex package (v0.3.0) 于 2020-09-15 创建

devtools::session_info()
#> ─ Session info ───────────────────────────────────────────────────────────────
#>  setting  value                       
#>  version  R version 4.0.2 (2020-06-22)
#>  os       macOS Catalina 10.15.6      
#>  system   x86_64, darwin17.0          
#>  ui       X11                         
#>  language (EN)                        
#>  collate  en_US.UTF-8                 
#>  ctype    en_US.UTF-8                 
#>  tz       America/Denver              
#>  date     2020-09-15                  
#> 
#> ─ Packages ───────────────────────────────────────────────────────────────────
#>  package     * version date       lib source        
#>  assertthat    0.2.1   2019-03-21 [1] CRAN (R 4.0.0)
#>  backports     1.1.9   2020-08-24 [1] CRAN (R 4.0.2)
#>  callr         3.4.4   2020-09-07 [1] CRAN (R 4.0.2)
#>  cli           2.0.2   2020-02-28 [1] CRAN (R 4.0.0)
#>  crayon        1.3.4   2017-09-16 [1] CRAN (R 4.0.0)
#>  desc          1.2.0   2018-05-01 [1] CRAN (R 4.0.0)
#>  devtools      2.3.1   2020-07-21 [1] CRAN (R 4.0.2)
#>  digest        0.6.25  2020-02-23 [1] CRAN (R 4.0.0)
#>  dplyr       * 1.0.2   2020-08-18 [1] CRAN (R 4.0.2)
#>  ellipsis      0.3.1   2020-05-15 [1] CRAN (R 4.0.0)
#>  evaluate      0.14    2019-05-28 [1] CRAN (R 4.0.0)
#>  fansi         0.4.1   2020-01-08 [1] CRAN (R 4.0.0)
#>  fs            1.5.0   2020-07-31 [1] CRAN (R 4.0.2)
#>  generics      0.0.2   2018-11-29 [1] CRAN (R 4.0.0)
#>  glue          1.4.2   2020-08-27 [1] CRAN (R 4.0.2)
#>  highr         0.8     2019-03-20 [1] CRAN (R 4.0.0)
#>  htmltools     0.5.0   2020-06-16 [1] CRAN (R 4.0.0)
#>  knitr         1.29    2020-06-23 [1] CRAN (R 4.0.0)
#>  lifecycle     0.2.0   2020-03-06 [1] CRAN (R 4.0.0)
#>  magrittr      1.5     2014-11-22 [1] CRAN (R 4.0.0)
#>  memoise       1.1.0   2017-04-21 [1] CRAN (R 4.0.0)
#>  pillar        1.4.6   2020-07-10 [1] CRAN (R 4.0.2)
#>  pkgbuild      1.1.0   2020-07-13 [1] CRAN (R 4.0.2)
#>  pkgconfig     2.0.3   2019-09-22 [1] CRAN (R 4.0.0)
#>  pkgload       1.1.0   2020-05-29 [1] CRAN (R 4.0.0)
#>  prettyunits   1.1.1   2020-01-24 [1] CRAN (R 4.0.0)
#>  processx      3.4.4   2020-09-03 [1] CRAN (R 4.0.2)
#>  ps            1.3.4   2020-08-11 [1] CRAN (R 4.0.2)
#>  purrr         0.3.4   2020-04-17 [1] CRAN (R 4.0.0)
#>  qwraps2     * 0.5.0   2020-09-14 [1] local         
#>  R6            2.4.1   2019-11-12 [1] CRAN (R 4.0.0)
#>  Rcpp          1.0.5   2020-07-06 [1] CRAN (R 4.0.0)
#>  remotes       2.2.0   2020-07-21 [1] CRAN (R 4.0.2)
#>  rlang         0.4.7   2020-07-09 [1] CRAN (R 4.0.2)
#>  rmarkdown     2.3     2020-06-18 [1] CRAN (R 4.0.0)
#>  rprojroot     1.3-2   2018-01-03 [1] CRAN (R 4.0.0)
#>  sessioninfo   1.1.1   2018-11-05 [1] CRAN (R 4.0.0)
#>  stringi       1.5.3   2020-09-09 [1] CRAN (R 4.0.2)
#>  stringr       1.4.0   2019-02-10 [1] CRAN (R 4.0.0)
#>  testthat      2.3.2   2020-03-02 [1] CRAN (R 4.0.0)
#>  tibble        3.0.3   2020-07-10 [1] CRAN (R 4.0.2)
#>  tidyselect    1.1.0   2020-05-11 [1] CRAN (R 4.0.0)
#>  usethis       1.6.1   2020-04-29 [1] CRAN (R 4.0.0)
#>  utf8          1.1.4   2018-05-24 [1] CRAN (R 4.0.0)
#>  vctrs         0.3.4   2020-08-29 [1] CRAN (R 4.0.2)
#>  withr         2.2.0   2020-04-20 [1] CRAN (R 4.0.0)
#>  xfun          0.17    2020-09-09 [1] CRAN (R 4.0.2)
#>  yaml          2.2.1   2020-02-01 [1] CRAN (R 4.0.0)
#> 
#> [1] /Library/Frameworks/R.framework/Versions/4.0/Resources/library

【讨论】:

    【解决方案2】:

    mean_ci 的输出是一个长度为 3 的向量。这可能是出乎意料的,因为包添加了一个打印方法,因此当您在控制台中看到它时,它看起来像单个字符值而不是数字长度 > 1 个向量。但是,您可以通过查看str 来查看底层数据结构。

    mean_ci(dat$num) %>% str
     # 'qwraps2_mean_ci' Named num [1:3] 2.44 1.05 3.82
     # - attr(*, "names")= chr [1:3] "mean" "lcl" "ucl"
     # - attr(*, "alpha")= num 0.05
    

    在 summarise 中,输出的每一列的每个元素都需要长度为 1,因此为 summarise 提供一个长度为 3 的对象以放入单个“单元格”(列元素)会导致错误。一种解决方法是将长度为 3 的向量放在一个列表中,这样它现在是一个长度为 1 的列表。然后您可以使用unnest_wider 将其分成 3 列(从而使表格“更宽”)

    library(tidyverse)
    
    dat %>%
      group_by(type) %>%
      summarise( N=n(),
                mean.ci = list(mean_ci(num)),
                "Percent"= n_perc(num > 0)) %>% 
      unnest_wider(mean.ci)
    # # A tibble: 2 x 6
    #   type      N  mean   lcl   ucl Percent       
    #   <fct> <int> <dbl> <dbl> <dbl> <chr>         
    # 1 A         8  2.25 0.523  3.98 "6 (75.00\\%)"
    # 2 B         8  2.62 0.344  4.91 "4 (50.00\\%)"
    

    【讨论】:

      猜你喜欢
      • 2020-12-30
      • 2021-05-15
      • 1970-01-01
      • 1970-01-01
      • 2015-08-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      相关资源
      最近更新 更多