R中随机生成的矩阵

时间:2016-11-12 09:03:38

标签: r

我想在R中创建两个矩阵,使得矩阵x的元素应该是任意分布的随机数,然后我计算这个2 * 2矩阵的colSums和rowSums。然后,我想从中生成矩阵y任何分布,使得第一个子集2 * 2元素是随机的,然后第三行和列是行和列元素的总和,然后第四行和列是随机的,使得rowSums和colSums为3:4等于第一个矩阵x的colSums和行和。如何在R?

中创建具有这些属性的两个随机矩阵
     x=matrix(c(100, 50, 0, 250), nrow=2)
     csum1=colSums(x)
     rsum1=rowSums(x)

     y=matrix(c(15, 60, 75, 25,60, 25, 85, 215, 75, 85, 160, 240, 
     75, 165, 240, 0), ncol=4) 1
     csum2=colSums(y[3:4,c(-3,-4)])
     rsum2=rowSums(y[c(-3,-4),3:4])

    > x
     [,1] [,2]
 [1,]  100    0
 [2,]   50  250
    > y
     [,1] [,2] [,3] [,4]
[1,]   15   60   75   75
[2,]   60   25   85  165
[3,]   75   85  160  240
[4,]   25  215  240    0

2 个答案:

答案 0 :(得分:0)

我正在尝试使用正态分布的随机数。使用MASS包中的mvrnorm()获取相同内容。?mvrnorm获取更多信息

library(MASS)

mu1 = 2  #mean for first distribution
mu2 = 3  #mean for second distribution
covm = matrix(c(2,1,1,1), ncol = 2) # covariance matrix

set.seed(1000)
x = mvrnorm(n = 2, mu = c(2,3), Sigma = covm)
colsumx = colSums(x)
rowsumx = rowSums(x)


set.seed(2000)
y = mvrnorm(n = 2, mu = c(2,3), Sigma = matrix(c(2,1,1,1), ncol = 2))
y = cbind(y, rowSums(y))
y = rbind(y, colSums(y))
y = rbind(y, c(colsumx - y[3,1:2], sum(colsumx) - y[3,3]))
y = cbind(y, c(rowsumx - y[1:2,3], sum(rowsumx) - y[3,3], 0))

# > x
#          [,1]     [,2]
# [1,] 2.626924 3.357580
# [2,] 3.867469 3.689616
# > y
#             [,1]     [,2]      [,3]       [,4]
# [1,]  3.46444151 3.258343  6.722785 -0.7382805
# [2,]  3.05148893 2.384737  5.436226  2.1208596
# [3,]  6.51593044 5.643080 12.159011  1.3825791
# [4,] -0.02153748 1.404117  1.382579  0.0000000

答案 1 :(得分:0)

我认为你只需要生成两个2x2个随机矩阵,然后可以通过它们获得所有其他值:

set.seed(1234) # just for reproducibility

# generate the two 2x2 matrices with your desired distribution
# (e.g. here I'm generating integers using the uniform distribution)
x <- matrix(as.integer(runif(n = 4,min=10,max=100)),nrow=2)
y22 <- matrix(as.integer(runif(n = 4,min=10,max=100)),nrow=2)

# compute col and row sums of first matrix
csumX=colSums(x)
rsumX=rowSums(x)

# initialize the 4x4 matrix with NAs and set the upper-left 2x2 corner
y <- matrix(NA,nrow=4,ncol=4)
y[1:2,1:2] <- y22

# define the values of 3rd row and colum as sum of other values
# (exluding elements on the 4th row and column)
y[1:2,3] <- colSums(y[1:2,1:2])
y[3,1:2] <- rowSums(y[1:2,1:2])
y[3,3] <- sum(y[1:2,1:2]) # by definition y[3,3] == y[3,1]+y[3,2] == y[1,3]+y[2,3]

# define first two elements of 4th row and column
y[4,1] <- csumX[1] - y[3,1]
y[4,2] <- csumX[2] - y[3,2]

y[1,4] <- rsumX[1] - y[1,3]
y[2,4] <- rsumX[2] - y[2,3]

# complete 3rd row and column values
y[4,3] <- y[4,1] + y[4,2] # these two will be equal by definition
y[3,4] <- y[1,4] + y[2,4]

# element y[4,4] (always zero ?)
y[4,4] <- 0

结果:

> x
     [,1] [,2]
[1,]   20   64
[2,]   66   66
> y
     [,1] [,2] [,3] [,4]
[1,]   87   10  154  -70
[2,]   67   30   40   92
[3,]   97   97  194   22
[4,]  -11   33   22    0