按列模拟二项分布

时间:2014-03-14 16:25:12

标签: r matrix simulation

我想模拟矩阵每列的数字0和1的二项分布。每列的成功概率都会发生变化。第1列的成功概率为1/ncol(matrix)。第2列的成功概率为2/ncol(matrix)

我尝试了几种不同的方法来生成我正在寻找的数据,但是我要么得到第1列的警告或数字列表而不是整个矩阵。

更好的是能够使用概率矩阵而不是像1 / ncol(矩阵)这样的东西。

假设我想要一个200行乘1000列的矩阵。对于每一列,我想使用概率矩阵中的元素定义的概率生成0和1的二项分布。在第1列中获得1的概率由概率矩阵的第一个元素定义,并且是.001。在第2列中获得1的概率由概率矩阵的第二个元素定义,并且是.002等。我不确定我是否应该在rbinom()内或matrix()内进行apply() datasim = matrix(0, nrow=200, ncol=1000) colnames(datasim) = c(1:1000) prob.matrix = as.matrix(c(1:1000)) prob.matrix = prob.matrix/1000 newdatasim = apply(???, 2, function(x) { rbinom(??, 1, prob.matrix)}) 或其他。

{{1}}

请帮助,谢谢!

2 个答案:

答案 0 :(得分:4)

使用prob.matrix作为向量比使用矩阵更简单。这是一个较小的例子:

sapply(1:10/10,function(p) rbinom(20,1,p))

如果你想预先分配一个矩阵......

set.seed(42)
datasim     <- matrix(,20,10)
datasim[,]  <- sapply(1:10/10,function(p) rbinom(20,1,p))

给出了

datasim
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
 [1,]    1    1    0    1    1    0    1    1    0     1
 [2,]    1    0    0    1    0    1    1    1    1     1
 [3,]    0    1    0    1    0    1    1    1    1     1
 [4,]    0    1    1    0    1    1    1    1    1     1
 [5,]    0    0    0    1    1    0    0    1    1     1
 [6,]    0    0    1    0    1    0    1    0    1     1
 [7,]    0    0    1    0    0    0    0    1    1     1
 [8,]    0    1    0    1    0    0    0    0    1     1
 [9,]    0    0    1    1    0    1    1    1    1     1
[10,]    0    1    0    0    0    1    0    1    1     1
[11,]    0    0    0    0    1    0    0    1    1     1
[12,]    0    1    0    0    0    0    1    1    1     1
[13,]    1    0    0    0    0    0    1    1    1     1
[14,]    0    0    1    0    1    1    0    1    1     1
[15,]    0    0    0    0    1    1    0    1    1     1
[16,]    1    1    1    1    1    1    1    1    1     1
[17,]    1    0    0    0    0    1    0    1    1     1
[18,]    0    0    0    0    1    1    1    1    1     1
[19,]    0    1    0    0    1    0    0    1    1     1
[20,]    0    0    0    0    1    0    1    1    1     1

答案 1 :(得分:1)

编辑:这是我找到的解决方案之一。弗兰克的解决方案也有效。谢谢!

#Generate matrix with 200 rows x 1000 columns
#Each column has a binomial distribution of 0's and 1's
#The probability is determined by the column number divided by the total number of columns
datasim = matrix(0, nrow=200, ncol=100)
datasim[1:10,1:10]
probmatrix = col(datasim)/1000 
probmatrix[1:10,1:10]
datasim2 = matrix(rbinom(200 * 1000,1,probmatrix), nrow=200, ncol=1000, byrow=FALSE)
datasim2[1:10,1:10]