several modifs - pkg looks better (but untested)
[valse.git] / pkg / R / generateXY.R
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, pi)
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, apply( newBlockX, 1, function(row)
34 mvrnorm(1, row %*% beta[,,i], covY[,,i]) ) )
35 }
36
37 shuffle = sample(n)
38 list("X"=X[shuffle,], "Y"=Y[shuffle,], "class"=class[shuffle])
39 }