随机采样 Dataframe ,直到检测到所有个体

x33g5p2x  于 2023-04-27  发布在  其他
关注(0)|答案(2)|浏览(121)

我的数据示例如下(尽管我有数百行):每个ID都是唯一的,并且可能有多个个体与一个ID相关联(例如,个体A和D)。

  1. ID individual
  2. 1 A
  3. 2 B
  4. 3 A
  5. 4 C
  6. 5 D
  7. 6 D
  8. 7 D

我想随机选择一个ID 1000次,并有机会对同一ID进行重新采样,并存储在此采样方案中累积了多少个唯一个体。
然后,我想生成一个图,显示需要选择多少ID来累积所有独特的个体,以便曲线达到渐近线,其中ID在x轴上,个体在y轴上。

**编辑:**我对上面想要的情节描述不清楚,编辑如下:

我想生成一个图,显示ID必须被选择(替换)的次数,以累积所有唯一个体..而不是与唯一个体相关的唯一ID的数量。一旦所有唯一个体累积,该曲线应达到渐近线x次ID被选择。
例如,如果有500个ID与200个个体相关联,我想对500个ID的池进行1000次采样(或多次采样),同时在每次采样后将ID放回池中,以查看我们必须对池进行多少次采样才能使所有200个个体累积。

nx7onnlm

nx7onnlm1#

下面是一个基于R的尝试,使用一个自定义函数来计算累积的唯一值:
较大的示例数据:

  1. set.seed(2)
  2. dat <- data.frame(ID=1:250, individual=sample(1:100, 500, replace=TRUE))
  3. length(unique(dat$individual))
  4. ##100

采样、计数累积值并绘图:

  1. tmp <- dat[sample(seq_len(nrow(dat)), 1000, replace=TRUE),]
  2. cumfun <- function(x) lengths(Reduce(union, x, accumulate=TRUE))
  3. idcum <- cumfun(tmp$ID)
  4. indcum <- cumfun(tmp$individual)
  5. plot(idcum, indcum, type="l")

如果你想添加一条最适合你选择的线和一些更好的轴,你也可以把图整理一下:

  1. plot(idcum, indcum, type="l", ylim=c(0,100), las=1,
  2. xlab="Cumulative ID count", ylab="Cumulative Individuals count",
  3. cex.lab=0.8, cex.axis=0.8, lty=2)
  4. f <- function(x,a,b) {x/(a+b*x)}
  5. fit <- nls(indcum ~ f(idcum,a,b), start=c(a=1,b=1))
  6. curve(do.call(f, c(list(x), coef(fit))), add=TRUE, col="red")

展开查看全部
axzmvihb

axzmvihb2#

我想随机选择一个ID 1000次,并有机会对同一ID进行重新采样,并存储在此采样方案中累积了多少个唯一个体。
您可以使用slice_sample from dplyr对 Dataframe 中的行进行采样。例如:

  1. library(dplyr)
  2. N_id <- 2000
  3. N_individuals <- 50
  4. df_full <- data.frame(id = 1:N_id,
  5. individual = sample(1:N_individuals, N_id, replace = TRUE))
  6. df_sample <- slice_sample(df_full, n = 1000, replace = TRUE)
  7. unique_individuals <- length(unique(df_sample$individual))

然后,我想生成一个图,显示需要选择多少ID来累积所有独特的个体,以便曲线达到渐近线,其中ID在x轴上,个体在y轴上。
你可以将其封装到一个函数中,为不同数量的id和individuals生成值(并为此绘制),然后使用ggplot或其他绘图工具绘制不同的值。然而,这让我觉得这是一个组合问题,可能更适合https://math.stackexchange.com/,因为这些值将完全取决于id和individuals的数量。
编辑:在函数中:

  1. N_id <- 2000
  2. N_individuals <- 50
  3. N_draws <- 1000
  4. sample_df_parameterized <- function(n_id, n_individuals, n_draws) {
  5. df_full <- data.frame(id = 1:n_id,
  6. individual = sample(1:n_individuals, n_id, replace = TRUE))
  7. df_sample <- slice_sample(df_full, n = n_draws, replace = TRUE)
  8. unique_individuals <- length(unique(df_sample$individual))
  9. result_df <- data.frame(n_id = n_id,
  10. n_individuals = n_individuals,
  11. n_draws = n_draws,
  12. unique_individuals = unique_individuals)
  13. return(result_df)
  14. }
  15. sample_df_parameterized(n_id = N_id,
  16. n_individuals = N_individuals,
  17. n_draws = N_draws)
展开查看全部

相关问题