【发布时间】:2012-02-10 11:36:29
【问题描述】:
我正在寻求有关如何使用 Metropolis-Hastings 算法将 C 或 C++ 代码合并到我的 R 代码中以加速 MCMC 程序的建议。我正在使用 MCMC 方法对给定各种协变量的可能性进行建模,即个人将被第三方(法官)分配到社会地位等级中的特定等级:询问每位法官(约 80 名,跨越 4 个村庄)根据他们对每个人的社会地位的评估,对一组人(大约 80 个,跨越 4 个村庄)进行排名。因此,对于每个法官,我都有一个等级向量,对应于他们对每个人在层次结构中的位置的判断。
为了对此进行建模,我假设在分配等级时,法官会根据个人效用的某种潜在衡量标准的相对价值做出决定,u。鉴于此,可以假设由给定法官产生的等级向量 r 是未观察到的向量 u 的函数,描述了被排名的个人,其中 kth 的 u 值最高的个人将被分配 kth 排名。我使用感兴趣的协变量将 u 建模为多元正态分布变量,然后根据模型生成的 u 分布确定观察到的等级的可能性。
除了估计最多 5 个协变量的影响之外,我还估计了描述评委和项目之间差异的超参数。因此,对于链的每次迭代,我估计多元正态密度大约为 8-10 次。因此,5000 次迭代可能需要长达 14 小时。显然,我需要运行它超过 5000 次,所以我需要一种方法来显着加快这个过程。鉴于此,我的问题如下:
(i) 我是否正确地假设通过在 C 或 C++ 中运行我的一些(如果不是全部)链可以获得最佳速度增益?
(ii) 假设问题 1 的答案是肯定的,我该怎么做?例如,有没有办法让我保留我所有的 R 函数,但只需在 C 或 C++ 中执行循环:即我可以从 C 调用我的 R 函数然后执行循环吗?
(iii) 我想我真正想知道的是如何最好地将 C 或 C++ 代码合并到我的程序中。
【问题讨论】:
-
您还应该确保您的 MCMC 算法运行良好;有时,选择更合适的算法或选择更好的混合参数可以比其他任何方法获得更大的速度增益。也就是说,不要只是盲目地使用 Metropolis-Hastings,要确保它对你来说是一个不错的选择。