| TNorm {mixAK} | R Documentation |
Random generation for the truncated normal distribution.
The mean and standard deviation of the original normal distribution
are mean and sd. Truncation limits are given by
a, b, type of truncation is given by trunc.
rTNorm(n, mean=0, sd=1, a, b, trunc)
mean |
mean (if common for all observations) or a vector of
length n of means. |
sd |
standard deviation (if common for all observations) or a vector of
length n of standard deviations.
Note that mean and sd
must have the same length, either 1 or n. |
a |
truncation limit 1 (if common for all observations) or a
vector of length n of truncation limits 1. |
b |
truncation limit 2 (if common for all observations) or a
vector of length n of truncation limits 2. |
trunc |
type of truncation (if common for all observations) or a
vector of length n of types of truncation
If trunc is not given, it is assumed that it is equal to
4. Note that a, b and trunc
must have the same length, either 1 or n with exception that
b does not have to be supplied if trunc is 0, 1, 2 or 4.
|
n |
number of observations to be sampled. |
A numeric vector with sampled values.
Arnošt Komárek arnost.komarek[AT]mff.cuni.cz
Geweke, J. (1991). Efficient simulation from the multivariate normal and Student-t distributions subject to linear constraints and the evaluation of constraint probabilities. Computer Sciences and Statistics, 23, 571–578.
set.seed(1977) ### Not truncated normal distribution x1 <- rTNorm(1000, mean=10, sd=3) c(mean(x1), sd(x1), range(x1)) ### Truncation from left only x2 <- rTNorm(1000, mean=10, sd=3, a=7, trunc=0) c(mean(x2), sd(x2), range(x2)) ### Degenerated normal distribution x6 <- rTNorm(1000, mean=10, sd=3, a=13, trunc=1) c(mean(x6), sd(x6), range(x6)) ### Truncation from right only x3 <- rTNorm(1000, mean=10, sd=3, a=13, trunc=2) c(mean(x3), sd(x3), range(x3)) ### Truncation from both sides x4 <- rTNorm(1000, mean=10, sd=3, a=7, b=13, trunc=3) c(mean(x4), sd(x4), range(x4)) x5 <- rTNorm(1000, mean=10, sd=3, a=5.5, b=14.5, trunc=3) c(mean(x5), sd(x5), range(x5)) oldPar <- par(mfrow=c(2, 3)) hist(x1, main="N(10, 3^2)") hist(x2, main="TN(10, 3^2, 7, Infty)") hist(x6, main="TN(10, 3^2, 13, 13)") hist(x3, main="TN(10, 3^2, -Infty, 13)") hist(x4, main="TN(10, 3^2, 7, 13)") hist(x5, main="TN(10, 3^2, 5.5, 14.5)") par(oldPar) ### Different truncation limits n <- 1000 a <- rnorm(n, -2, 1) b <- a + rgamma(n, 1, 1) trunc <- rep(c(0, 1, 2, 3, 4), each=n/5) x7 <- rTNorm(n, mean=1, sd=2, a=a, b=b, trunc=trunc) cbind(trunc, a, x7)[1:10,] sum(x7[1:(n/5)] > a[1:(n/5)]) ## must be equal to n/5 cbind(trunc, a, x7)[201:210,] sum(x7[(n/5+1):(2*n/5)] == a[(n/5+1):(2*n/5)]) ## must be equal to n/5 cbind(trunc, x7, a)[401:410,] sum(x7[(2*n/5+1):(3*n/5)] < a[(2*n/5+1):(3*n/5)]) ## must be equal to n/5 cbind(trunc, a, x7, b)[601:610,] sum(x7[(3*n/5+1):(4*n/5)] > a[(3*n/5+1):(4*n/5)]) ## must be equal to n/5 sum(x7[(3*n/5+1):(4*n/5)] < b[(3*n/5+1):(4*n/5)]) ## must be equal to n/5 cbind(trunc, x7)[801:810,] ### Different moments and truncation limits n <- 1000 mu <- rnorm(n, 1, 0.2) sigma <- 0.5 + rgamma(n, 1, 1) a <- rnorm(n, -2, 1) b <- a + rgamma(n, 1, 1) trunc <- rep(c(0, 1, 2, 3, 4), each=n/5) x8 <- rTNorm(n, mean=1, sd=2, a=a, b=b, trunc=trunc) ### Truncation from left only ### (extreme cases when we truncate to the area ### where the original normal distribution has ### almost zero probability) x2b <- rTNorm(1000, mean=0, sd=1, a=7.9, trunc=0) c(mean(x2b), sd(x2b), range(x2b)) x2c <- rTNorm(1000, mean=1, sd=2, a=16, trunc=0) c(mean(x2c), sd(x2c), range(x2c)) ### Truncation from right only (extreme cases) x3b <- rTNorm(1000, mean=0, sd=1, a=-7.9, trunc=2) c(mean(x3b), sd(x3b), range(x3b)) x3c <- rTNorm(1000, mean=1, sd=2, a=-13, trunc=2) c(mean(x3c), sd(x3c), range(x3c)) ### Truncation from both sides (extreme cases) x4b <- rTNorm(1000, mean=0, sd=1, a=-9, b=-7.9, trunc=3) c(mean(x4b), sd(x4b), range(x4b)) x4c <- rTNorm(1000, mean=0, sd=1, a=7.9, b=9, trunc=3) c(mean(x4c), sd(x4c), range(x4c))