Duarte Viana <viana.sptd <at> gmail.com> writes: > > Thanks Rob and Ravi for the replies. > > Let me try to explain my problem. I am trying to make a kind of > sensitivity analysis where I have 5 parameters (the margins of the > Latin hypercube), 3 of them are proportions that should sum to one. My > idea is to obtain uniform combinations of the 3 proportion-parameters > with the other two parameters. The uniformity should be maintained in > order to guarantee that each parameter (out of 5) have its own range > of values equally represented (for model output analyses). > > Theoretically the 3 proportion-parameters might be regarded as one in > which the configuration of the proportions that sum to one vary. I > think I can visualize it like a set of permutations, more or less like > in the example below: > > 0.1 - 0.1 - 0.8 > 0.1 - 0.2 - 0.7 > 0.1 - 0.3 - 0.6 > . > . > . > 0.1 - 0.1 - 0.8 > 0.2 - 0.1 - 0.7 > 0.3 - 0.1 - 0.6 > . > . > . > 0.8 - 0.1 - 0.1 > 0.7 - 0.2 - 0.1 > 0.6 - 0.3 - 0.1 > . > . > . > and so on, until all possible combinations are represented (and doing > it with more values) and then combined with the other two parameters > as to form a Latin hypercube. > > The solutions given in the thread sent by Ravi work fine for random > generation of the 3 proportion-parameters, but it is hard to make a > Latin hypercube out of that with two more parameters. > > Cheers, > > Duarte > >
Duarte, The commmon practice in your situation is draw the K parameters together as a uniform Latin hypercube on 0-1 and then transform the margins of the hypercube to the desired distributions. Easy Example Parameter 1: normal(1, 2) Parameter 2: normal(3, 4) Parameter 3: uniform(5, 10) require(lhs) N <- 1000 x <- randomLHS(N, 3) y <- x y[,1] <- qnorm(x[,1], 1, 2) y[,2] <- qnorm(x[,2], 3, 4) y[,3] <- qunif(x[,3], 5, 10) par(mfrow=c(2,2)) apply(x, 2, hist) par(mfrow=c(2,2)) apply(y, 2, hist) The transformed distributions maintain their "Latin" properties, but are in the form of new distributions. In your case, you'd like the first three columns to be transformed into a correlated set that sums to one. Still follow the pattern... x <- randomLHS(N, 5) y <- x y[,1] <- x[,1]/rowSums(x[,1:3]) y[,2] <- x[,2]/rowSums(x[,1:3]) y[,3] <- x[,3]/rowSums(x[,1:3]) y[,4] <- x[,4] y[,5] <- x[,5] par(mfrow=c(2,3)) apply(x, 2, hist) par(mfrow=c(2,3)) apply(y, 2, hist) all.equal(rowSums(y[,1:3]), rep(1, nrow(y))) The uniform properties are gone as you can see here... par(mfrow=c(1,1)) pairs(x) paris(y, col="red") But, the "Latin" properties of the first three margins are maintained as in this smaller example... N <- 10 x <- randomLHS(N, 5) y <- x y[,1] <- x[,1]/rowSums(x[,1:3]) y[,2] <- x[,2]/rowSums(x[,1:3]) y[,3] <- x[,3]/rowSums(x[,1:3]) y[,4] <- x[,4] y[,5] <- x[,5] pairs(x) pairs(y, col="red") You could also look into a dirichlet type transform as I posted here http://tolstoy.newcastle.edu.au/R/e5/help/08/11/8420.html Rob ______________________________________________ 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.