Skip to contents

The function dmixnorm() computes the density of a mixture of multivariate normal distribution.

The function pmixnorm() computes the cumulative distribution function of a mixture of multivariate normal distribution.

The function rmixnorm() samples from a mixture of multivariate normal distribution.

The functions with suffix _cpp perform no input checks, hence are faster.

The univariate normal mixture is available as the special case p = 1.

Usage

dmixnorm_cpp(x, mean, Sigma, proportions)

pmixnorm_cpp(x, mean, Sigma, proportions, abseps = 0.001)

rmixnorm_cpp(mean, Sigma, proportions)

dmixnorm(x, mean, Sigma, proportions)

pmixnorm(x, mean, Sigma, proportions, abseps = 0.001)

rmixnorm(n = 1, mean, Sigma, proportions)

Arguments

x

[numeric(p)]
A quantile vector of length p, where p is the dimension.

mean

[matrix(nrow = p, ncol = c)]
The mean vectors for each component in columns.

Sigma

[matrix(nrow = p^2, ncol = c)]
The vectorized covariance matrices for each component in columns.

proportions

[numeric(c)]
The non-negative mixing proportions for each components.

If proportions do not sum to unity, they are rescaled to do so.

abseps

[numeric(1)]
The absolute error tolerance.

n

[integer(1)]
The number of requested samples.

Value

For dmixnorm(): The density value.

For pmixnorm(): The value of the distribution function.

For rmixnorm(): If n = 1 a vector of length p (note that it is a column vector for rmixnorm_cpp()), else a matrix of dimension n times p with samples as rows.

Details

pmixnorm() is based on mvtnorm::pmvnorm with the randomized Quasi-Monte-Carlo procedure by Genz and Bretz. The argument abseps controls the accuracy of the Gaussian integral approximation.

Examples

x <- c(0, 0)
mean <- matrix(c(-1, -1, 0, 0), ncol = 2)
Sigma <- matrix(c(diag(2), diag(2)), ncol = 2)
proportions <- c(0.7, 0.3)

# compute density
dmixnorm(x = x, mean = mean, Sigma = Sigma, proportions = proportions)
#> [1] 0.08873136

# compute CDF
pmixnorm(x = x, mean = mean, Sigma = Sigma, proportions = proportions)
#> [1] 0.5705027

# sample
rmixnorm(n = 3, mean = mean, Sigma = Sigma, proportions = proportions)
#>            [,1]       [,2]
#> [1,] -0.8200754 -0.1215489
#> [2,] -2.9877176  1.0323998
#> [3,] -0.1631780 -0.6575572