2010-08-25 4 views
7

Я хотел бы создать случайную последовательность, состоящую из 3000 точек, которая следует за нормальным распределением. Среднее значение c, а стандартное отклонение - d. Но я хотел бы, чтобы эти 3000 точек находились в диапазоне [a, b].генерировать случайную последовательность и график в R

Можете ли вы рассказать мне, как это сделать в R?

Если я хотел бы построить эту последовательность, если ось Y использует сгенерированные 3000 точек, то как мне сгенерировать точки, соответствующие оси X.

ответ

5

Вы можете сделать это с использованием стандартных функций 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)) 
3

Генерация случайной последовательности чисел из любого распределения вероятностей очень легко в R. Для того, чтобы сделать это для нормального распределения специально

c = 1 
d = 2 
x <- rnorm(3000, c, d) 

Clipping значения в x так, что они только в пределах заданного диапазона это странная вещь, которую нужно делать с образцом из обычного распределения. Возможно, то, что вы действительно хотите сделать, это образец равномерного распределения.

a = 0 
b = 3 
x2 <- runif(3000, a, b) 

Что касается распределения участка, я не уверен, что следую вашему вопросу. Вы можете построить оценку плотности для образца с этим кодом

plot(density(x)) 

Но, если вы хотите построить эти данные в качестве диаграммы рассеяния какой-то, вы на самом деле нужно создать вторую выборку номеров.

0
a = -2; b = 3 
plot(dnorm, xlim = c(a, b)) 
+0

Это не делать то, что ОП попросил. Он хочет 3000 очков после нормального распределения, поэтому «rnorm» - это способ пойти – nico

+0

это плохо сформированные вопросы ... Я предположил. Если бы это было просто на самом деле построение случайных значений по оси y, как это изложено в нем, то какой черт является запросом ограничения по оси x? Это не имеет никакого смысла. Я предполагаю, что случайные значения запрашиваются для создания функции плотности, как и @joFrhwld и @Joris Mays. Это правильный способ создания функции плотности. – John

1

Если Я хотел бы построить эту последовательность, если Y-ось использует сгенерированные 3000 точек, то как я должен генерировать точки, соответствующие X-оси.

Если вы просто генерировать свои очки, как JoFrhwld сказал с

y <- rnorm(3000, 1, 2) 

Тогда

plot(y) 

будет автоматически построить их, используя индексы массива в качестве оси х

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