Вы можете сделать это, используя стандартные функции 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 используется для нахождения пределов, используемых для равномерного распределения, затем данные генерируются из униформы и затем преобразуются обратно в нормальное.
Это еще проще, используя пакет distr:
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')
Обратите внимание, что в обоих случаях среднее значение не равно c, а sd не равно d. Если вы хотите, чтобы среднее и sd полученных усеченных данных были c и d, то вам нужно, чтобы родительское распределение (перед усечением) имело другие значения (более высокое значение sd, среднее значение зависит от усеченных значений), поиск этих значений будет хорошая домашняя задача для курса математики / статистики. Если это то, что вам действительно нужно, то добавьте комментарий или отредактируйте вопрос, чтобы сказать это конкретно.
Если вы хотите сгенерировать данные из неусеченной нормали, а только построить данные в диапазоне [a, b], просто используйте аргумент ylim для построения графика:
plot( rnorm(3000, c, d), ylim=c(a,b) )