生成细胞计数随机的数据,但行总和始终相同

use*_*761 5 r

我需要创建一堆假数据集,其中两个变量的总和与我的实际数据相同,但每个变量的计数是随机的.这是设置:

>df
    X.1  X.2
1   145   30
2    55   73   
Run Code Online (Sandbox Code Playgroud)

第一行总和为175,第二行为128.我正在寻找的是一种生成数据帧(或一堆数据帧)的方法,如下所示:

>df.2
    X.1  X.2
1   100   75
2    90   38
Run Code Online (Sandbox Code Playgroud)

在df.2中,单元格计数已更改,但行仍然汇总到同一个表.实际数据有数百行,但如果有帮助则只有两个变量.我试图找出如何做到这一点,sample()但没有运气.有什么建议?

谢谢!

Aar*_*ica 6

也许你在寻找r2dtable

> r2dtable(2, c(175,128), c(190, 113))
[[1]]
     [,1] [,2]
[1,]  108   67
[2,]   82   46

[[2]]
     [,1] [,2]
[1,]  114   61
[2,]   76   52
Run Code Online (Sandbox Code Playgroud)

此外,这是@ mnel的答案版本,用于rmultinom进行n复制,然后结合结果.并不是说如果你只需要一些重复就真的很重要,但既然rmultinom可以做到,我想我会看到它是如何完成的.

n <- 10
e <- cbind(X1  = c(100,90,30),X2 = c(75,28,120))
aperm(array(sapply(1:nrow(e), function(i) 
        rmultinom(n, rowSums(e)[i], (e/rowSums(e))[i,])),
      dim=c(ncol(e),n,nrow(e))), c(3,1,2))
Run Code Online (Sandbox Code Playgroud)


mne*_*nel 5

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


编辑

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

  • 多项分布可以被认为是每个单元的泊松分布(具有预期的单元计数),条件是总和.

编辑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)
Run Code Online (Sandbox Code Playgroud)

这将创建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
Run Code Online (Sandbox Code Playgroud)