Вы можете сделать это с использованием стандартных функций R, таких как:
c <- 1
d <- 2
a <- -2
b <- 3.5
ll <- pnorm(a, c, d)
ul <- pnorm(b, c, d)
x <- qnorm(runif(3000, ll, ul), c, d)
hist(x)
range(x)
mean(x)
sd(x)
plot(x, type='l')
Функция pnorm используется для определения пределов использования для равномерного распределения, данные затем генерируются из однородного, а затем преобразуются обратно в нормальное состояние.
Это еще проще, используя пакет РАСПР:
library(distr)
N <- Norm(c,d)
N2 <- Truncate(N, lower=a, upper=b)
plot(N2)
x <- r(N2)(3000)
hist(x)
range(x)
mean(x)
sd(x)
plot(x, type='l')
Обратите внимание, что в обоих случаях среднее не с и сд не d. Если вы хотите, чтобы среднее значение и sd полученных усеченных данных были c и d, вам нужно, чтобы родительский дистрибутив (перед усечением) имел разные значения (более высокий sd, средний зависит от усекающих значений), при этом эти значения были бы хорошая домашняя проблема для курса математики/статистики. Если это то, что вам действительно нужно, добавьте комментарий или отредактируйте вопрос, чтобы сказать это конкретно.
Если вы хотите, чтобы генерировать данные из untruncated нормально, но только участок данные в пределах диапазона [а, Ь], то просто использовать ylim аргумент для построения:
plot(rnorm(3000, c, d), ylim=c(a,b))
Это не делать то, что ОП попросил. Он хочет 3000 очков после нормального распределения, поэтому «rnorm» - это способ пойти – nico
это плохо сформированные вопросы ... Я предположил. Если бы это было просто на самом деле построение случайных значений по оси y, как это изложено в нем, то какой черт является запросом ограничения по оси x? Это не имеет никакого смысла. Я предполагаю, что случайные значения запрашиваются для создания функции плотности, как и @joFrhwld и @Joris Mays. Это правильный способ создания функции плотности. – John