2012-01-24 2 views
0

Я хочу генерировать бивариаты следующим образом. У меня четыре списка с равной длиной n. Мне нужно использовать первые два списка в качестве списков средств, а последние два - в списках дисперсий и генерировать нормальные бивариаты.Как сгенерировать такие случайные числа в R

Например n=2, у меня есть списки, как (1, 2), (3, 4), (5, 6), (7, 8), и мне нужно c(rnorm(1, mean=1, sd=sqrt(5)), rnorm(1, mean=2, sd=sqrt(6)), rnorm(1, mean=3, sd=sqrt(7)), rnorm(1, mean=4, sd=sqrt(8)),ncol=2)

Как я могу это сделать в R более функциональным способом?

ответ

3

Вот один из способов:

m <- 1:4 
s <- 5:8 
rnorm(n = 4, mean = m, sd = s) 
[1] 4.599257 1.661132 16.987241 3.418957 

Это работает, потому что, как и многие другие функции R, rnorm() является «векторизации», что означает, что она позволяет называть его один раз с векторами в качестве аргументов, а не много раз в цикл, который выполняет итерацию через элементы векторов.

Ваша основная задача состоит в том, чтобы преобразовать «списки», в которых у вас есть свои аргументы прямо сейчас, в векторы, которые могут быть переданы в rnorm().

ПРИМЕЧАНИЕ: Если вы хотите создать более одного - скажем, 3 - случайный вариабель для каждой средней/sd комбинации, rnorm(n=rep(3,4), mean=m, sd=s) не будет работать. Вам придется либо: (a) повторить элементы векторов m и s, таких как rnorm(n=3*4, mean=rep(m, each=3), sd=rep(s, each=3)); или (b) использовать mapply(), как описано в ответе DWin.

+0

Я только что дал поддельный ввод. Вы не можете назначить m и s таким образом. Я дам вам произвольные списки 'list1', ...,' list4'. Благодарю. –

+0

Не могли бы вы показать структуру своих списков? Являются ли они формы 'list (1,2)', 'list (3,4)'? Или 'c (1,2)', 'c (3,4)' и т. Д.? Или 'list (list (1,2), list (3,4))' ...? Нам нужно больше деталей, если мы хотим вам помочь ... –

2

Я отвезу тебя на слове, что у вас есть список, то есть в Rlist:

plist <- list(a=list(1, 2), b=list(3, 4), c=list(5, 6), d=list(7, 8)) 
means <-plist[c("a","b")] # or you could use means <- plist[1:2] 
vars <- plist[c("c","d")] 
mapply(rnorm, n=rep(1,4), unlist(means), unlist(vars)) 
#[1] 3.9382147 1.0502025 0.9554021 -7.3591917 

Вы использовали термин Двумерный. Вы действительно хотели иметь пары x, y, которые имели определенную корреляцию?

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