Michael Friendly
2011-May-07 22:34 UTC
[R] generate multiple mvrnorm samples using apply-like
I want to generate multiple multivariate normal samples with different mean vectors and common covariance matrix. I can do this with a loop, but can't quite figure out how to do it with apply and friends. In the example below, I want values to have 3 columns: group, x, y # number of groups, and group means x <- jitter(seq(2,10,by=2)) y <- x + rnorm(length(x), 0, .5) means <- cbind(x,y) Sigma <- matrix(c(6,3,3,2),2,2) # loop version n<- 10 values <- NULL for (i in 1:length(x)) { val <- mvrnorm(n, means[i,], .5*Sigma, empirical=TRUE) values <- rbind(values, val) } group <- factor(rep(letters[1:length(x)], each=n)) values <- cbind(group=group, values) > str(values) num [1:50, 1:3] 1 1 1 1 1 1 1 1 1 1 ... - attr(*, "dimnames")=List of 2 ..$ : NULL ..$ : chr [1:3] "group" "x" "y" # trying apply vals <- apply(means, 1, function(x) mvrnorm(n, x, Sigma, empirical=TRUE)) str(vals) head(vals) But this gives me a 20 x 5 matrix, with the groups as columns and 10 pairs of rows representing x, y values. > str(vals) num [1:20, 1:5] 4.055 -0.124 3.469 -1.169 0.872 ... > head(vals) [,1] [,2] [,3] [,4] [,5] [1,] 4.0551667 4.640607 8.448465 11.795849 12.117418 [2,] -0.1242431 2.480197 7.496188 3.140649 11.473915 [3,] 3.4688356 -0.415469 5.709368 8.188018 6.832460 [4,] -1.1691558 6.579454 2.153095 10.607982 9.053140 [5,] 0.8722773 5.121265 2.168577 7.392535 6.557844 [6,] 7.2737826 2.583776 9.490320 8.144200 11.243709 > -- Michael Friendly Email: friendly AT yorku DOT ca Professor, Psychology Dept. York University Voice: 416 736-5115 x66249 Fax: 416 736-5814 4700 Keele Street Web: http://www.datavis.ca Toronto, ONT M3J 1P3 CANADA
Dennis Murphy
2011-May-08 04:34 UTC
[R] generate multiple mvrnorm samples using apply-like
Hi: Does this work? v <- lapply(1:nrow(means), function(j) mvrnorm(n, means[j, ], Sigma, empirical = TRUE)) vals <- cbind(group = rep(1:nrow(means), each = n), do.call(rbind, v)) HTH, Dennis On Sat, May 7, 2011 at 3:34 PM, Michael Friendly <friendly at yorku.ca> wrote:> I want to generate multiple multivariate normal samples with different mean > vectors > and common covariance matrix. > I can do this with a loop, but can't quite figure out how to do it with > apply and friends. > In the example below, I want values to have 3 columns: group, x, y > > # number of groups, and group means > x <- jitter(seq(2,10,by=2)) > y <- x + rnorm(length(x), 0, .5) > means <- cbind(x,y) > Sigma <- matrix(c(6,3,3,2),2,2) > > # loop version > n<- 10 > values <- NULL > > for (i in 1:length(x)) { > ? ?val <- mvrnorm(n, means[i,], .5*Sigma, empirical=TRUE) > ? ?values <- rbind(values, val) > } > group <- factor(rep(letters[1:length(x)], each=n)) > values <- cbind(group=group, values) > >> str(values) > ?num [1:50, 1:3] 1 1 1 1 1 1 1 1 1 1 ... > ?- attr(*, "dimnames")=List of 2 > ?..$ : NULL > ?..$ : chr [1:3] "group" "x" "y" > > # trying apply > vals <- apply(means, 1, function(x) mvrnorm(n, x, Sigma, empirical=TRUE)) > str(vals) > head(vals) > > But this gives me a 20 x 5 matrix, with the groups as columns and 10 pairs > of rows > representing x, y values. > >> str(vals) > ?num [1:20, 1:5] 4.055 -0.124 3.469 -1.169 0.872 ... >> head(vals) > ? ? ? ? ? [,1] ? ? ?[,2] ? ? [,3] ? ? ?[,4] ? ? ?[,5] > [1,] ?4.0551667 ?4.640607 8.448465 11.795849 12.117418 > [2,] -0.1242431 ?2.480197 7.496188 ?3.140649 11.473915 > [3,] ?3.4688356 -0.415469 5.709368 ?8.188018 ?6.832460 > [4,] -1.1691558 ?6.579454 2.153095 10.607982 ?9.053140 > [5,] ?0.8722773 ?5.121265 2.168577 ?7.392535 ?6.557844 > [6,] ?7.2737826 ?2.583776 9.490320 ?8.144200 11.243709 >> > > -- > Michael Friendly ? ? Email: friendly AT yorku DOT ca > Professor, Psychology Dept. > York University ? ? ?Voice: 416 736-5115 x66249 Fax: 416 736-5814 > 4700 Keele Street ? ?Web: ? http://www.datavis.ca > Toronto, ONT ?M3J 1P3 CANADA > > ______________________________________________ > R-help at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code. >