【发布时间】:2022-01-11 10:18:53
【问题描述】:
我有一个分组数据集,我有兴趣汇总一列计数(___ 的数量)。要计算摘要的标准误差,我想在组内引导并计算中位数的标准差。我正在努力弄清楚如何在不使用for 循环的情况下手动对此进行编码(用替换重新采样,而不是像boot() 这样的函数)(即,我希望纯粹是tidyverse解决方案)。如果除了使用*apply() 之外还有其他方法,那将是首选。将整个过程封装到一个函数中会很棒——可以在管道中使用,比如summarise(),或者作为一个可以应用于分组数据的独立函数。
临时数据集可以是 mtcars,我已按 gear 分组。我现在有兴趣使用中位数总结hp 列,并获得相同的置信区间。我已经尝试了一些由稍微相关的线程建议的解决方案,例如replicate()+across()、map()/pmap() 等,但无法让它们适用于我的具体情况。
library(tidyverse)
data <- mtcars %>%
select(gear, hp) %>%
group_by(gear)
> data
# A tibble: 32 x 2
# Groups: gear [3]
gear hp
<dbl> <dbl>
1 4 110
2 4 110
3 4 93
4 3 110
5 3 175
6 3 105
7 3 245
8 4 62
9 4 95
10 4 123
# ... with 22 more rows
我希望有一种方法可以将引导结果与简单总结整合为另一列(每组 SE):
data2 <- data %>%
summarise(hp = median(hp))
虽然用齿轮数来概括马力可能没有多大意义,而且hp 的分布可能不是典型的泊松分布,但我认为这个示例的编码解决方案仍然适用于我的具体情况。
编辑 1
解决方案不必是干净且健壮的函数。对于这种特定情况,它可能只是获取每组中的自举 SE 值所需的代码行。所需的输出只是 data2 对象,其中 hp 是中位数列,hpse 是 SE 列。
data2 <- data %>%
summarise(hp = median(hp),
### hpse = workingcode()
)
如果不能在 summarise() 调用中直接以这种方式执行此操作,则必须至少可以稍后将值连接到 data2。
相关话题
使用boot()
-
How to perform a bootstrap and find 95% confidence interval for the median of a dataset
-
Bootsrapping a statistic in a nested data column and retrieve results in tidy format
使用*apply()
使用for 循环
其他
【问题讨论】:
-
我很困惑说你不想要
*apply()功能但不介意咕噜声map()家庭。它们大多是等价的——使用 base 的解决方案可以很容易地更新为 tidyverse 样式。此外,解决方案可能会涉及类似于map(1:B, ...)的内容,这与 for 循环相同。 -
@kybazzi 是的,我尝试了
map()家庭,但不知道如何让它适用于我的情况,所以我正在寻找其他方法。我不想要*apply()函数的主要原因是因为这种方法涉及不同的数据对象类型,但我目前正在考虑将其作为一种选择。我在帖子中不够清楚,但如果它们可以适应 tidyverse 风格,我对这些方法持开放态度,但我当然希望避免for循环(如果可能的话)。 (将编辑帖子以明确这一点。) -
另外一点需要澄清的是解决方案应该是什么样子。就目前而言,这个问题似乎有点过于模糊或开放 - 它可以是一个完整的项目来构建可应用于管道的干净引导功能。你能展示一个所需输出的例子吗?
-
@kybazzi 我已经编辑了带有说明的帖子。我希望它有所帮助。所需的输出只是使用替换组内的抽样为每个组计算的 SE 列。如果有进一步的疑问,请告诉我。谢谢!
-
谢谢-您的编辑确实澄清了这一点。我已经给你留下了答案,很高兴回答任何问题。
标签: r statistics tidyverse resampling