2016-09-27 2 views
0

При запуске в R

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

я получаю 100 равномерно распределенные случайные величины между 0,1 и 0,0001. Таким образом, нет никакого случайного значения от 0,0001 до минимального значения (min=1e-10).

Как создать равномерные случайные величины на всем интервале (между значениями min и max)?Генерация равномерной случайной величины, когда нижняя граница близка к нулю

+0

Что вы подразумеваете под «случайной величиной»? – Hugh

+0

реализация случайной переменной – novi

+0

ваш последний раунд редактирования кажется странным для меня ... «значения» являются множественными, а не единственными ... и ваше последнее предложение - вопрос ... но что угодно ... –

ответ

2

(ред заменить exp(-10) с 1e-10)

Учитывая ваш макс 0.1 и мин 1e-10, вероятность того, что любое данное значение меньше 1e-4 дается

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

Вероятность что 100 случайных величин из этого распределения все больше 1e-4 составляет

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

Около 90,5%. Поэтому вы не должны удивляться, что в розыгрыше 100 номеров из этого дистрибутива вы не видели меньше 1e-4. Это теоретически ожидается более 90,5% времени. Мы даже можем проверить это в моделировании:

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% 

Для большей точности, мы можем повторить с еще большим количеством репликаций

# 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 

Так, с 1мм репликаций, runif() почти точно соответствует ожиданиям. Он отклоняется от ожидания на 0.90481 - 0.90479 = 0.00002. Я бы сказал, что нет абсолютно никаких доказательств того, что runif не работает.

Мы можем даже построить гистограммы для некоторых повторений. Вот первые 20:

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

Looks pretty uniform

Гистограммы показывают 10 бар каждый, так что каждый бар составляет около .01 шириной (так как общий диапазон составляет от около 0,1). Диапазон, который вас интересует, составляет около 0.0001 широкий. Чтобы увидеть, что в гистограмме нам нужно построить 1000 баров за сюжет, в 100 раз больше баров. Использование 1000 ящиков не имеет большого смысла, когда есть только 100 значений. Конечно, почти все бункеры будут пустыми, а самый низкий, в частности, будет пустым примерно в 90% случаев, как мы рассчитали выше.

Чтобы получить более низкие случайные значения, ваши два варианта: (a) нарисуйте больше чисел из равномерного или (b) измените распределения на тот, у которого больше веса ближе к 0. Вы можете попробовать экспоненциальное распределение? Или, может быть, если вы хотите получить твердую верхнюю границу, вы можете масштабировать бета-дистрибутив? Ваш другой выбор состоит в том, чтобы вообще не использовать случайные значения, возможно, вам нужны равномерно разнесенные значения, а seq - это то, что вы ищете?

+0

Значение min равно 0,0000000001 или что-то в этом роде (а не exp (-10), как я писал). Простите за это. Но мне нужно равномерное распределение, которое охватывает весь интервал. Мне кажется, что у R есть некоторые ограничения, которые я не могу преодолеть. – novi

+2

Если вы не отредактируете свой вопрос, чтобы показать его, мы не уверены, что существует ограничение в R. В небольших числах могут быть ограничения в арифметике с плавающей запятой, поскольку распределение возможных чисел становится неоднородным, но это не должно происходить при 1е-10. – Spacedman

+1

красивый маленький-множественный сюжет. Могу ли я рекомендовать 'col =" gray "' в ваших 'hist()' вызовах ...? –

3

Может быть, вы не генерировать достаточно, чтобы сделать это достаточно вероятно, что вы уже видели один:

> range(runif(100,max=0.1,min=exp(-10))) 
[1] 0.00199544 0.09938462 
> range(runif(1000,max=0.1,min=exp(-10))) 
[1] 0.0002407759 0.0999674631 
> range(runif(10000,max=0.1,min=exp(-10))) 
[1] 5.428209e-05 9.998912e-02 

Как часто они происходят?

> sum(runif(10000,max=0.1,min=exp(-10)) < .0001) 
[1] 5 

5 в этом образце 10000. Таким образом, шансы на получение одного в образце 100, ... (На самом деле вы можете решить эту проблему именно с количеством и свойствами равномерного распределения).

+0

Запуск runif (200, max = 0,1, min = exp (-10)), и я получаю очень хорошие распределенные значения между 0.000451 и 0.09921. Я сделал 15 кусков между этими двумя значениями, где каждый фрагмент содержит от 10 до 15 из этих сгенерированных значений. И есть 0 значений меньше 0,000451. Таким образом, половина моего минимального интервала не покрывается этими данными, а другая половина очень хорошо заполнена. Я получу несколько меньших значений, если я сгенерирую $ 1e^{6} $ случайные величины, но ... нет равномерного распределения для всего интервала. – novi

+1

"* половина моего интервала min-max не покрывается *" это неверно. Ваша шкала идет от 'exp (-10) = 4.5e-5' до' 0.1', общая ширина интервала '0.0999546'. Ваши наблюдаемые значения идут от '0.000451' до' 0.09921', наблюдаемого диапазона '0.098759'. Принимая отношение наблюдаемой к общей ширине, у вас есть 98,8% охвата вашего интервала! Вместо этого вы хотите, чтобы случайные значения были равномерно распределены * по шкале журнала *? – Gregor

+0

У меня плохое печатание. Значение min равно 0.0000000001 или что-то в этом роде (а не exp (-10), как я писал). Простите за это. Я не копировал-> вставлял R-код (который я, вероятно, должен делать). – novi

Смежные вопросы