Как генерировать нормально распределенные случайные числа в определенном интервале? - PullRequest
0 голосов
/ 04 февраля 2019

Я хочу сгенерировать 100 нормально распределенных случайных чисел в интервале [-50,50].Однако в приведенном ниже коде диапазон генерируемых случайных чисел составляет [-50,50].

n <- rnorm(100, -50,50)
plot(n)

Ответы [ 2 ]

0 голосов
/ 04 февраля 2019

Вы должны принести жертву.Либо ваша случайная переменная обычно не распределяется, потому что хвосты обрезаны, либо вы идете на компромисс на границах.Вы можете определить свою случайную переменную так, чтобы она «практически» лежала в диапазоне, это означает, что вы принимаете очень маленький процент за пределами.Возможно, 1% будет приемлемым выбором для вашей цели.

my_range <- setNames(c(-50, 50), c("lower", "upper"))
prob <- 0.01 # probability to lie outside of my_range
# you have to define this, 1 % in this case
my <- mean(my_range)
z_value <- qnorm(prob/2)
sigma <- (my - my_range["lower"]) / (-1 * z_value)

# proof
N <- 100000 # large number
sim_vec <- rnorm(N, my, sigma)
chk <- 1 - length(sim_vec[sim_vec >= my_range["lower"] & 
                            sim_vec <= my_range["upper"]]) / length(sim_vec) 
cat("simulated proportion outside range:", chk, "\n")
0 голосов
/ 04 февраля 2019

Ваш вопрос, как ни странно, задан, потому что кажется, что вы не до конца понимаете функцию rnorm.

rnorm(100, -50,50)

создает выборку из 100 точек, заданную нормальным распределением с центром в -50, сстандартное отклонение 50. Так что вам нужно указать, что вы хотите: 100 normally distributed random number in interval [-50,50].В нормальном распределении вы не даете верхний и нижний пределы: вероятность рисования никогда не равна 0, а просто очень мала, когда находится на несколько стандартных отклонений от среднего значения.Итак:

  • Или вы хотите нормальное распределение с центром в 0 со стандартным отклонением 50, и ответом будет rnorm(100, 0,50), но у вас будут значения выше 50 и ниже -50.
  • Или вы на самом деле хотите нормальное распределение без значения вне диапазона [-50,50], и в этом случае вам все равно нужно дать стандартное отклонение, и вам нужно будет обрезать значения, выведенные за пределы диапазона.Вы можете сделать что-то вроде: sd <- 50 n <- data.frame(draw = rnorm(1000, 0,sd)) final <- sample(n$draw[!with(n, draw > 50 | draw < -50)],100)

Вот пример того, что он делает для 2 разных sd:

sd <- 10
n1 <- data.frame(draw = rnorm(1000, 0,sd))
final1 <- sample(n$draw[!with(n, draw > 50 | draw < -50)],100)
sd <- 50
n2 <- data.frame(draw = rnorm(1000, 0,sd))
final2 <- sample(n$draw[!with(n, draw > 50 | draw < -50)],100)

par(mfrow = c(1,2))
hist(final1,main = "sd = 10")
hist(final2,main = "sd = 50")

enter image description here

  • или вы просто хотите выбрать значения в этом диапазоне с плоским распределением.В этом случае просто sample(-50:50,100,replace = T)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...