Fast density computation for mixture of multivariate normal distributions.
dmixn(X, mu, sigma, w, log = FALSE, ncores = 1, isChol = FALSE, A = NULL)
X | matrix n by d where each row is a d dimensional random vector. Alternatively |
---|---|
mu | an (m x d) matrix, where m is the number of mixture components. |
sigma | as list of m covariance matrices (d x d) on for each mixture component.
Alternatively it can be a list of m cholesky decomposition of the covariance.
In that case |
w | vector of length m, containing the weights of the mixture components. |
log | boolean set to true the logarithm of the pdf is required. |
ncores | Number of cores used. The parallelization will take place only if OpenMP is supported. |
isChol | boolean set to true is |
A | an (optional) numeric matrix of dimension (m x d), which will be used to store the evaluations of each mixture
density over each mixture component. It is useful when m and n are large and one wants to call |
A vector of length n where the i-the entry contains the pdf of the i-th random vector (i.e. the i-th row of X
).
NB: at the moment the parallelization does not work properly on Solaris OS when ncores>1
. Hence, dmixt()
checks if the OS
is Solaris and, if this the case, it imposes ncores==1
.
# NOT RUN { #### 1) Example use # Set up mixture density mu <- matrix(rep(c(1, 2, 10, 20), 2), 2, 2, byrow = TRUE) sigma <- list(diag(c(1, 10)), matrix(c(1, -0.9, -0.9, 1), 2, 2)) w <- c(0.1, 0.9) # Simulate X <- rmixn(1e4, mu, sigma, w) # Evaluate density ds <- dmixn(X, mu, sigma, w = w) head(ds) ##### 2) More complicated example # Define mixture set.seed(5135) N <- 10000 d <- 2 w <- rep(1, 2) / 2 mu <- matrix(rep(c(0, 0, 2, 3), 2), 2, 2, byrow = TRUE) sigma <- list(matrix(c(1, 0, 0, 2), 2, 2), matrix(c(1, -0.9, -0.9, 1), 2, 2)) # Simulate random variables X <- rmixn(N, mu, sigma, w = w, retInd = TRUE) # Plot mixture density np <- 100 xvals <- seq(min(X[ , 1]), max(X[ , 1]), length.out = np) yvals <- seq(min(X[ , 2]), max(X[ , 2]), length.out = np) theGrid <- expand.grid(xvals, yvals) theGrid <- as.matrix(theGrid) dens <- dmixn(theGrid, mu, sigma, w = w) plot(X, pch = '.', col = attr(X, "index")+1) contour(x = xvals, y = yvals, z = matrix(dens, np, np), levels = c(0.002, 0.01, 0.02, 0.04, 0.08, 0.15 ), add = TRUE, lwd = 2) # }