2016-11-28 2 views
0

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

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

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

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] 

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

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

+0

Параметр 'i' в вашей функции не ссылается к любому выражению. –

+0

Попробуйте удалить i из заголовка 'function()', чтобы функция не принимала никаких аргументов. Затем используйте 't (replicate (200, binom10.2())) –

+0

hmmm ... Я все равно получаю ту же ошибку, исключая (i) в функции, которую я все еще получаю во втором списке вместо требуемой матрицы. ,и при попытке запустить код много раз, я, наконец, получаю желаемую матрицу, но это то, что заставляет меня сходить с ума, так как этого не должно произойти ... Я должен получить либо тот или иной, но не оба в зависимости от случайного кода, работающего –

ответ

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 
+0

Wow thanks , Я должен был попытаться создать матрицу, а затем добавить значения ... Очень полезный способ сделать это! ! ! Но все равно не знаю, почему то, что я пытаюсь сделать, иногда показывало желаемые результаты, а некоторые другие не делали. Во всяком случае, спасибо за простой способ справиться с этим –

+0

Итак, я понимаю, почему 't (replicate (200, binom10.2()))' должен работать, но аргумент '1: 200' в' sapply' является аргументом для function 'binom10.2', где фактически не является аргументом, так как функция' binom10.2' не должна принимать никаких аргументов. Возможно, также отредактируйте свой основной пост о 'i' в качестве входа в функцию. –

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 
0

Там нет необходимости 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) 
+0

согласны с вами, это просто для удовлетворения потребности OP в проведении 200 экспериментов, которые обычно выполняются с помощью репликации, а не путем указания количества наблюдений, а другой способ сделать то же самое. –