tmvnorm {tmvtnorm} | R Documentation |
These functions provide the density function and a random number
generator for the truncated multivariate normal
distribution with mean equal to mean
and covariance matrix
sigma
, lower and upper truncation points lower
and upper
dtmvnorm(x, mean = rep(0, nrow(sigma)), sigma = diag(length(mean)), lower=rep(-Inf, length = length(mean)), upper=rep( Inf, length = length(mean))) rtmvnorm(n, mean = rep(0, nrow(sigma)), sigma = diag(length(mean)), lower=rep(-Inf, length = length(mean)), upper=rep( Inf, length = length(mean)))
x |
Vector or matrix of quantiles. If x is a matrix, each row is taken to be a quantile. |
n |
Number of observations. |
mean |
Mean vector, default is rep(0, length = ncol(x)) . |
sigma |
Covariance matrix, default is diag(ncol(x)) . |
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)) . |
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).
The generation of random numbers from a truncated multivariate normal distribution is done using rejection sampling
from the standard multivariate normal distribution. So we use the function rmvnorm
of the mvtnorm package.
In order to speed up the generation of N samples from the truncated distribution,
we first calculate the acceptance rate alpha from the truncation points and then generate N/alpha samples iteratively
until we have got N samples. This typically does not take more then 2-3 iterations.
Stefan Wilhelm <Stefan.Wilhelm@financial.com>
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(x=c(0,0)) 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")