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

标签 r function binary probability

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

0 ≤ p A 我 ≤ 1

最大 ( 0 , p A 我 + p A j - 1 ) ≤ p A 我 A j ≤ 分钟 ( p A 我 , p A j ) , 我 ≠ j

p A 我 + p A j + p A k - p A 我 A j - p A 我 A k - p A j A 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。如果您想更好地控制相关性,您需要首先明确您希望它们是什么。

关于r - 如何用 R 生成联合概率矩阵?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49771069/

相关文章:

r - 使用字符串索引 xts 并仅返回该确切时间的观察结果

javascript - 为什么函数在没有找到元素时运行?

javascript - 什么是 es6 中的函数作用域变量 (var) 和 block 作用域变量?

c - 符号扩展 1 位 2 的补数?

R:更新 data.table 中的列

r - 为什么 tibble 将 "[, 1]"添加到从矩阵创建的新列名称中?

python - 使用递归找到大小为 k 的平衡代码

java - 将包含二进制值的字符串转换为十六进制

r - 比熔化和 rbind 更快的替代方案

c++ - 对数组的每个元素求和函数的结果