【问题标题】:Make a matrix of two variables each row from replicating binomial distribution proportion从复制二项分布比例制作每行两个变量的矩阵
【发布时间】:2016-11-28 17:24:59
【问题描述】:

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

使用 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]   

对我来说,有时,根据我运行代码的次数,我得到第一个所需的矩阵,而在其他一些时候,我得到第二个列表,这毫无意义。无论我运行多少次代码,我都希望第一个矩阵始终出现......

有人可以帮忙吗?

【问题讨论】:

  • 函数中的i 没有引用任何表达式。
  • 尝试从标头function() 中删除 i,以便该函数不接受任何参数。然后使用t(replicate(200, binom10.2()))
  • hmmm...我仍然得到同样的错误,消除了函数中的(i)我仍然得到第二个列表而不是所需的矩阵......并且在尝试多次运行代码时,我终于得到了想要的矩阵,但这就是让我发疯的原因,因为这不应该发生......我应该得到一个或另一个,但不能两者都取决于运行的随机代码

标签: r distribution replicate


【解决方案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

【讨论】:

    【解决方案2】:

    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
    

    【讨论】:

    • 哇,谢谢,我应该尝试创建一个矩阵,然后添加值...非常有用的方法! ! !但仍然不知道为什么我尝试做的方式有时确实显示了预期的结果,而其他一些则没有。无论如何,感谢您提供简单的处理方法
    • 所以我明白为什么t(replicate(200, binom10.2())) 应该工作,但sapply 中的1:200 参数是函数binom10.2 的参数,实际上不是参数,因为函数@987654328 @ 不应该接受任何参数。也许还可以编辑您关于 i 的主要帖子作为函数的输入。
    【解决方案3】:

    这里不需要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)
    

    【讨论】:

    • 同意你的观点,这只是为了满足 OP 运行 200 个实验的要求,这通常是通过复制来完成的,而不是通过指定观察次数,只是做同样事情的不同方式。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-15
    • 1970-01-01
    相关资源
    最近更新 更多