Pirateplot 95% 置信区间错误?

Pirateplot 95% confidence intervals wrong?

我正在为我的 class 做一些演示,使用 pirateplot 生成箱线图,其中箱子是 95% 的置信区间。然而,与在 R 中手动计算它们相比,小 Ns 的 pirateplot CI 大得多。Pirateplot 是否为此使用了非传统公式?代表如下。谢谢,怀斯

library(yarrr)
df <- data.frame(x = c(1,2,3,4,5))

longdata <- df %>%
  pivot_longer(cols = everything(), names_to = 'x', values_to = 'y')

datasum <- longdata %>%
  summarize(mean = mean(y),
            sd = sd(y),
            n = n(),
            sem = sd/sqrt(n),
            ci_ll = (-1.96*sem) + mean,
            ci_ul = (1.96*sem) + mean,
            )

pirateplot(data=longdata, y ~ x, 
           inf.method ='ci',   
           bean.b.col = "white", 
           bean.f.col = "white")

如果您对包裹的情况感到好奇,我鼓励您快速浏览一下 github。一开始可能有点不知所措,但你可以通过回顾别人所做的事情来学到很多东西。

查看 yarrr github,我们可以在第 750 行中看到包使用 t-interval 计算置信区间。您正在使用 z-interval 计算 95% 的置信区间。方法不同,所以我们会得到不同的结果。对于较小的样本量(通常小于 30),t-intervals 更合适。

z-interval 假设我们知道总体标准误差。对于较小的样本量,您可以想象我们的估计会有很大差异,并且样本的标准差可能无法代表总体。产生的置信区间没有考虑这种额外的不确定性,因此它们没有足够的覆盖率来真正成为 95% 的置信区间,因为我们违反了总体标准误差已知的假设。

让我们用您的示例数据进行计算,以查看差异并确保我们匹配包。

library(yarrr)
library(tidyverse)
df <- data.frame(x = c(1,2,3,4,5))

## t-interval uses n - 1 degrees of freedom
dof <- nrow(df) - 1
t <- qt(0.975, dof)
## z-interval. ~1.96 as you've used
z <- qnorm(0.975)

longdata <- df %>%
  pivot_longer(cols = everything(), names_to = 'x', values_to = 'y')

datasum <- longdata %>%
  summarize(avg = mean(y),
            standard_dev = sd(y),
            n = n(),
            sem = standard_dev/sqrt(n),
            ## z-interval
            ci_ll = avg - z*sem,
            ci_ul = avg + z*sem,
            ## t-interval
            lower = avg - t*sem,
            upper = avg + t*sem)

datasum
#> # A tibble: 1 x 8
#>     avg standard_dev     n   sem ci_ll ci_ul lower upper
#>   <dbl>        <dbl> <int> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1     3         1.58     5 0.707  1.61  4.39  1.04  4.96

所以我们可以看到 Z- 和 t-interval 置信区间之间的差异。 t-interval(适当地)有更多的覆盖面。我们的计算是否符合 t-test?

t.test(longdata$y, conf.level = 0.95)$conf.int
#> [1] 1.036757 4.963243
#> attr(,"conf.level")
#> [1] 0.95

确实如此。如果我们看一下 pirateplot,我们会看到我们的 t-interval 计算与图相匹配。

yarrr::pirateplot(data=longdata, y ~ x, 
                 inf.method ='ci',   
                 bean.b.col = "white", 
                 bean.f.col = "white")

reprex package (v2.0.1)

于 2022-02-22 创建