如何绘制一个样本比例的 95% 置信区间图

How to plot a 95% confidence interval graph for one sample proportion

qplot(x="SignUp", y=0.07, ymin=Lower_Level, ymax=Upper_Level, ylim=c(0,1), geom = "pointrange")+coord_flip() +
  
  ylab("SignUp Proportion")+geom_hline(yintercept=Upper_Level)+geom_hline(yintercept=Lower_Level)

这就是我设法策划的。但我想要类似下图的东西。置信区间为 0.084 和 0.0551。样本比例为0.07

我猜你可以像这样显示估计概率的 95% 置信区间:

首先,从代表样本中“成功”和“失败”率的 1 和 0 数据框开始。在这里,您的数字表明 1500 次成功中大约有 105 次成功,所以我们这样做:

df <- data.frame(x = c(rep(1, 105), rep(0, 1395)))

现在我们拟合逻辑回归,截距是我们估计的唯一参数:

mod <- coef(summary(glm(x ~ 1, family = binomial, data = df)))

mod
#>              Estimate Std. Error  z value      Pr(>|z|)
#> (Intercept) -2.586689  0.1011959 -25.5612 4.122466e-144

这里的估计值应该服从给定估计值和标准误差的正态分布(在对数几率尺度上),因此我们可以通过以下操作获取适当范围内的密度值:

xvals <- seq(mod[1] - 3 * mod[2], mod[1] + 3 * mod[2], 0.01)
yvals <- dnorm(xvals, mod[1], mod[2])

现在我们将 x 值从对数几率转换为概率:

pxvals <- exp(xvals)/(1 + exp(xvals))

我们还将创建一个向量,用于标记值是否在估计值的 1.96 个标准差范围内:

level <- ifelse(xvals < mod[1] - 1.96 * mod[2], "lower",
          ifelse(xvals > mod[1] + 1.96 * mod[2], "upper", "estimate"))

现在我们将所有这些放在一个数据框中并绘制:

plot_df <- data.frame(xvals, yvals, pxvals, level)

library(ggplot2)

ggplot(plot_df, aes(pxvals, yvals, fill = level)) +
  geom_area(alpha = 0.5) +
  geom_vline(xintercept = exp(mod[1])/(1 + exp(mod[1])), linetype = 2) + 
  scale_fill_manual(values = c("gray70", "deepskyblue4", "deepskyblue4"),
                    guide = guide_none()) +
  scale_x_continuous(limits = c(0.03, 0.13), breaks = 3:12/100,
                     name = "probability") +
  theme_bw()

请注意,因为我们已经变换了 x 轴,所以这不再是真正的密度图。结果,y 轴变得有些随意,但该图仍准确显示概率估计的 95% 置信区间。


编辑

如果 glm 方法看起来太复杂,这里有一个替代方法。它使用二项分布来获得 95% 的置信区间。您只需为其提供人口规模和“成功”次数

library(ggplot2)

population <- 1500
actual_successes <- 105
test_successes <- 1:300

density <- dbinom(test_successes, population, actual_successes/population)
probs   <- pbinom(test_successes, population, actual_successes/population)
label   <- ifelse(probs < 0.025, "low", ifelse(probs > 0.975, "high", "CI"))

ggplot(data.frame(probability = test_successes/population, density, label),
       aes(probability, density, fill = label)) +
  geom_area(alpha = 0.5) +
  geom_vline(xintercept = actual_successes/population, linetype = 2) + 
  scale_fill_manual(values = c("gray70", "deepskyblue4", "deepskyblue4"),
                    guide = guide_none()) +
  scale_x_continuous(limits = c(0.03, 0.13), breaks = 3:12/100,
                     name = "probability") +
  theme_bw()