# tmvnorm: Truncated Multivariate Normal Density In tmvtnorm: Truncated Multivariate Normal and Student t Distribution

## Description

This function provides the joint density function for the truncated multivariate normal distribution with mean equal to `mean` and covariance matrix `sigma`, lower and upper truncation points `lower` and `upper`. For convenience, it furthermore serves as a wrapper function for the one-dimensional and bivariate marginal densities `dtmvnorm.marginal()` and `dtmvnorm.marginal2()` respectively when invoked with the `margin` argument.

## Usage

 ```1 2 3 4 5 6``` ```dtmvnorm(x, mean = rep(0, nrow(sigma)), sigma = diag(length(mean)), lower=rep(-Inf, length = length(mean)), upper=rep( Inf, length = length(mean)), log=FALSE, margin=NULL) ```

## Arguments

 `x` Vector or matrix of quantiles. If `x` is a matrix, each row is taken to be a quantile. `mean` Mean vector, default is `rep(0, nrow(sigma))`. `sigma` Covariance matrix, default is `diag(length(mean))`. `lower` Vector of lower truncation points, default is `rep(-Inf, length = length(mean))`. `upper` Vector of upper truncation points, default is `rep( Inf, length = length(mean))`. `log` Logical; if `TRUE`, densities d are given as log(d). `margin` if `NULL` then the joint density is computed (the default), if `MARGIN=1` then the one-dimensional marginal density in variate `q` (`q = 1..length(mean)`) is returned, if `MARGIN=c(q,r)` then the bivariate marginal density in variates `q` and `r` for `q,r = 1..length(mean)` and q != r is returned.

## Details

The computation of truncated multivariate normal probabilities and densities is done using conditional probabilities from the standard/untruncated multivariate normal distribution. So we refer to the documentation of the mvtnorm package and the methodology is described in Genz (1992, 1993).

## Author(s)

Stefan Wilhelm <[email protected]>

## References

Genz, A. (1992). Numerical computation of multivariate normal probabilities. Journal of Computational and Graphical Statistics, 1, 141–150

Genz, A. (1993). Comparison of methods for the computation of multivariate normal probabilities. Computing Science and Statistics, 25, 400–405

Johnson, N./Kotz, S. (1970). Distributions in Statistics: Continuous Multivariate Distributions Wiley & Sons, pp. 70–73

Horrace, W. (2005). Some Results on the Multivariate Truncated Normal Distribution. Journal of Multivariate Analysis, 94, 209–221

`ptmvnorm`, `pmvnorm`, `rmvnorm`, `dmvnorm`, `dtmvnorm.marginal` and `dtmvnorm.marginal2` for marginal density functions
 ``` 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54``` ```dtmvnorm(x=c(0,0), mean=c(1,1), upper=c(0,0)) ########################################### # # Example 1: # truncated multivariate normal density # ############################################ x1<-seq(-2, 3, by=0.1) x2<-seq(-2, 3, by=0.1) density<-function(x) { sigma=matrix(c(1, -0.5, -0.5, 1), 2, 2) z=dtmvnorm(x, mean=c(0,0), sigma=sigma, lower=c(-1,-1)) z } fgrid <- function(x, y, f) { z <- matrix(nrow=length(x), ncol=length(y)) for(m in 1:length(x)){ for(n in 1:length(y)){ z[m,n] <- f(c(x[m], y[n])) } } z } # compute density d for grid d=fgrid(x1, x2, density) # plot density as contourplot contour(x1, x2, d, nlevels=5, main="Truncated Multivariate Normal Density", xlab=expression(x[1]), ylab=expression(x[2])) abline(v=-1, lty=3, lwd=2) abline(h=-1, lty=3, lwd=2) ########################################### # # Example 2: # generation of random numbers # from a truncated multivariate normal distribution # ############################################ sigma <- matrix(c(4,2,2,3), ncol=2) x <- rtmvnorm(n=500, mean=c(1,2), sigma=sigma, upper=c(1,0)) plot(x, main="samples from truncated bivariate normal distribution", xlim=c(-6,6), ylim=c(-6,6), xlab=expression(x[1]), ylab=expression(x[2])) abline(v=1, lty=3, lwd=2, col="gray") abline(h=0, lty=3, lwd=2, col="gray") ```