【问题标题】:Resampling in nested groups in R在 R 中的嵌套组中重新采样
【发布时间】:2021-02-20 11:52:21
【问题描述】:

我遇到过类似的问题,但无法找到满足我特定需求的答案。

我有一个具有嵌套组设计的数据集,我需要在每个组内随机抽样(带替换),并且重新抽样事件的数量必须等于每组的样本数(即行数)。此外,嵌套组具有多列数据。请参阅下面的示例 df

我有使用dplyr 包的代码,但我正在远离dplyr,因为我必须不断更新我的代码,因为dplyr 更改了函数名称和操作......至少可以说这很烦人。是的...我知道有几种方法可以规避这个问题,但我决定是时候抛开dplyr 的拐杖,学习如何使用R base 包执行数据争用了。

工作 dplyr 代码:

Resample_function = function(Boot)
{group_by(data1, GROUP, YEAR) %>%
 slice(sample(n(), replace = TRUE))%>%
 ungroup()
}

我尝试使用aggregateaveapply 系列函数的各种组合...但我在base 包中处理嵌套组设计的能力至少可以说是有限的.

下面我提供了一个示例数据集 (df) 以及结果应该是什么样子。请注意,重采样会产生不同的结果,但每个嵌套组的重采样数应该相同。

最后一个请求...我对所有选项持开放态度(例如,库(data.table)、库(引导)等),因为如果其他人觉得这篇文章有用,那就太好了。此外,其中一些包可能比base 包更有效。不过,我更喜欢不需要安装和加载额外包的解决方案。

提前感谢您的帮助。

保重。

df <- read.table(text = "GROUP  YEAR    VAR1    VAR2
a   2018    1.0 1.0
a   2018    2.0 2.0
b   2018    10  10
b   2018    20  20
b   2018    30  30
b   2018    40  40
b   2019    50  50
b   2019    60  60
b   2019    70  70
b   2019    80  80
b   2019    90  90
b   2019    100 100
b   2019    110 110
b   2019    120 120
b   2019    130 130
b   2019    140 140
b   2019    150 150
b   2019    160 160
b   2019    170 170
b   2019    180 180
b   2020    190 190
b   2020    200 200
b   2020    210 210", header = TRUE)

result <- read.table(text = "GROUP  YEAR    VAR1    VAR2
a   2018    1   1
a   2018    1   1
b   2018    20  20
b   2018    30  30
b   2018    30  30
b   2018    20  20
b   2019    70  70
b   2019    170 170
b   2019    50  50
b   2019    150 150
b   2019    70  70
b   2019    150 150
b   2019    100 100
b   2019    120 120
b   2019    50  50
b   2019    160 160
b   2019    90  90
b   2019    150 150
b   2019    170 170
b   2019    180 180
b   2020    190 190
b   2020    190 190
b   2020    190 190", header = TRUE)

【问题讨论】:

    标签: r


    【解决方案1】:

    您可以使用ave 在基础 R 中执行这种洗牌:

    Resample_function <- function(data) {
      new_data <- data[with(data, ave(seq(nrow(data)), GROUP, YEAR, 
                       FUN = function(x) sample(x, replace = TRUE))), ]
      rownames(new_data) <- NULL
      return(new_data)
    }
    
    Resample_function(df)
    

    【讨论】:

    • 感谢@Ronak_Shah!我不得不对FUN 做一个小的修改,因为我没有在示例数据集中包含一个重要的细节。我的一些嵌套组只有一个样本......这使得重新采样毫无意义,但我想按原样分析数据。这引起了一个交战消息:“要替换的项目数不是替换长度的倍数”。这是修改:FUN = function(x) x[sample.int(length(x), replace = TRUE)]
    猜你喜欢
    • 2021-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-30
    • 1970-01-01
    相关资源
    最近更新 更多