Мне нужно сгенерировать матрицу совместных вероятностей (80 * 80) с R так, чтобы среднее значение и стандартное отклонение этой матрицы фиксировались заранее. Это симметричная матрица. Основные диагональные элементы интерпретируются как вероятности p (A i) того, что двоичная переменная A i равна 1. Недиагональные элементы - это вероятности p (A i A j) того, что A i и A j равны 1. Эта матрица должна ответить на следующие условия:
0 ≤ p A i ≤ 1
max ( 0 , p A i + p A j − 1 ) ≤ p A i A j ≤ min ( p A i , p A j ) , i ≠ j
p A i + p A j + p A k − p A i A j − p A i A k − p A j A k ≤ 1 , i ≠ j , i ≠ 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)
}
install.packages("bindata")
library (bindata)
# Function to create the joint probabilites matrix:
joint <- function(b, x, y, k) {
repeat {
b[lower.tri(b, diag=TRUE)] <- rnorm(k*(k+1)/2, mean=x,sd=y)
b <- makeSymm(b)
if (check.commonprob(b)==TRUE) break
}
return(b)
}
c <- matrix(0, 4, 4)
c <- joint(c, 0.5, 0.25, 4)
c
[,1] [,2] [,3] [,4]
[1,] 0.3956524 0.3156023 0.3007369 0.2837493
[2,] 0.3156023 0.4330955 0.2920143 0.4145124
[3,] 0.3007369 0.2920143 0.7921709 0.3616905
[4,] 0.2837493 0.4145124 0.3616905 0.4318048
Проблема в том, что эта функция хорошо работает для очень маленьких матриц (4 * 4), но если я возьму (6 * 6), запуск займет слишком много времени, поэтому я остановлю его. Мне нужно обобщить эту функцию на матрицу 80 * 80. Есть предложения?