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

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

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

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

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

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

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

nx7onnlm

nx7onnlm1#

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

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

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

tmp <- dat[sample(seq_len(nrow(dat)), 1000, replace=TRUE),]

cumfun <- function(x) lengths(Reduce(union, x, accumulate=TRUE))
idcum <- cumfun(tmp$ID)
indcum <- cumfun(tmp$individual)

plot(idcum, indcum, type="l")

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

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

axzmvihb

axzmvihb2#

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

library(dplyr)

N_id <- 2000
N_individuals <- 50

df_full <- data.frame(id = 1:N_id,
                      individual = sample(1:N_individuals, N_id, replace = TRUE))

df_sample <- slice_sample(df_full, n = 1000, replace = TRUE)

unique_individuals <- length(unique(df_sample$individual))

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

N_id <- 2000
N_individuals <- 50
N_draws <- 1000

sample_df_parameterized <- function(n_id, n_individuals, n_draws) {
  
  df_full <- data.frame(id = 1:n_id,
                        individual = sample(1:n_individuals, n_id, replace = TRUE))
  
  df_sample <- slice_sample(df_full, n = n_draws, replace = TRUE)
  
  unique_individuals <- length(unique(df_sample$individual))
  
  result_df <- data.frame(n_id = n_id,
                          n_individuals = n_individuals,
                          n_draws = n_draws,
                          unique_individuals = unique_individuals)
  
  return(result_df)
  
}

sample_df_parameterized(n_id = N_id,
                        n_individuals = N_individuals,
                        n_draws = N_draws)

相关问题