排列表中的n行样本导致R中列的相似元素频率

jxct1oxe  于 2023-03-20  发布在  其他
关注(0)|答案(1)|浏览(106)

我正在研究R,面临着下面的组合问题,初始情况是一个512行的 Dataframe ,包含数字1到8的所有可能的三元组组合:

expand.grid(rep(list(1:8), 3))

现在我想从这个 Dataframe 中抽取420行样本,以便每列中每个数字的频率尽可能相似。
随机产生的表看起来像这样,包含--取决于概率--非常波动的频率。

expand.grid(rep(list(1:8), 3)) %>%
  filter(row_number() %in% sample(1:nrow(.), 420))

为了获得尽可能相等的频率,是否存在某种约束?

**编辑:**但是,结果不一定是随机的。有没有办法过滤420行最多相同的频率?

bpsygsoo

bpsygsoo1#

分层抽样

请注意,expand.grid使变量的第一个变化最快,最后一个变化最慢......使用分层抽样,将行分为8*8=64个组、层,并从每个组、层中抽取6或7个样本,因为

420/64
[1] 6.5625

R代码如下:

set.seed(7 * 11 * 13)
G <- expand.grid(rep(list(1:8), 3))

M <- matrix(1:512, 64, 8, byrow=TRUE) 
rows <- apply(M, 1, \(x) sample(x, ifelse(runif(1) <= 0.5, 6, 7))) |> unlist() 
m <- length(rows)
DIFF <- setdiff(1:512, rows)
morerows <- sample(DIFF, 420 - m) 
rows <- c(rows, morerows)
GG <- G[rows, ]

然后查看每个变量的频率表:

lapply(GG, table)
$Var1

 1  2  3  4  5  6  7  8 
55 49 53 52 50 54 51 56 

$Var2

 1  2  3  4  5  6  7  8 
51 54 53 54 51 51 52 54 

$Var3

 1  2  3  4  5  6  7  8 
53 53 50 54 54 54 50 52

相关问题