2016-10-09 4 views
1

Я довольно новичок в R и могу использовать некоторую базовую помощь. Я хотел бы генерировать суммы из двух обычных случайных величин (дисперсия = 1 для каждого), поскольку их средства раздвигаются и выстраивают результаты. Основная идея: если средства достаточно далеко друг от друга, распределение будет бимодальным. Вот код, который я пытаюсь:Кривая плотности участка смеси двух нормальных распределений

x <- seq(-3, 3, length=500) 
for(i in seq(0, 3, 0.25)) { 
y <- dnorm(x, mean=0-i, sd=1) 
z <- dnorm(x, mean=0+i, sd=1) 
plot(x,y+z, type="l", xlim=c(-3,3)) 
} 

Несколько вопросов:

  1. Существуют ли более эффективные способы сделать это?
  2. Я получаю только один PDF-файл на своем участке. Как я могу поместить несколько PDF-файлов на один и тот же сюжет?

Заранее спасибо!

+0

Я едва вижу точку ggplot2, если вы используете сюжет. – Haboryme

+0

Я думаю, что есть проблема, потому что если вы посмотрите на «summary (y)» и «summary (z)», они имеют одинаковое среднее значение, диапазон и т. Д. –

+0

Яркий, не нужно ggplot2. Не должно быть y -0.25, -0.5, -0.75 и т. Д., А z означает 0,25, 0,5, 0,75 ... по мере прохождения цикла? Если нет, я приветствую любые предложения по исправлению! – aridneptune

ответ

1

Это не сложно сделать, используя основные функции R. Сначала определим функцию f вычислить плотность смеси нормальной:

## `x` is an evaluation grid 
## `dev` is deviation of mean from 0 
f <- function (x, dev) { 
    (dnorm(x, -dev) + dnorm(x, dev))/2 
    } 

Затем мы используем sapply перебрать различные dev, чтобы получить соответствующую плотность:

## `dev` sequence to test 
dev <- seq(0, 3, 0.25) 
## evaluation grid; extending `c(-1, 1) * max(dev)` by 4 standard deviation 
x <- seq(-max(dev) -4, max(dev) + 4, by = 0.1) 
## density matrix 
X <- sapply (dev, f, x = x) 

Наконец мы используем matplot для черчения:

matplot(x, X, type = "l", lty = 1) 

enter image description here


Больше объяснения

Во sapply, x не меняется, в то время как мы собираем и попробовать один элемент dev каждой итерации. Это как

X <- matrix(0, nrow = length(x), ncol = length(dev)) 
for (i in 1:length(dev)) X[, i] <- f(x, dev[i]) 

matplot(x, X) будет строить колонны X один за другим, против x.

+0

Большое спасибо за вашу помощь! Чтобы быть ясным, команда 'sapply' применяет функцию' f' к последовательности 'dev' в' x = x' для каждого 'x' в [-4, + 4] на 0,1 приращения, да? Нужно ли «matplot» для построения элементов в матрице (n x 1) X, правильно? Еще раз спасибо! – aridneptune

+0

Я очень ценю вашу помощь. – aridneptune

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