首页 > 解决方案 > R中二进制值的随机化测试

问题描述

我有一个数据集,其中包含 Yes No 的 Cancer 值。下面是数据集的示例

set.seed(42)
cancer <- sample(c("yes", "no"), 200, replace=TRUE) 
agegroup <- sample(c("35-39", "40-44", "45-49"), 200, replace=TRUE)  
agefirstchild <- sample(c("Age < 30", "Age 30 or greater", "nullipareous"), 200, replace=TRUE) 
dat <- data.frame(cancer, agegroup, agefirstchild)

我想从这个数据集中减去 5000 个样本。每个样本包含 10% 的数据集。然后取每个样本的 Cancer 的 yes 值的比例。从这 5000 个值中,我想制作来自 Cancer Yes 的 5000 个比例值的直方图,并获得该直方图的平均值、中位数、四分位数和标准差的摘要。

下面的代码计算比例。但现在我需要它来自 10% 的数据集,5000 次,并在带有摘要的直方图中

resample <- sample(dat, replace = TRUE)
proportion <- prop.table(table(resample$Cancer))

我可以找到一些如何使用数值而不是二进制值来执行此操作的示例。但是我怎样才能用二进制值执行这样的测试呢?

标签: r

解决方案


鉴于dat您在上面提出的数据集,您可以循环 5000 次,保持cancer=="yes"每次的比例,如下所示:

samplesize <- nrow(dat)*0.10
result_vec <- vector(length=samplesize)
for(i in 1:5000) {
    rows_to_keep <- sample(1:nrow(dat), size=samplesize, replace=F)
    result_vec[i] <- mean(dat$cancer[rows_to_keep] == "yes")
}

hist(result_vec)

这里使用二进制变量的“技巧”是首先为条件为真/假时创建一个 1 和 0 的向量,然后取该向量的平均值。这为您提供了条件为真的时间百分比。

如果您想计算其他感兴趣的数量(例如,5000 比例的标准偏差),您可以执行以下操作:

sd(result_vec)

推荐阅读