生成随机矩阵,受R中的等式约束

时间:2014-04-03 03:42:00

标签: r simulation

我想生成一个m×n随机矩阵,从每个元素的均匀分布中绘制,受限于每列必须总和为1。我还想为每个元素设置下限和上限。

以下是所需输出的示例(尽管不是真正随机的),mymatrix

dput(mymatrix)
structure(c(0.5, 1.59365940317881e-17, 1.89403184501105e-18, 
0.5, 8.96677015179615e-19, 1.7326456004408e-18, 0.499999858832886, 
0.499999838867718, 2.22092666609155e-08, 2.69754277003262e-07, 
2.78754819399023e-11, 1.0307976832927e-08, 0.42857144673908, 
0.499999904492316, 3.75555965298514e-08, 4.75046037021098e-08, 
3.3675224155978e-10, 0.0714285633716491, 0.357142848840934, 0.499999941890735, 
7.30974537548529e-08, 2.67022430383198e-08, 2.80475367418637e-10, 
0.142857109188155, 0.28571428969238, 0.499999933476062, 5.02671502622386e-08, 
3.11835918349941e-08, 1.10520352747797e-09, 0.214285694275616
), .Dim = c(6L, 5L), .Dimnames = list(NULL, NULL))

colSums(mymatrix)
#[1] 1 1 1 1 1

max(mymatrix)
#[1] 0.5

在这个特定的例子中,注意没有元素小于零或大于.5;理想情况下,这些边界可以设置为变量。我还想将生成的行数和列数设置为变量。但是,应修复所有列应总和为1的约束。非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

您可以使用MCMCpack库中的dirichlet分布。所有alpha参数都应设置为1。

library(MCMCpack)
mat=rdirichlet(n_columns,rep(1,n_rows))
mat=t(mat) #rotated because you want columns to add to one, not the rows

我不确定你如何设置大元素的限制(如上面设置的0.5),但如果计算时间不是必要的话,我会扔掉任何有太大元素的列元素。您需要做的只是运行代码

mat=mat[,which(apply(mat,2,max)<0.5)]

摆脱不受欢迎的列。