R自举重采样,每个id具有多个观察值,并将重采样数据作为结果返回

问题描述 投票:0回答:1

我正在尝试对我的数据进行引导。我的数据(df)具有以下形状。

id    v1    v2
1    1    1
1    0    1
1    0    1
2    2    0
2    1    1
2    0    0

据我了解,在R中初始化引导程序时,重新采样(带有替换)是在行级别完成的,对吧?

因此设置某物。像:

boot_function <- function(data, i)
{boot_data <- data[i,]}

但是,我的第一个问题是,在每个ID都有多个观察值需要在引导程序中一起保存的情况下,如何设置它?因此,在我的示例中,进行引导时,我不能简单地在行之间进行采样,而是需要在ID之间进行采样。所以代替上面的

我用过这个:

boot_function2 <- function(data, i)
{boot_data <- data[data$id %in% i,]}

这是正确的方法吗?

与上述情况有关,我想检查我的方法是否正确,所以我想我只是检查重采样的样子,但是我不知道如何返回单个引导程序样本数据帧。任何想法? (而且我知道,如果我的原始数据很大,并且像2000年一样进行复制,则返回对象可能会很大,所以我可能只想对R = 10左右进行抽查)。

r bootstrapping resample
1个回答
0
投票

这里是一种方法。我将首先生成一些虚假数据:

ids <- rep(1:3, times = 10)
values <- rnorm(30)

dat <- data.frame(ids, values)

现在我们有了数据,我们可以生成集群自举功能。这将从每个群集中采样并返回一个新的数据帧。然后,您可以应用测试统计信息:

library(tidyverse)

cluster_boot_function <- function(x){

  clusted_boot <- dat %>% 
    group_by(ids) %>% 
    nest() %>%
    mutate(samps = map(data, ~sample(.$values, size = 5, replace = T))) %>% 
    select(ids, samps) %>% 
    unnest(cols = samps)


  results <- clusted_boot %>% 
    group_by(ids) %>% 
    summarise(mu = mean(values))

  results
}

现在您只需要重复应用它(还要注意,函数中的“ x”什么都没有做,下一步只需要它就可以使用。)

这里我使用map_dfr返回每次迭代的摘要统计信息:

out <- map_df(1:100, cluster_boot_function, .id = "iteration")

这将为您提供有关引导程序每次迭代的统计信息:

# A tibble: 300 x 3
   iteration   ids    mu
   <chr>     <int> <dbl>
 1 1             1 0.150
 2 1             2 0.150
 3 1             3 0.150
 4 2             1 0.150
 5 2             2 0.150
 6 2             3 0.150
 7 3             1 0.150
 8 3             2 0.150

由此,您可以将其扩展到所需的任何类型的建模。

© www.soinside.com 2019 - 2024. All rights reserved.