Имитация данных в R - PullRequest
       1

Имитация данных в R

0 голосов
/ 29 ноября 2018

Для части моего статистического задания я должен изучить распределение среднего распределения Пуассона.Меня просят создать функцию poi_bar со входами n, N, лямбда, где у нас есть вектор длины N, и каждая отдельная запись в векторе равна среднему из n чисел, выбранных в распределении Пуассона с lambda = lambda.

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

 poi_bar = function(n, N, lambda) {

    V = rep(c(mean(rpois(n, lambda = lambda))), times = N)

    return(V)
 }

Чтобы проверить, действительно ли это работает, я попытался n = 8, N = 25, лямбда = 17, и результат былэто:

 poi_bar(8,25,17)

 [1] 18.375 18.375 18.375 18.375 18.375 18.375 18.375 18.375

 [9] 18.375 18.375 18.375 18.375 18.375 18.375 18.375 18.375

 [17] 18.375 18.375 18.375 18.375 18.375 18.375 18.375 18.375

 [25] 18.375

Но я хочу, чтобы сэмплы были разными, а не просто повторялись двадцать пять раз.

1 Ответ

0 голосов
/ 29 ноября 2018

Вы должны использовать replicate, а не rep.

poi_bar <- function(n, N, lambda) {
  V <- replicate(N, mean(rpois(n, lambda = lambda)))
  V
}

set.seed(1234)
poi_bar(8, 25, 17)

Редактировать.
Хотя ответ уже был принят, я понял, что есть лучшее,более быстрый способ сделать то же самое.
Функции colMeans и rowMeans значительно быстрее, чем повторные применения mean, поэтому далее проверяется, верно ли это в этом случае использования.

Обратите внимание, что функция poi_bar такая же, как указано выше, но для того, чтобы сделать время честным, я переписал ее как однострочную.Оригинал более понятен.

poi_bar = function(n, N, lambda) {
  replicate(N, mean(rpois(n, lambda = lambda)))
}

poi_bar2 = function(n, N, lambda) {
  colMeans(replicate(N, rpois(n, lambda = lambda)))
}

Теперь проверьте их и убедитесь, что результаты идентичны.

set.seed(1234)
p <- poi_bar(8, 2500, 17)

set.seed(1234)
p2 <- poi_bar2(8, 2500, 17)

identical(p, p2)
#[1] TRUE

И время.Я буду использовать два пакета CRAN, microbenchmark и ggplot2 для отображения результатов.

library(ggplot2)
library(microbenchmark)

mb <- microbenchmark(
  v1 = poi_bar(8, 2500, 17), 
  v2 = poi_bar2(8, 2500, 17)
  )
print(mb)
autoplot(mb)

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...