我正在寻找一些帮助来编写WinBUGS中的椭圆方程。我需要在我的数据中使用p1形成一个双变量椭圆。我试图将方程用作(X-mu)'sigmainverse(X-mu),其中X是二元正态变量,mu是均值向量,sigmainverse是无变量协方差矩阵的逆。在我的例子中,p1是具有平均伽玛和反sigma2矩阵的双变量正态变量。双引号内是我做的,但它不起作用。下面是WinBUGS代码:
model
{
for (j in 1 : Nf)
{
p1[j, 1:2 ] ~ dmnorm(gamma[1:2 ], T[1:2 ,1:2 ])
# gamma is the MVN mean or mean of logit (p)
#T is the precision matrix inverse sigma of MVN or logit(p)
# precision equals reciprocal of variance
# precision matrix is the matrix inverse of the covariance matrix
for (i in 1:2)
{
logit(p[j,i])<-p1[j,i]
Y[j,i] ~ dbin(p[j,i],n)
wp[j,i] <- p[j,i]*dbw[j,i]
}
sumwp[j] <- sum(wp[j, ])
#X_mu[j,1:2]<-p1[j,1:2]-gamma[1:2]**
#ell[j]<-((t(p1[j,1:2]-gamma[1:2]))*T[1:2,1:2]*(p1[j.1:2]-gamma[1:2]))**
X_mu[j,1]<-p1[j,1]-gamma[1]
X_mu[j,2]<-p1[j,2]-gamma[2]
T1[j,1]<-inprod(T[1,],X_mu[j,])
T1[j,2]<-inprod(T[2,],X_mu[j,])
ell[j,1]<-inprod2(X_mu[j,1],T1[j,1])
ell[j,2]<-inprod2(X_mu[j,2],T1[j,2])
#ell[j]<-((t(p1[j,1:2]-gamma[1:2]))*T
}
# Hyper-priors:
gamma[1:2] ~ dmnorm(mn[1:2],prec[1:2 ,1:2])
T[1:2 ,1:2] ~ dwish(R[1:2 ,1:2], 2)
sigma2[1:2, 1:2] <-inverse(T[,])
#sigma2 is the covariance matrix
rho <- sigma2[1,2]/sqrt(sigma2[1,1]*sigma2[2,2])
#rho is the correlation matrix
}
expit[i]<-exp(gamma[i])/(1+exp(gamma[i]))
}
# Data
list(Nf =20, mn=c(-0.69, -1.06), n=60,
prec = structure(.Data = c(.001, 0,
0, .001),.Dim = c(2, 2)),
R = structure(.Data = c(.001, 0,
0, .001),.Dim = c(2, 2)),
Y= structure(.Data=c(32,13,
32,12,
10,4,
28,11,
10,5,
25,10,
4,1,
16,5,
28,10,
21,7,
19,9,
18,12,
31,12,
13,3,
10,4,
18,7,
3,2,
27,5,
8,1,
8,4),.Dim = c(20, 2)),
dbw=structure(.Data=c(0.25,0.25,
0.25,0.25,
0.25,0.25,
0.25,0.25,
0.25,0.25,
0.25,0.25,
0.25,0.25,
0.25,0.25,
0.25,0.25,
0.25,0.25,
0.25,0.25,
0.25,0.25,
0.25,0.25,
0.25,0.25,
0.25,0.25,
0.25,0.25,
0.25,0.25,
0.25,0.25,
0.25,0.25,
0.25,0.25
),.Dim=c(20,2))
)
答案 0 :(得分:3)
*运算符不会乘以矩阵和向量,只是标量。遗憾的是,WinBUGS中没有通用矩阵产品功能。相反,你可以使用两个调用“inprod”函数(或更快的“inprod2”)来获取每行T的内积和X-mu,从而得到一个新的(临时)矢量节点。然后使用另一个inprod来获取该向量的内积和转置(X-mu),给出你的[j]。或者如果速度是一个问题,只需手动编写内部产品,根据一些报告,这可能会更快。