Создайте матрицу из двух переменных в каждой строке из повторяющейся пропорции биномиального распределения.

Так... у меня проблема...

Используя R, я пытаюсь смоделировать биномиальное распределение с n = 10 и p = 0,6, с размером 1, а затем, получая, сколько единиц и нулей я получаю, и это моделирование должно быть повторено 200 раз, чтобы принять матрица из 200 строк и двух столбцов с количеством единиц в первом столбце и количеством нулей во втором столбце.

Я определил функцию так:

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]   

Для меня не имеет смысла, что иногда, в зависимости от того, сколько раз я запускаю код, я получаю первую нужную матрицу, а иногда я получаю второй список, бесполезный. Я бы хотел, чтобы первая матрица всегда появлялась независимо от того, сколько раз я запускаю код...

Может ли кто-нибудь помочь?


person Emilio Mármol Sánchez    schedule 28.11.2016    source источник
comment
i в вашей функции не относится ни к какому выражению.   -  person Pierre L    schedule 28.11.2016
comment
Попробуйте удалить i из заголовка function(), чтобы функция не принимала аргументов. Затем используйте t(replicate(200, binom10.2()))   -  person Pierre L    schedule 28.11.2016
comment
хм... я все еще получаю ту же ошибку, удаляя (i) в функции, я все еще получаю второй список вместо нужной матрицы... и при многократном запуске кода я, наконец, получаю желаемую матрицу, но это то, что сводит меня с ума, так как этого не должно происходить... Я должен получить либо одно, либо другое, но не оба, в зависимости от запуска случайного кода   -  person Emilio Mármol Sánchez    schedule 28.11.2016


Ответы (3)


Сумма 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
person A.Yazdiha    schedule 28.11.2016
comment
Вау, спасибо, я должен был попробовать создать матрицу, а затем добавить значения... Очень полезный способ сделать это! ! ! Но до сих пор не знаю, почему способ, который я пытался сделать, иногда давал желаемые результаты, а некоторые другие - нет. В любом случае, спасибо за простой способ справиться с этим - person Emilio Mármol Sánchez; 28.11.2016
comment
Итак, я понимаю, почему t(replicate(200, binom10.2())) должно работать, но аргумент 1:200 в sapply является аргументом функции binom10.2, где на самом деле не является аргументом, поскольку функция binom10.2 не должна принимать аргумент. Возможно, также отредактируйте свой основной пост о i в качестве входных данных для функции. - person A.Yazdiha; 28.11.2016

Просто попробуйте это:

# 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
person Sandipan Dey    schedule 28.11.2016

Здесь нет необходимости в replicate. rbinom(n, size, prob) непосредственно дает вам количество успехов для n независимых испытаний. Вам нужно n = 200 наблюдения: каждое наблюдение — это испытание size = 10, а prob — это 0.6.

r <- rbinom(200, 10, 0.6)

Поскольку вы хотите, чтобы это было в матрице со вторым столбцом = количество наблюдаемых нулей: вычтите r из 10, чтобы получить второй столбец:

bin10.2 <- matrix(c(r, 10 - r), nrow = 200)
person Vidhya G    schedule 28.11.2016
comment
согласен с вами, это просто для того, чтобы удовлетворить требование ОП о проведении 200 экспериментов, что обычно выполняется путем репликации, а не путем указания количества наблюдений, а просто другим способом сделать то же самое. - person Sandipan Dey; 29.11.2016