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 创建
我正在为我的 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 创建