根据列中的分类值从具有不同绘制的数据表中随机抽样

时间:2019-07-14 15:28:02

标签: r random statistics-bootstrap

我有一个具有20个不同样本ID的数据表。现在,我想使用固定的ID分布随机减小样本大小,这意味着我想随机绘制,比如说'A'中有7个值,而'B'中有5个值,所以我的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)

1 个答案:

答案 0 :(得分:0)

我认为您对此太想了。首先,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