Re: [R] Creating 3 vectors that sum to 1

From: Petr Savicky <savicky_at_praha1.ff.cuni.cz>
Date: Wed, 30 Mar 2011 12:07:18 +0200

On Tue, Mar 29, 2011 at 01:42:18PM -0600, Greg Snow wrote:
> Or we could expand a bit more:
>
> require(TeachingDemos)
> require(gtools)
>
> n <- 1000
> rtrg <- matrix(NA, n, 3)
> for (i in 1:n) rtrg[i,] <- diff(c(0, sort(runif(2)), 1))
>
> rtrg2 <- matrix(NA, n, 3)
> for (i in 1:n) {
> tmp <- runif(3)
> rtrg2[i, ] <- tmp/sum(tmp)
> }
>
> rtrg3 <- matrix( rexp(n*3), ncol=3 )
> rtrg3 <- rtrg3/rowSums(rtrg3)
>
> rtrg4 <- rdirichlet(n, rep(1,3))
 

If i understand correctly, this is an efficient way to generate the uniform distribution over the triangle. Thank you for pointing this out.

Generating the uniform distribution is a natural question related to the original request.

> par(mfrow=c(2,2))
> triplot(rtrg, pch='.') # Looks more uniformly distributed

This distribution is also exactly uniform.

If x is generated as sort(runif(2)), then it is uniformly distributed over the two dimensional triangle 0 <= x[1] <= x[2] <= 1.

The transformation, which maps x to c(x[1], x[2] - x[1], 1 - x[2]) is linear, so it preserves the uniform distribution and its output ranges over the triangle with corners [1, 0, 0], [0, 1, 0], [0, 0, 1].

> triplot(rtrg2, col=2, pch='.') # Corners are sparsely populated

The ratio of the density in the center and in the corners seems to be 27.

Consider a small area A on the triangle between the points (1, 0, 0), (0, 1, 0), (0, 0, 1). The points x generated as runif(3), which are mapped to A by the transformation x/sum(x), consist of two types of points.   (1) The cone (or a pyramid) between A and the point (0, 0, 0).   (2) Points on the extension of this cone away from (0, 0, 0),

      which are still inside the cube [0, 1]^3.

The volume of (1) depends on the area of A, but not on its location within the triangle, since the height of the cone is always the same.

If A is close to a corner, then (2) is small compared to (1) (the ratio converges to 0, if A is limited to small neighborhood of the corner).

If A is close to the center of the triangle, then the union of (1) and (2) contains a cone approximately 3 times larger than the cone (1). So, the volume of (1) and (2) together is about 27 times larger than (1) alone. (The ratio converges to 27, if A is limited to small neighborhood of the center).

Petr Savicky.



R-help_at_r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code. Received on Wed 30 Mar 2011 - 10:23:06 GMT

Archive maintained by Robert King, hosted by the discipline of statistics at the University of Newcastle, Australia.
Archive generated by hypermail 2.2.0, at Wed 30 Mar 2011 - 11:00:26 GMT.

Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-help. Please read the posting guide before posting to the list.

list of date sections of archive