Моделирование нескольких биномиальных случайных чисел в R - PullRequest
1 голос
/ 19 апреля 2019

У меня есть следующий алгоритм

Шаг 1. Создайте X1 = x1 ~ Bin (6,1 / 3)

Шаг 2. Создайте X2 | X1 = x1 ~ Bin (6-x1, (1/3) / (1-1 / 3))

Шаг 3. Генерируйте X3 | X1 = x1, X2 = x2 ~ Bin (6-x1-x2, (1/3) / (1-1 / 3-1 / 3))

Шаг 4. Повторите шаг 1-3 N раз.

Вот мой подход к реализации этого алгоритма в R:

mult_binom<-function(n) #n=6
{
  n=1000
  random_vectors<-Matrix(0,n,3)

  for(i in 1:n){

    X1<-rbinom(n,3,1/3) 

    X2<-rbinom(n-X1,3,(1/3)/(1-(1/3)))

    X3<-rbinom(n-X1-X2,3,(1/3)/(1-(1/3)-(1-3)))


    arr<-c(X1,X2,X3)


  }
  for(j in 1:n){

    random_vectors[j]<-arr[j]
  }
  return(random_vectors)
}

Вызов функции как mult_bin(6) дает аналогичную матрицу, как показано ниже

1000 x 3 sparse Matrix of class "dgCMatrix"

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

и продолжается до [1000,]

Я не ожидал этого результата.

Почему там точки?

Что я сделал не так?

1 Ответ

3 голосов
/ 19 апреля 2019

есть несколько ошибок в вашей реализации. Наиболее важным является то, что первый аргумент rbinom - это не параметр n из биномиального распределения, а количество случайных чисел, которые вы хотите сгенерировать.

Вот мое решение. Моя функция возвращается только в эксперименте. Затем я использую replicate, чтобы вернуть результат нескольких (в моем случае 5) экспериментов:

myfun <- function(){

  x1 <- rbinom(1, 6, 1/3) 
  x2 <- rbinom(1, 6 - x1, (1/3)/(1-(1/3)))
  x3 <- rbinom(1, 6 - x1 - x2, (1/3)/(1-(1/3)-(1/3)))

  return(c(X1 = x1, X2 = x2, X3 = x3))  
}

    set.seed(1)
    replicate(5, myfun())
   [,1] [,2] [,3] [,4] [,5]
X1    1    4    4    0    3
X2    2    0    1    2    1
X3    3    2    1    4    2

В этом выводе каждый столбец является результатом одного эксперимента. Вы можете видеть, что числа всегда складываются до 6. Обратите внимание, что я установил случайное начальное число с set.seed. Это гарантирует воспроизводимость ваших результатов.

В ваших выходных данных появляются точки, потому что вы используете пакет Matrix для создания объекта Matrix вместо работы с «нормальными» матрицами. Обычно вы создаете матрицу с matrix, а не Matrix.

...