【问题标题】:How to calculate confidence interval using the "bootstrap function" in R如何使用 R 中的“引导函数”计算置信区间
【发布时间】:2019-05-01 05:02:16
【问题描述】:

我正在尝试计算 R 中的置信区间。由于一些特殊原因,我必须使用“bootstrap”包中的函数来计算。(这意味着我不能使用“boot”包中的函数。 )

这是我的代码。

而我正在做的是尝试计算 Pearson 相关系数,然后应用 Bootstrap 方法(B = 100)来获得相关系数的估计值。但我不知道如何构造 95% 的置信区间。

library(bootstrap) 
data('law')

set.seed(1)
theta <- function(ind) {
  cor(law[ind, 1], law[ind, 2], method = "pearson")
  }
law.boot <- bootstrap(1:15, 100, theta) 
# sd(law$thetastar)
percent.95 <- function(x) {
  quantile(x,  .95)
  }
law.percent.95 <- bootstrap(1:15, 100, theta, func=percent.95)

对不起,如果我没有让自己清楚或标记错误的标签。 很抱歉没有生成数据集(现在已提供),并感谢 Roland 教授指出。非常感谢!

【问题讨论】:

  • "这是一个包含 2 个列表的矩阵。"这是一个非常不寻常的数据结构。因此,您需要提供一个可重现的示例(参见此FAQ)或至少提供str(CD) 的输出。

标签: r confidence-interval statistics-bootstrap


【解决方案1】:

通常,在引导之后,我们使用 2.5% 和 97.5% 的百分位数作为 95% 的置信区间(因为我们从每一边减去 α/2=.025)。另请参阅 @thothal 的 answer 和答案下的 cmets。

R <- 1e5 - 1  ## number of bootstrap replications
est <- with(law, cor(lsat, gpa))  ## naïve correlation

theta <- function(ind) cor(law[ind, 1], law[ind, 2], method="pearson")
set.seed(1)
B1 <- bootstrap::bootstrap(seq(nrow(law)), R, theta) 
(ci1 <- c(estimate=est, quantile(B1$thetastar, c(.025, .975))))
#  estimate      2.5%     97.5% 
# 0.7763745 0.4594845 0.9620884 

这里是一种从头开始的替代方法:

theta2 <- function(x) with(x, cor(lsat, gpa))
set.seed(1)
B2 <- replicate(R, theta2(law[sample(nrow(law), nrow(law), replace=TRUE), ]))
(ci2 <- c(estimate=est, quantile(B2, c(.025, .975))))
#  estimate      2.5%     97.5% 
# 0.7763745 0.4607644 0.9617970 

最后是使用具有boot.ci 函数的boot 包的方法:

theta3 <- function(data, k) cor(data[k, ])[1,2]
set.seed(1)
B3 <- boot::boot(law, theta3, R=R)
(ci3 <- c(est, boot::boot.ci(B3, type='perc')$percent[4:5]))
# [1] 0.7763745 0.4593727 0.9620923

【讨论】:

  • 感谢您更正我的代码! !但是我仍然不知道如何根据输出表构造置信区间。你能告诉我我应该使用哪些值来获得那个 CI?(输出你知道的间隔)再次感谢!
  • 非常感谢!!我不知道在这里使用正态分布是否合适,但它对我现在使用的数据很有意义。我稍后会和我的教授讨论这个问题。再次非常感谢。你太专业了,你的回答很有帮助!!
  • 不适合使用正态近似。已知相关系数分布不同。毕竟它被限制在一个狭窄的范围内。为什么不改用适当的百分位数?
【解决方案2】:

有多种计算引导估计器 CI 的方法(参见to this Wikipedia article for instance

最简单的方法是从自举系数(维基百科文章中的 Percentile Bootstrap)中找出 2.5%97.5% 分位数:

quantile(law.boot$thetastar, c(0.025, 0.975))
#      2.5%     97.5% 
# 0.4528745 0.9454483 

Basic Bootstrap 将被计算为

2 * mean(law.boot$thetastar) - quantile(law.boot$thetastar, c(0.975, 0.025))
#     97.5%      2.5% 
# 0.5567887 1.0493625

【讨论】:

  • 非常感谢!没错,这正是获取 CI 的最简单方法,而且您的建议(查看 wiki 文章)非常有帮助!但是当我在 Rstudio 中运行你的代码时出现了问题。我得到的 CI 和你的有点不同。 (我得到 [0.4606497,0.9622643 ] 和 [-0.1914946,0.3101201 ]。无论如何,非常感谢!您的回答非常鼓舞人心!谢谢!
  • 好吧,由于引导估计器依赖于随机抽取的样本,所以看到不同的结果我并不感到惊讶;)
  • 请注意,“基本引导 CI”包含不可能的值。我赞成这个答案,因为它更符合引导方法的精神和理论论证。
  • 哦,我明白了!我想我以前把这个问题复杂化了。非常感谢!!!
猜你喜欢
  • 2013-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-16
  • 2016-11-01
  • 2016-01-15
相关资源
最近更新 更多