R中的分层抽样帮助

b5buobof  于 2023-09-27  发布在  其他
关注(0)|答案(1)|浏览(98)

我有600个参与者的数据框。我想得到一个近似的代表性样本,这个DF的基础上关闭年龄,性别,性别,网站,和教育n=20。它不需要完全匹配,但R不喜欢它不完全匹配。到目前为止,我已经尝试了这个代码,但它不工作。有什么建议吗?

sample_size <- 30 
sampled_data <- IGNITE %>% 
  group_by(screen_gender, age_nih_reg, screen_site,  educ,  screen_race) %>% 
  sample_n(size = sample_size, replace = FALSE) %>% 
  ungroup()
Error in `sample_n()`:
! Can't compute indices.
ℹ In group 1: `screen_gender = 1`, `age_nih_reg = 65`, `screen_site = 1`,
  `educ = 13`, `screen_race = 1`.
Caused by error:
! `size` must be less than or equal to 1 (size of data).
ℹ set `replace = TRUE` to use sampling with replacement.
Backtrace:
  1. ... %>% ungroup()
 15. base::local(...)
 16. base::eval.parent(substitute(eval(quote(expr), envir)))
 17. base::eval(expr, p)
 18. base::eval(expr, p)
 19. base::eval(...)
 20. base::eval(...)
 21. dplyr:::check_size(sample_size, n(), replace = replace)
uxhixvfz

uxhixvfz1#

由于您的组太小,简单的方法失败了。
我曾经将类似的东西黑客到{splitTools}中,这是一个为ML任务进行数据拆分的软件包。
有两个步骤:
1.运行kmeans以按指定的特征对行进行聚类。要素已缩放。有序因子是整数编码的,并且正常因子/字符向量是虚拟编码的。不要做太多的集群。在下面的代码中,我使用了6,这可能太大了。
1.使用集群ID进行分层拆分,以获得所需的组大小。

library(splitTools)

set.seed(1)

# Factor with cluster id
s <- multi_strata(iris[2:5], strategy = "kmeans", k = 6)

# Split indices
ix <- partition(s, p = c(big = 0.96667, small = 0.03333), type = "stratified")
lapply(ix, length)
iris[ix$small, 2:5]

# #  Result
#     Sepal.Width Petal.Length Petal.Width    Species
# 10          3.1          1.5         0.1     setosa
# 25          3.4          1.9         0.2     setosa
# 28          3.5          1.5         0.2     setosa
# 52          3.2          4.5         1.5 versicolor
# 63          2.2          4.0         1.0 versicolor
# 98          2.9          4.3         1.3 versicolor
# 116         3.2          5.3         2.3  virginica
# 148         3.0          5.2         2.0  virginica

相关问题