Как векторизовать расчет вероятности по нескольким параметрам? - PullRequest
0 голосов
/ 05 ноября 2018

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

Я пробовал разные версии apply, но не могу получить желаемый результат (dim = c (5,4,2). Должны ли мои компоненты компонента быть в списке вместо матрицы?

set.seed(123)

#Data
X <- matrix(sample(c(0,1), 20, replace = TRUE, prob = c(.6, .4)),
               nrow = 5, ncol = 4)

#Params
parameters <-  matrix(runif(8), nrow = 2, ncol = 4)

#Would like to vectorize this
dbinom(X, 1, parameters[1,], log = TRUE)
dbinom(X, 1, parameters[2,], log = TRUE)

1 Ответ

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

Мы перебираем строки parameters с apply и применяем dbinom

out1 <- do.call(`c`, apply(parameters, 1, function(x) 
               list(dbinom(X, 1, x, log = TRUE))))

identical(out1[[1]], dbinom(X, 1, parameters[1,], log = TRUE))
#[1] TRUE

identical(out1[[2]], dbinom(X, 1, parameters[2,], log = TRUE))
#[1] TRUE

Или используя pmap

library(purrr)
out2 <- pmap(list(x = list(X), size = 1, prob = split(parameters, 
              row(parameters)), log = TRUE), dbinom)

identical(out1, out2)
#[1] TRUE
...