如何用R生成联合概率矩阵?

时间:2018-04-11 09:12:35

标签: r function binary probability

我正在尝试生成一个联合概率矩阵。它是一个对称矩阵。主对角线元素被解释为概率 p ( 一个 一世 )  那个二进制变量 一个 一世  等于1.非对角线元素是概率 p ( 一个 一世 一个 Ĵ )  那两个 一个 一世  和 一个 Ĵ  这个矩阵应该符合以下条件:

0 ≤ p 一个 一世 ≤ 1

最大 ( 0 , p 一个 一世 + p 一个 Ĵ - 1 ) ≤ p 一个 一世 一个 Ĵ ≤ 分 ( p 一个 一世 , p 一个 Ĵ ) , 一世 ≠ Ĵ

点 一个 一世 + p 一个 Ĵ + p 一个 ķ - p 一个 一世 一个 Ĵ - p 一个 一世 一个 ķ - p 一个 Ĵ 一个 ķ ≤ 1 , 一世 ≠ Ĵ , 一世 ≠ ķ , Ĵ ≠ ķ

使用check.commonprob检查这些条件。

我构建了一个函数来生成符合这些条件的矩阵:

# First I need another function to make the matrix symmetric 

   makeSymm <- function(m) {
  m[upper.tri(m)] <- t(m)[upper.tri(m)]
  return(m) }

  b=matrix(0,10,10)

#The functionthat generates joint probabilities

  joint=function(b,x,y,u,z,k,m){
  repeat{
  diag(b)=runif(k, min=x, max=y)
  b[lower.tri(b,diag=FALSE)]<-runif(m,min=u, max=z)
  b<-makeSymm(b)
  check.commonprob(b)->c
  if(c==TRUE)
  break}
  return(b)}

因为b是10 * 10矩阵=>在下三角矩阵中有10个对角元素和45个元素。我得到了这个结果:

b=joint(b,0.4,0.6,0.2,0.4,10,45)

> b
           [,1]      [,2]      [,3]      [,4]      [,5]      [,6]      [,7]
 [1,] 0.4479626 0.2128775 0.3103472 0.2342798 0.2719423 0.3114339 0.3978305
 [2,] 0.2128775 0.4413829 0.2603543 0.2935595 0.2556380 0.2486850 0.2694443
 [3,] 0.3103472 0.2603543 0.5170409 0.3003153 0.2651415 0.3410199 0.2321201
 [4,] 0.2342798 0.2935595 0.3003153 0.5930984 0.2719581 0.3982266 0.3157343
 [5,] 0.2719423 0.2556380 0.2651415 0.2719581 0.4031691 0.2157856 0.3016181
 [6,] 0.3114339 0.2486850 0.3410199 0.3982266 0.2157856 0.4042654 0.2595399
 [7,] 0.3978305 0.2694443 0.2321201 0.3157343 0.3016181 0.2595399 0.5195244
 [8,] 0.3154185 0.3174374 0.2920965 0.3259053 0.2847335 0.3560568 0.2070868
 [9,] 0.2892746 0.2510410 0.3232922 0.2970148 0.3070217 0.3445408 0.3180946
[10,] 0.2948818 0.2264481 0.3210267 0.2866854 0.3783635 0.3427585 0.2306935
           [,8]      [,9]     [,10]
 [1,] 0.3154185 0.2892746 0.2948818
 [2,] 0.3174374 0.2510410 0.2264481
 [3,] 0.2920965 0.3232922 0.3210267
 [4,] 0.3259053 0.2970148 0.2866854
 [5,] 0.2847335 0.3070217 0.3783635
 [6,] 0.3560568 0.3445408 0.3427585
 [7,] 0.2070868 0.3180946 0.2306935
 [8,] 0.5958957 0.2710500 0.2318991
 [9,] 0.2710500 0.5003779 0.2512744
[10,] 0.2318991 0.2512744 0.5004233

到目前为止,一切似乎都很好,但问题在于,当我想要生成100 * 100矩阵时,我注意到超过20 * 20的维度,运行时间变得如此之长(小时),我可以'得到一个结果,因为我必须停止它。 你有什么建议来改进这个功能所以我可以在100 * 100矩阵上试试吗?我还可以预先规定联合概率矩阵的均值和标准差吗?谢谢!

1 个答案:

答案 0 :(得分:2)

如果您只是尝试生成此类矩阵的示例并且没有任何其他约束,则可以通过从群体生成观察来实现此目标,这些观察将由此类矩阵隐式描述,然后将观察到的概率制成表格。您可以从编写制表的函数开始:

if

上述函数可以使用任何二进制矩阵,并将其转换为概率矩阵,以满足p.matrix <- function(A){ n <- nrow(A) k <- ncol(A) outer(1:n,1:n,Vectorize(function(i,j) sum(A[i,]*A[j,])))/k } 。要获得给定大小的矩阵,您可以执行以下操作:

check.commonprob

例如:

prob.matrix <- function(n,p = 0.5){
  k <- max(1000,10*n^2)
  pop <- replicate(k,ifelse(runif(n) < p,1,0))
  p.matrix(pop)
}

对于> M <- prob.matrix(4,c(0.1,0.9,0.3,0.4)) > M [,1] [,2] [,3] [,4] [1,] 0.098 0.090 0.019 0.042 [2,] 0.090 0.903 0.278 0.366 [3,] 0.019 0.278 0.306 0.121 [4,] 0.042 0.366 0.121 0.410 > bindata::check.commonprob(M) [1] TRUE ,这在我的机器上大约需要30秒。

在此函数中,结果变量基本上是不相关的。要获得相关变量,请使用自定义函数替换简单的n = 100调用,例如,不允许连续3次或更多次连续运行。如果你想更好地控制相关性,你需要首先明确你想要它们是什么。