truncdist | R Documentation |
The cumulative distribution function for
a truncated distribution is 0
for
x <= truncmin
, 1
for
truncmax < x
, and in between is
as follows:
(pdist(x, ...) - pdist(truncmin, ...)) /
(pdist(truncmax, ...) - pdist(truncmin, ...))
The density, quantile, and random number generation functions are similarly defined from this.
dtruncdist(x, ..., dist='norm', truncmin=-Inf, truncmax=Inf) ptruncdist(q, ..., dist='norm', truncmin=-Inf, truncmax=Inf) qtruncdist(p, ..., dist='norm', truncmin=-Inf, truncmax=Inf) rtruncdist(n, ..., dist='norm', truncmin=-Inf, truncmax=Inf)
x, q |
numeric vector of quantiles |
p |
numeric vector of probabilities |
n |
number of observations. If |
... |
other arguments to be passed to the
corresponding function for the indicated
|
dist |
Standard |
truncmin, truncmax |
lower and upper truncation points, respectively. |
NOTE: Truncation is different from "censoring", where it's known that an observation lies between certain limits; it's just not known exactly where it lies between those limits.
By contrast, with a truncated distribution, events
below truncmin
and above truncmax
may exist but are not observed. Thus, it's not
known how many events occur outside the given
range, truncmin
to truncmax
, if any.
Given data believed to come from a truncated
distribution, estimating the parameters provide
a means of estimating the number of unobserved
events, assuming a particular form for their
distribution.
1. Setup
dots <- list(...)
2. For dtruncdist
, return 0 for all
x
outside truncmin
and
truncmax
. For all others, compute as
follows:
dots$x <- truncmin
ddist <- paste0('d', dist)
pdist <- paste0('p', dist)
p.min <- do.call(pdist, dots)
dots$x <- truncmax
p.max <- do.call(pdist, dots)
dots$x <- x
dx <- do.call(ddist, dots)
return(dx / (p.max-p.min))
NOTE: Adjustments must be made if 'log'
appears in names(dots)
3. The computations for ptruncdist
are similar.
4. The computations for qtruncdist
are complementary.
5. For rtruncdist
, use
qtruncdist(runif(n), ...)
.
dtruncdist
gives the density,
ptruncdist
gives the distribution
function, qtruncdist
gives the
quantile function, and rtruncdist
generates random deviates.
The length of the result is determined by
n
for rtruncdist
and is the
maximum of the lengths of the numerical
arguments for the other functions.
Spencer Graves
Distributions
Normal
## ## 1. dtruncdist ## # 1.1. Normal dx <- dtruncdist(1:4) # check all.equal(dx, dnorm(1:4)) # 1.2. Truncated normal between 0 and 1 dx01 <- dtruncdist(seq(-1, 2, .5), truncmin=0, truncmax=1) # check dx01. <- c(0, 0, 0, dnorm(c(.5, 1))/(pnorm(1)-pnorm(0)), 0, 0) all.equal(dx01, dx01.) # 1.3. lognormal meanlog=log(100), sdlog = 2, truncmin=500 x10 <- 10^(0:9) dx10 <- dtruncdist(x10, log(100), 2, dist='lnorm', truncmin=500) # check dx10. <- (dtruncdist(log(x10), log(100), 2, truncmin=log(500)) / x10) all.equal(dx10, dx10.) # 1.4. log density of the previous example dx10log <- dtruncdist(x10, log(100), 2, log=TRUE, dist='lnorm', truncmin=500) all.equal(dx10log, log(dx10)) # 1.5. Poisson without 0. dPois0.9 <-dtruncdist(0:9, lambda=1, dist='pois', truncmin=0) # check dP0.9 <- c(0, dpois(1:9, lambda=1)/ppois(0, lambda=1, lower.tail=FALSE)) all.equal(dPois0.9, dP0.9) ## ## 2. ptruncdist ## # 2.1. Normal px <- ptruncdist(1:4) # check all.equal(px, pnorm(1:4)) # 2.2. Truncated normal between 0 and 1 px01 <- ptruncdist(seq(-1, 2, .5), truncmin=0, truncmax=1) # check px01. <- c(0, 0, (pnorm(c(0, .5, 1)) - pnorm(0)) /(pnorm(1)-pnorm(0)), 1, 1) all.equal(px01, px01.) # 2.3. lognormal meanlog=log(100), sdlog = 2, truncmin=500 x10 <- 10^(0:9) px10 <- ptruncdist(x10, log(100), 2, dist='lnorm', truncmin=500) # check px10. <- (ptruncdist(log(x10), log(100), 2, truncmin=log(500))) all.equal(px10, px10.) # 2.4. log of the previous probabilities px10log <- ptruncdist(x10, log(100), 2, log=TRUE, dist='lnorm', truncmin=500) all.equal(px10log, log(px10)) ## ## 3. qtruncdist ## # 3.1. Normal qx <- qtruncdist(seq(0, 1, .2)) # check all.equal(qx, qnorm(seq(0, 1, .2))) # 3.2. Normal truncated outside (0, 1) qx01 <- qtruncdist(seq(0, 1, .2), truncmin=0, truncmax=1) # check pxmin <- pnorm(0) pxmax <- pnorm(1) unp <- (pxmin + seq(0, 1, .2)*(pxmax-pxmin)) qx01. <- qnorm(unp) all.equal(qx01, qx01.) # 3.3. lognormal meanlog=log(100), # sdlog=2, truncmin=500 qlx10 <- qtruncdist(seq(0, 1, .2), log(100), 2, dist='lnorm', truncmin=500) # check plxmin <- plnorm(500, log(100), 2) unp. <- (plxmin + seq(0, 1, .2)*(1-plxmin)) qlx10. <- qlnorm(unp., log(100), 2) all.equal(qlx10, qlx10.) # 3.4. previous example with log probabilities qlx10l <- qtruncdist(log(seq(0, 1, .2)), log(100), 2, log.p=TRUE, dist='lnorm', truncmin=500) # check all.equal(qlx10, qlx10l) ## ## 4. rtruncdist ## # 4.1. Normal set.seed(1) rx <- rtruncdist(9) # check set.seed(1) all.equal(rx[1], rnorm(1)) # Only the first observation matches; check that. # 4.2. Normal truncated outside (0, 1) set.seed(1) rx01 <- rtruncdist(9, truncmin=0, truncmax=1) # check pxmin <- pnorm(0) pxmax <- pnorm(1) set.seed(1) rnp <- (pxmin + runif(9)*(pxmax-pxmin)) rx01. <- qnorm(rnp) all.equal(rx01, rx01.) # 4.3. lognormal meanlog=log(100), sdlog=2, truncmin=500 set.seed(1) rlx10 <- rtruncdist(9, log(100), 2, dist='lnorm', truncmin=500) # check plxmin <- plnorm(500, log(100), 2) set.seed(1) rnp. <- (plxmin + runif(9)*(1-plxmin)) rlx10. <- qlnorm(rnp., log(100), 2) all.equal(rlx10, rlx10.)
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.