我怎样才能用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。如果你想更好地控制相关性,你需要首先清楚你想要它们是什么。
我正在尝试生成联合概率矩阵。它是一个对称矩阵。主对角线元素被解释为概率 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。如果你想更好地控制相关性,你需要首先清楚你想要它们是什么。