novi novi - 1 year ago 108
R Question

Generate uniform random variable when lower boundary is close to zero

When I run in R

runif(100,max=0.1, min=1e-10)

I get 100 uniformly distributed random variables between 0.1 and 0.0001. So, there is no random values between 0.0001 and the min value (

How to generate uniform random variables on the whole interval (between min and max values).

Answer Source

(Edited to replace exp(-10) with 1e-10)

Given your max of 0.1 and min of 1e-10, the probability that any given value is less than 0.1 is given by

(1e-4 - 1e-10) / (0.1 - 1e-10) = 9.99999e-04

The probability that 100 random values from this distribution are all greater than 1e-4 is

(1 - 9.99999e-04) ^ 100 = 0.90479

About 90.5%. So you shouldn't be at all surprised that in a draw of 100 numbers from this distribution, you didn't see any less than 1e-4. This is expected more than 90.5% of the time theoretically. We can even verify this in simulation:

set.seed(47) # for replicability
# 100,000 times, draw 100 numbers from your uniform distribution
d = replicate(n = 1e5, runif(100, max = 0.1, min = 1e-10))
# what proportion of the 100k draws have no values less than 1e-4?
mean(colSums(d < 1e-4) == 0)
# [1] 0.90557
# 90.56% - very close to our calculated 90.48%

For more precision, we can repeat with even more replications

# same thing, 1 million replications
d2 = replicate(n = 1e6, runif(100, max = 0.1, min = 1e-10))
mean(colSums(d2 < 1e-4) == 0)
# [1] 0.90481

So, with 1MM replications, runif() is almost exactly meeting expectations. It is off from the expectation by 0.90481 - 0.90479 = 0.00002. I would say there is absolutely no evidence that runif is broken.

We can even plot the histograms for some of the replications. Here are the first 20:

par(mfrow = c(4, 5), mar = rep(0.4, 4))
for (i in 1:20) hist(d[, i], main = "", xlab  = "", axes = F)

enter image description here

To get more very low random values, your two choices are (a) draw more numbers from the uniform or (b) change distributions to one that has more weight closer to 0. You could try an exponential distribution? Or maybe, if you want a hard upper bound as well you could scale a beta distribution? Your other choice is to not use random values at all, maybe you want evenly spaced values and seq is what you're looking for?

Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download