# [R] Latin Hypercube Sampling with a condition

Rob Carnell carnellr at battelle.org
Thu Jun 2 19:06:29 CEST 2011

```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

```