228ee602 |
1 | #' generateXY |
2 | #' |
3 | #' Generate a sample of (X,Y) of size n |
4 | #' |
5 | #' @param n sample size |
6 | #' @param π proportion for each cluster |
7 | #' @param meanX matrix of group means for covariates (of size p) |
8 | #' @param covX covariance for covariates (of size p*p) |
9 | #' @param β regression matrix, of size p*m*k |
10 | #' @param covY covariance for the response vector (of size m*m*K) |
11 | #' |
12 | #' @return list with X and Y |
13 | #' |
14 | #' @export |
15 | generateXY <- function(n, π, meanX, β, covX, covY) |
16 | { |
17 | p <- dim(covX)[1] |
18 | m <- dim(covY)[1] |
19 | k <- dim(covY)[3] |
20 | |
21 | X <- matrix(nrow = 0, ncol = p) |
22 | Y <- matrix(nrow = 0, ncol = m) |
23 | |
24 | # random generation of the size of each population in X~Y (unordered) |
25 | sizePop <- rmultinom(1, n, π) |
26 | class <- c() #map i in 1:n --> index of class in 1:k |
27 | |
28 | for (i in 1:k) |
29 | { |
30 | class <- c(class, rep(i, sizePop[i])) |
31 | newBlockX <- MASS::mvrnorm(sizePop[i], meanX, covX) |
32 | X <- rbind(X, newBlockX) |
33 | Y <- rbind(Y, t(apply(newBlockX, 1, function(row) MASS::mvrnorm(1, row %*% |
34 | β[, , i], covY[, , i])))) |
35 | } |
36 | |
37 | shuffle <- sample(n) |
38 | list(X = X[shuffle, ], Y = Y[shuffle, ], class = class[shuffle]) |
39 | } |