Примерно так, но я не проверил правильность. Ваш:
func <- function(x) {
(dmultinom(c(x[c(1,2)],50-sum(x[c(1,2)])), size = NULL, rep(1/3,3), log = FALSE))/(x[3]^2+x[4]^3)
}
может быть записан как:
func <- function(x) {
a <- x[c(1,2)]
b <- 50 - (a[1] + a[2])
d <- c(a, b)
e <- dmultinom(d, size = NULL, rep(1/3,3), log = FALSE)
f <- x[3]^2 + x[4]^3
e / f
}
Часть d
, которую вы можете векторизовать с помощью матричных вычислений, как:
A <- M[, 1:2]
B <- 50 - (A[,1] + A[,2])
D <- cbind(A, B)
Без погружения в dmultinom()
, часть e
может быть вычислена через apply()
как:
prob <- rep(1/3, times = 3L)
E <- apply(D, MARGIN = 1L, function(d) {
dmultinom(d, size = NULL, prob = prob, log = FALSE)
})
Часть f
, которую вы можете векторизовать с помощью матричных вычислений, как:
F <- M[,3]^2 + M[,4]^3
, которая дает следующее:
Y <- apply(M, 1, function(v) func(v))
может быть записано как:
Y <- E / F
Отказ от ответственности: не проверено, но вы должны получить представление о том, как векторизовать и избежать дублирования вещей.
PS. Если вы посмотрите на dmultinom()
, я думаю, вы также можете векторизовать это аналогичным образом. Не исключено, что вы сможете избавиться от оставшегося звонка apply()
.