我处于一种情况,需要创建一堆假数据集,其中两个变量的总和与我的真实数据相同,但是每个变量的计数都是随机的。设置如下:

>df
    X.1  X.2
1   145   30
2    55   73

第一行总计为175,第二行总计为128。我正在寻找的是一种生成数据帧(或一堆数据帧)的方法,如下所示:
>df.2
    X.1  X.2
1   100   75
2    90   38

在df.2中,单元格计数已更改,但行仍累加到同一张表中。实际数据有几百行,但是如果有帮助的话,只有两个变量。我试图弄清楚如何用sample()做到这一点,但是还没有运气。有什么建议么?

谢谢!

最佳答案

您是从多项分布中采样的,

编辑

允许预先指定的预期细胞数

  • 多项式分布可以视每个单元为泊松分布(具有预期单元数),以总和为条件。


  • 编辑2
  • 允许任意数量的行/预期单元格计数
  • expected传递为预期的单元格计数


  • 请注意,rmultinom返回一个矩阵,其中每一列都是一个多项式样本,因此我使用t创建一个单行矩阵
    replicates <- 10
    expected <- data.frame(X1  = c(100,90,30),X2 = c(75,28,120))
    ##    X1  X2
    ## 1 100  75
    ## 2  90  28
    ## 3  30 120
    data_samples <- lapply(seq(replicates), function(i, expected){
       # create a list of expected cell counts (list element = row of expected)
      .list <- lapply(apply(expected,1,list),unlist)
       # sample from these expected cell counts and recombine into a data.frame
       as.data.frame(do.call(rbind,lapply(.list, function(.x) t(rmultinom(n = 1, prob = .x,  size = sum(.x) )))))
       }, expected = expected)
    

    这将创建具有适当属性的data.frames列表
    data_samples[[1]]
    ##    X1  X2
    ## 1 104  71
    ## 2  84  34
    ## 3  19 131
    
    
    data_samples[[5]]
    ##   X1  X2
    ## 1 88  87
    ## 2 92  26
    ## 3 27 123
    

    关于r - 生成数据,其中单元格计数是随机的,但行总和始终相同,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12031049/

    10-12 20:41
    查看更多