从复制二项分布比例中每行创建两个变量的矩阵

时间:2016-11-28 17:25:00

标签: r distribution replicate

所以......我有一些问题......

使用R,我试图模拟n = 10和p = 0.6的二项分布,大小为1,然后得到多少1和0,这个模拟应该重复200次,以获取200行和2列的矩阵,第一列中的数量为1,第二列中的数量为0。

我定义了一个函数,如下:

binom10.2 <- function(i){
  x <- rbinom(10,1,0.6)
  y <- as.vector(table(x))
  return(y)
}

给了我一个结果,如:

> binom10.2(i)
[1] 5 5
> binom10.2(i)
[1] 7 3
> binom10.2(i)
[1] 5 5
> binom10.2(i)
[1] 4 6

我需要这个结果,在矩阵中复制200次,如下所示:

     [,1] [,2]
  [1,]    1    9
  [2,]    7    3
  [3,]    5    5
  [4,]    4    6
  [5,]    2    8
  [6,]    5    5
  [7,]    4    6
  [8,]    4    6
  [9,]    5    5
 [10,]    3    7
 [11,]    1    9
 [12,]    3    7
 [13,]    4    6
 [14,]    5    5
 [15,]    2    8

问题是,我编写了这段代码以便得到它:

proportions10 <- t(sapply(1:200, binom10.2)
proportions10 <- t(replicate(200, binom10.2(i)))

我认为两种方式都是相同的,但是,当运行它们时,我有时会获得所需的矩阵,有时会获得一个列表,如下所示:

     [,1]      [,2]      [,3]      [,4]      [,5]      [,6]      [,7]      [,8]      [,9]      [,10]    
[1,] Integer,2 Integer,2 Integer,2 Integer,2 Integer,2 Integer,2 Integer,2 Integer,2 Integer,2 Integer,2
     [,11]     [,12]     [,13]     [,14]     [,15]     [,16]     [,17]     [,18]     [,19]     [,20]    
[1,] Integer,2 Integer,2 Integer,2 Integer,2 Integer,2 Integer,2 Integer,2 Integer,2 Integer,2 Integer,2
     [,21]     [,22]     [,23]     [,24]     [,25]     [,26]     [,27]     [,28]     [,29]     [,30]    
[1,] Integer,2 Integer,2 Integer,2 Integer,2 Integer,2 Integer,2 Integer,2 Integer,2 Integer,2 Integer,2
     [,31]     [,32]     [,33]     [,34]     [,35]     [,36]     [,37]     [,38]     [,39]     [,40]    
[1,] Integer,2 Integer,2 Integer,2 Integer,2 Integer,2 Integer,2 Integer,2 Integer,2 Integer,2 Integer,2
     [,41]     [,42]     [,43]     [,44]     [,45]     [,46]     [,47]     [,48]     [,49]     [,50]    
[1,] Integer,2 Integer,2 Integer,2 Integer,2 Integer,2 Integer,2 Integer,2 Integer,2 Integer,2 Integer,2
     [,51]     [,52]     [,53]     [,54]     [,55]     [,56]     [,57]     [,58]     [,59]     [,60]    
[1,] Integer,2 Integer,2 Integer,2 Integer,2 Integer,2 Integer,2 Integer,2 Integer,2 Integer,2 Integer,2
     [,61]     [,62]     [,63]     [,64]     [,65]     [,66]     [,67]     [,68]     [,69]     [,70]    
[1,] Integer,2 Integer,2 Integer,2 Integer,2 Integer,2 Integer,2 Integer,2 Integer,2 Integer,2 Integer,2
     [,71]     [,72]     [,73]     [,74]     [,75]     [,76]     [,77]     [,78]     [,79]     [,80]    
[1,] Integer,2 Integer,2 Integer,2 Integer,2 Integer,2 Integer,2 Integer,2 Integer,2 Integer,2 Integer,2
     [,81]     [,82]     [,83]     [,84]     [,85]     [,86]     [,87]     [,88]     [,89]     [,90]    
[1,] Integer,2 Integer,2 Integer,2 Integer,2 Integer,2 Integer,2 Integer,2 Integer,2 Integer,2 Integer,2
     [,91]     [,92]     [,93]     [,94]     [,95]     [,96]     [,97]     [,98]     [,99]     [,100]   
[1,] Integer,2 Integer,2 Integer,2 Integer,2 Integer,2 Integer,2 Integer,2 Integer,2 Integer,2 Integer,2
     [,101]    [,102]    [,103]    [,104]    [,105]    [,106]    [,107]    [,108]    [,109]    [,110]   
[1,] Integer,2 Integer,2 Integer,2 Integer,2 Integer,2 Integer,2 Integer,2 Integer,2 Integer,2 Integer,2
     [,111]    [,112]    [,113]    [,114]    [,115]    [,116]    [,117]    [,118]    [,119]    [,120]   

对我而言,根据我运行代码的次数,我得到第一个所需的矩阵,而其他一些时间,我得到第二个列表,没用。我想第一个矩阵总是出现,无论我运行代码多少次......

有人可以帮忙吗?

3 个答案:

答案 0 :(得分:1)

试试这个:

# define parameters
n <- 10     # number of trials
p <- 0.6    # probability of success
nexp <- 200 # number of experiments

# run the simulation
res <- replicate(200, rbinom(1, size=n, prob=p))
cbind(res, n-res)

获取输出:

        res  
  [1,]   7 3
  [2,]   8 2
  [3,]   6 4
  [4,]   7 3
  [5,]   5 5
  [6,]   6 4

答案 1 :(得分:0)

1的总和显示每次复制的成功次数。从10中减去该数字会导致数字失败。

这是我的方式:

 x = replicate(200, expr={sum(rbinom(10, 1, .6))})
 m = matrix(0, nrow=200, ncol=2)
 m[,2]=x
 m[,1]=10-x

答案 2 :(得分:0)

这里不需要replicaterbinom(n, size, prob)直接为您提供n次独立审判的成功次数。您需要n = 200观察:每次观察都是size = 10的试用,而prob0.6

r <- rbinom(200, 10, 0.6)

由于您希望在矩阵中使用第二列=观察到的零数:从10减去r以获得第二列:

bin10.2 <- matrix(c(r, 10 - r), nrow = 200)