我怎样才能用R生成联合概率矩阵?

How can i generate joint probabilities matrix with R?

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

0 ≤ p 一种 一世 ≤ 1

最大值 ( 0 , p 一种 一世 + p 一种 j − 1个 ) ≤ p 一种 一世 一种 j ≤ 分钟 ( p 一种 一世 , p 一种 j ) , 一世 ≠ j

p 一种 一世 + p 一种 j + p 一种 k − p 一种 一世 一种 j − p 一种 一世 一种 k − p 一种 j 一种 k ≤ 1个 , 一世 ≠ j , 一世 ≠ k , j ≠ k

使用 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 矩阵上试试吗?也可以预先规定联合概率矩阵的均值和标准差吗?谢谢!

如果您只是想生成此类矩阵的示例并且没有任何其他限制,则可以通过从此类矩阵隐式描述的总体中生成观察结果,然后将观察到的概率制成表格来实现.您可以先编写一个执行制表的函数:

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

对于n = 100,这在我的机器上大约需要 30 秒。

在这个函数中,结果变量基本上是不相关的。要获得相关变量,请将简单的 ifelse() 调用替换为自定义函数,例如不允许运行 3 个或更多个连续的 1。如果你想更好地控制相关性,你需要首先清楚你想要它们是什么。