On Oct 10, 2011, at 12:44 PM, Uwe Ligges wrote:



On 10.10.2011 18:10, Alexander Engelhardt wrote:
Hey list,

This might be a more general question and not that R-specific. Sorry for
that.

I'm trying to draw a random vector of 4 numbers that sum up to 1.
My first approach was something like

a <- runif(1)
b <- runif(1, max=1-a)
c <- runif(1, max=1-a-b)
d <- 1-a-b-c

but this kind of distorts the results, right?
Would the following be a good approach?

w <- sample(1:100, 4, replace=TRUE)
w <- w/sum(w)

Yes, although better combine both ways to

w <- runif(4)
w <- w / sum(w)

For the non-statisticians in the audience like myself who didn't know what that distribution might "look like" (it being difficult to visualize densities on your 3-dimensional manifold in 4-space), here is my effort to get an appreciation:

 M4 <- matrix(runif(40000), ncol=4)
 M4 <- M4/rowSums(M4)
# just a larger realization of Ligges' advice
 colMeans(M4)
[1] 0.2503946 0.2499594 0.2492118 0.2504342
 plot(density(M4[,1]))
 lines(density(M4[,2]),col="red")
 lines(density(M4[,3]),col="blue")
 lines(density(M4[,4]),col="green")

plot(density(rowSums(M4[,1:2])))

 plot(density(rowSums(M4[,1:3])))
plot(density(rowSums(M4[,2:4])))

# rather kewl results, noting that these are a reflecion around 0.5 of the single vector densities.


Uwe Ligges



I'd prefer a general algorithm-kind of answer to a specific R function
(if there is any). Although a function name would help too, if I can
sourcedive.

--

David Winsemius, MD
West Hartford, CT

______________________________________________
R-help@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.

Reply via email to