【问题标题】:Random sampling from a data.table with different draws based on the categorical value in a column根据列中的分类值从具有不同抽取的 data.table 中随机抽样
【发布时间】:2019-07-14 15:28:02
【问题描述】:

我有一个包含不同 20 个样本 ID 的数据表。现在我想用固定的 ID 分布随机减少样本量,这意味着我想随机抽取 7 个值来自 'A' 和 5 个值来自 'B' 所以我的 data.table 有 12 行而不是20,而不是建立我生成的列的平均值。现在我想通过引导重复 100 次,看看平均值是否不同,所以我想做一些统计数据,比如 sd、mean 等。

背景是我有一个小样本集和一个更大的样本集。我想减少较大的样本集以评估较小样本集的准确性。我对 R 相当陌生,并感谢任何帮助。谢谢

data <- data.table(Sample = c('A','A','A','A','A','A','A','A','A','A','A','B','B','B','B','B','B','B','B','B','B','B'),
                   weight=rnorm(1:22),
                   height=rnorm(1:22))

# I want to draw randomly 7 values out of A and 5 values out of B and than get the mean of this new df and do that whole step 100 times
#to again build the mean over all 100 replicates

set.seed(4561)

new_df <- data %>%
  group_by(Sample) %>% 
  nest() %>%            
  mutate(n = c(7,5)) %>% 
  mutate(samp = map2(data, n, sample_n)) %>% 
  select(Sample, samp) %>%
  unnest() %>%
  mutate(diff.height.weight = height-weight) %>%
  mutate(means = mean(diff.height.weight))%>%
  bootstraps(means, times=100)

【问题讨论】:

    标签: r random statistics-bootstrap


    【解决方案1】:

    我认为你想多了。首先,R 是一个庞大的基础包和贡献包。相同的函数名称可以并且确实存在于不同的包中。您需要告诉我们您使用 library() 函数加载了哪些包,否则我们无法在没有大量试验和错误的情况下重现您的代码。如果我理解正确,您想从两个样本中随机选择值,将它们组合并计算平均值,并且您想这样做 100 次。首先创建数据:

    data <- data.frame(Sample = rep(c('A', 'B'), each=11), weight=rnorm(22),
         height=rnorm(22))
    data$diff <- data$height - data$weight
    str(data)
    # 'data.frame': 22 obs. of  4 variables:
    #  $ Sample: Factor w/ 2 levels "A","B": 1 1 1 1 1 1 1 1 1 1 ...
    #  $ weight: num  0.5324 -0.0905 0.1565 -0.7373 -0.2013 ...
    #  $ height: num  -0.3654 0.8166 -0.0606 -0.5014 0.9261 ...
    #  $ diff  : num  -0.898 0.907 -0.217 0.236 1.127 ...
    

    我只是使用数据框来保持简单。 rnorm() 函数只需要知道要创建多少个值,它不需要向量。我们也只计算一次差异并将它们与其他信息一起存储在数据框中。

    现在我们需要确定哪些值是 A,哪些是 B:

    rows <- seq_along(data$diff)
    a <- rows[data$Sample=="A"]
    b <- rows[data$Sample=="B"]
    

    要抽取样本,我们只需从行号中选择:

    set.seed(42)
    smp <- c(sample(a, 7), sample(b, 5))
    # smp <- c(sample(a, 7, replace=TRUE), sample(b, 5, replace=TRUE))
    

    注释掉的行绘制带有替换的示例,这是引导的典型示例,因此您可能需要它。现在我们计算样本的平均值:

    mn <- mean(data$diff[smp])
    mn
    # [1] -0.05161422
    

    最后我们这样做了 100 次:

    mns <- replicate(100, mean(data$diff[c(sample(a, 7), sample(b, 5))]))
    # mns <- replicate(100, mean(data$diff[c(sample(a, 7, replace=TRUE), 
             sample(b, 5, replace=TRUE))]))
    mean(mns)
    # [1] 0.2700163
    sd(mns)
    # [1] 0.2819093
    quantile(mns)
    #           0%         25%         50%         75%        100% 
    #  -0.41813426  0.09958492  0.26071086  0.45378608  0.94693304
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-23
      • 1970-01-01
      • 2022-11-28
      • 1970-01-01
      • 1970-01-01
      • 2019-09-20
      相关资源
      最近更新 更多