Learn R Programming

oeli (version 0.7.7)

dmvnorm_cpp: Multivariate normal distribution

Description

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

The function pmvnorm() computes the cumulative distribution function of a multivariate normal distribution, or the probability of a rectangle if lower is specified.

The function rmvnorm() samples from a multivariate normal distribution.

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

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

Usage

dmvnorm_cpp(x, mean, Sigma, log = FALSE)

pmvnorm_cpp( x, mean, Sigma, abseps = 0.001, lower = NULL, method = "genz", draws = 500L )

rmvnorm_cpp(mean, Sigma, log = FALSE)

dmvnorm(x, mean, Sigma, log = FALSE)

pmvnorm( x, mean, Sigma, abseps = 0.001, lower = NULL, method = "genz", draws = 500 )

rmvnorm(n = 1, mean, Sigma, log = FALSE)

Value

For dmvnorm(): The density value.

For pmvnorm(): The value of the distribution function or the rectangle probability.

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

Arguments

x

[numeric()]
A quantile vector of length p.

mean

[numeric()]
The mean vector of length p.

For the functions without suffix _cpp, it can also be of length 1 for convenience, then rep(mean, p) is considered.

Sigma

[matrix()]
The covariance matrix of dimension p.

For rmvnorm(), arbitrary dimensions (i.e., full rows and corresponding columns) of Sigma can be 0.

For the functions without suffix _cpp and if p = 1, it can also be a single numeric for convenience. Note that Sigma is this case is a variance, which is a different format than in stats::dnorm() or stats::rnorm, which require a standard deviation.

log

[logical(1)]
Consider the log-normal distribution?

abseps

[numeric(1)]
The absolute error tolerance for method = "genz".

lower

[numeric() | NULL]
Optionally lower limits of length p, where NULL corresponds to -Inf.

For the functions without suffix _cpp, it can also be of length 1 for convenience, then rep(lower, p) is considered.

method

[character(1)]
Either "genz" or "ghk", see the details.

draws

[integer(1)]
The number of Halton points for method = "ghk".

n

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

Details

For p <= 3, pmvnorm() computes the probability exactly: the bivariate case uses the algorithm of Genz (2004) and the trivariate case integrates the bivariate probability conditional on the third component.

For p > 3, the argument method selects the approximation:

  • "genz" calls mvtnorm::pmvnorm with the randomized Quasi-Monte-Carlo procedure by Genz and Bretz. The argument abseps controls the accuracy of the Gaussian integral approximation.

  • "ghk" uses the Geweke-Hajivassiliou-Keane simulator on draws quasi-random Halton points. The result is deterministic and smooth in x, mean, and Sigma, which makes it suitable for likelihood evaluations, and its accuracy increases with draws.

See Also

Other simulation helpers: Simulator, correlated_regressors(), ddirichlet_cpp(), dmixnorm_cpp(), dtnorm_cpp(), dwishart_cpp(), gaussian_tv(), simulate_markov_chain()

Examples

Run this code
x <- c(0, 0)
mean <- c(0, 0)
Sigma <- diag(2)

# compute density
dmvnorm(x = x, mean = mean, Sigma = Sigma)
dmvnorm(x = x, mean = mean, Sigma = Sigma, log = TRUE)

# compute CDF
pmvnorm(x = x, mean = mean, Sigma = Sigma)

# compute rectangle probability
pmvnorm(x = x, mean = mean, Sigma = Sigma, lower = -1)

# simulate in higher dimensions
pmvnorm(x = rep(0, 5), mean = 0, Sigma = diag(5), method = "ghk")

# sample
rmvnorm(n = 3, mean = mean, Sigma = Sigma)
rmvnorm(mean = mean, Sigma = Sigma, log = TRUE)

Run the code above in your browser using DataLab