我对JAGS相当陌生,所以这可能是一个愚蠢的问题。我正在尝试在JAGS中运行一个模型,该模型预测一维随机游走过程将在越过边界B之前越过边界A的概率。可以通过以下逻辑模型来解析求解该模型:
Pr(A,B)= 1 /(1 + exp(-2 *(d / sigma)* theta))
其中“ d”是平均漂移率(正值表示向边界A的漂移),“ sigma”是该漂移率的标准偏差,“ theta”是起点和边界之间的距离(假定对于两个边界)。
我的数据集包含50个参与者,每个参与者提供1800个观察值。我的模型假设d由观察到的环境变量(我将其简称为“ x”)和将x与d相关的加权系数(我将其称为“ beta”)的特定组合确定。因此,存在三个参数:β,sigma和theta。我想为每个参与者估计一组参数。我的意图是最终运行一个层次模型,其中组级别参数会影响各个级别参数。但是,为简单起见,在这里我仅考虑一个模型,在该模型中,我为一个参与者估算一组参数(因此该模型不是分层的)。
我的模型rjags如下:
model{
for ( i in 1:Ntotal ) {
d[i] <- x[i] * beta
probA[i] <- 1/(1+exp(-2 * (d[i]/sigma) * theta ) )
y[i] ~ dbern(probA[i])
}
beta ~ dunif(-10,10)
sigma ~ dunif(0,10)
theta ~ dunif(0,10)
}
Run Code Online (Sandbox Code Playgroud)
该模型运行良好,但需要一段时间才能运行。我不确定JAGS是如何执行代码的,但是如果此代码在R中运行,则效率会非常低下,因为它将不得不遍历案例,分别为每种案例运行模型。因此,随着样本量的增加,运行分析所需的时间将迅速增加。我有一个相当大的样本,所以这是一个问题。
有没有一种方法可以对此代码进行矢量化处理,以便它可以一次计算所有数据点的似然性?例如,如果我将其作为简单的最大似然模型来运行。我将对模型进行矢量化处理,并针对参与者提供的所有1800种情况,在给定特定参数值的情况下计算数据的概率(因此不需要for循环)。然后,我将这些可能性的日志记录下来,并将它们全部加在一起,以便为参与者给出的所有观察结果提供一个对数可能性。这种方法可节省大量时间。有没有办法在JAGS中做到这一点?
编辑
感谢您的答复,并指出我显示的模型中的参数可能无法识别。我应该指出,该模型是简化版本。完整模型如下:
model{
for ( i in 1:Ntotal ) {
aExpectancy[i] <- 1/(1+exp(-gamma*(aTimeRemaining[i] - aDiscrepancy[i]*aExpectedLag[i]) ) )
bExpectancy[i] <- 1/(1+exp(-gamma*(bTimeRemaining[i] - bDiscrepancy[i]*bExpectedLag[i]) ) )
aUtility[i] <- aValence[i]*aExpectancy[i]/(1 + discount * (aTimeRemaining[i]))
bUtility[i] <- bValence[i]*bExpectancy[i]/(1 + discount * (bTimeRemaining[i]))
aMotivationalValueMean[i] <- aUtility[i]*aQualityMean[i]
bMotivationalValueMean[i] <- bUtility[i]*bQualityMean[i]
aMotivationalValueVariance[i] <- (aUtility[i]*aQualitySD[i])^2 + (bUtility[i]*bQualitySD[i])^2
bMotivationalValueVariance[i] <- (aUtility[i]*aQualitySD[i])^2 + (bUtility[i]*bQualitySD[i])^2
mvDiffVariance[i] <- aMotivationalValueVariance[i] + bMotivationalValueVariance[i]
meanDrift[i] <- (aMotivationalValueMean[i] - bMotivationalValueMean[i])
probA[i] <- 1/(1+exp(-2*(meanDrift[i]/sqrt(mvDiffVariance[i])) *theta ) )
y[i] ~ dbern(probA[i])
}
Run Code Online (Sandbox Code Playgroud)
在该模型中,所估计的参数是theta,discount,和gamma,并且这些参数可以被回收。当我对单个参与者(Ntotal= 1800)的观测值运行模型时,该模型大约需要5分钟才能运行,这完全可以。但是,当我在整个样本上运行模型(45个参与者x 1800个案例,每个样本= 78,900个观察值)时,我已经运行了24小时,而整个过程还不到50%。这似乎很奇怪,因为我希望它花的时间是原来的45倍,所以最多只能花4到5个小时。我想念什么吗?
我希望我不会误解这种情况(如果之前我对此表示歉意),但是您的问题似乎来自对JAGS(或WinBUGS或OpenBUGS)工作原理的概念性误解。
您的程序实际上并未运行,因为您编写的内容不是用编程语言编写的。因此矢量化将无济于事。
您只写了模型的描述,因为JAGS的语言是一种描述性语言。
JAGS读取模型后,将组装一个转换矩阵以运行MCMC,该MCMC的固定分布是给定(观察)数据的参数的后验分布。JAGS对您的程序不做任何其他处理。
您一直在等待程序运行的所有时间实际上是在等待(并希望)达到MCMC的放松时间。
因此,使您的程序运行太久的原因是,生成的过渡矩阵必须具有不良的松弛特性或类似的东西。
这就是为什么对只能读取和运行一次的程序进行矢量化的帮助很小。
因此,您的问题出在其他地方。
希望对您有所帮助,如果不能,对不起。
祝一切顺利。