在WinBUGS中,我指定的是一个具有多项似然函数的模型,我需要确保多项概率都在0和1之间,总和为1.
以下是指定可能性的代码部分:
e[k,i,1:9] ~ dmulti(P[k,i,1:9],n[i,k])
这里,数组P []指定多项分布的概率。
这些概率是根据我的数据(矩阵e [])使用一系列固定和随机效应的多元线性回归来估计的。例如,这里是用于预测P []的一个元素的多元线性回归:
P[k,1,2] <- intercept[1,2] + Slope1[1,2]*Covariate1[k] +
Slope2[1,2]*Covariate2[k] + Slope3[1,2]*Covariate3[k]
+ Slope4[1,2]*Covariate4[k] + RandomEffect1[group[k]] +
RandomEffect2[k]
编译时,模型会产生错误:
elements of proportion vector of multinomial e[1,1,1] must be between zero and one
如果我理解正确,这意味着向量P [k,i,1:9]的元素(上面的多项式似然函数中的概率向量)可能是非常大(或小)的数字。实际上,它们都需要介于0和1之间,总和为1。
我是WinBUGS的新手,但从阅读中看来,似乎以某种方式使用beta回归而不是多线性回归可能是前进的方向。然而,尽管这会允许每个元素在0和1之间,但它似乎没有触及问题的核心,即P [k,i,1:9]的所有元素必须是正的并且总和为1.
可能响应变量可以非常简单地转换为一个比例。我尝试用P [k,i,1:9]的总和来划分每个元素,但到目前为止还没有成功。
非常感谢任何提示!
(我提供了模型中有问题的部分;整个过程相当长。)
答案 0 :(得分:0)
通常的做法是使用logit链接的多项式等价物将变换后的概率约束到区间(0,1)。例如(对于单个预测变量,但对于需要的预测变量,它的原理相同):
Response[i, 1:Categories] ~ dmulti(prob[i, 1:Categories], Trials[i])
phi[i,1] <- 1
prob[i,1] <- 1 / sum(phi[i, 1:Categories])
for(c in 2:Categories){
log(phi[i,c]) <- intercept[c] + slope1[c] * Covariate1[i]
prob[i,c] <- phi[i,c] / sum(phi[i, 1:Categories])
}
对于可识别性,phi [1]的值设置为1,但是intercept和slope1的其他值是独立估计的。当类别的数量等于2时,这会折叠到通常的逻辑回归,但编码为多项式响应:
log(phi[i,2]) <- intercept[2] + slope1[2] * Covariate1[i]
prob[i,2] <- phi[i, 2] / (1 + phi[i, 2])
prob[i,1] <- 1 / (1 + phi[i, 2])
即:
logit(prob[i,2]) <- intercept[2] + slope1[2] * Covariate1[i]
prob[i,1] <- 1 - prob[i,2]
在这个模型中,我已经按类别索引了slope1,这意味着结果的每个级别都与预测变量具有独立的关系。如果你有一个序数响应,并且想要假设与协变量相关的优势比在连续的响应水平之间是一致的,那么你可以将指数放在slope1上(并重新编码代码以使phi累积)得到一个比例几率逻辑回归(POLR)。
以下是一些示例代码的链接,涵盖了我教授的课程中的逻辑回归,多项回归和POLR:
http://runjags.sourceforge.net/examples/squirrels.R
请注意,它使用JAGS(而不是WinBUGS),但据我所知,这些类型的模型的模型语法没有差异。如果你想快速开始使用runjags&amp;从WinBUGS背景的JAGS然后你可以关注这个小插图: