问题标签 [stan]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
bayesian - 与 BUGS 相比,STAN 的采样速度较慢
我正在尝试从 WinBugs 切换到 Stan,因为我喜欢编程语言,并且 R 中的使用对 Stan 来说比 WinBugs 更好。我将分层贝叶斯模型重新编码为 Stan 语言,并应用了我在互联网上找到的所有推荐设置。但是,我的 WinBugs 采样器比 Stan 采样器快二十多倍。(所以我不是在谈论编译器,我知道它对 Stan 来说更慢。)
我试图以任何我能在互联网上找到的方式加快采样速度,我对我的模型进行了矢量化,我在 Stan 的 2 个核心上运行我的链,而 Bugs 只在 1 个核心上运行。我能找到的所有论坛都说 Stan 不应该比 Bugs 慢很多。有谁知道为什么速度差异如此之大以及如何加快采样速度?
我的 BUGS 和 Stan 模型发布在下面。每个代码的前三行是代码的主要部分,其余的只是先验。T 和 N 均约为 150。
谢谢!
错误:
斯坦:
regression - 如何修复 stan 采样卡在响应变量的逆变换中
我正在使用 R 包brms
来运行广泛的混合效应模型(4000 个观察值、99 个固定效应、200 个组级别),因为lme4
这样的大型模型会产生收敛误差。
我使用 4 个链、8000 次迭代和 2000 个预热样本来运行这些模型。运行 4 到 5 小时后,会返回一个 brmsfit 对象,然后我可以对其进行分析。
在这样的分析中,我注意到在拟合值与残差图的关系中存在异方差。对较小模型的实验(使用lme4
包)表明,采用响应变量的倒数(1/Y)解决了这个问题。我想使用brms
包和 Y 的逆变换运行更大的回归模型,但采样似乎卡住了。运行20小时后,iteration: 1/8000 [0%] (Warmup)
每条链条都保持在。我试图用 运行它rstanarm
,但它也卡在这里。我也尝试指定family=gaussian(link='inverse')
而不是 1/Y,但这并没有解决问题。
有谁知道为什么采样会卡住?提前致谢!
这是我使用的标准代码:
c - 如何在stan中从c实现用户定义的函数
我正在尝试使用 HMC 通过自定义目标函数进行 MCMC 采样。我有我的 HMC 代码,但它不能很好地工作。我最近知道“stan”,它有一个更强大的 HMC 模型。所以我想用“stan”来实现我的代码。
我已经用 C 编写了目标函数和导数函数。它涉及 for 循环,以及 Cholesky 分解和 Lapack 中的其他线性代数所需的函数。我真的不想在 stan 中重新编码它。有没有办法直接使用我的功能?如果有人能提供一些关于如何修改我的代码的线索,或者教我如何修改“stan”代码,我也将不胜感激。以下是我的代码的一部分:
r - 在命令行上运行调用 stan() 的 R 脚本时,如何从 rstan R 包的 stan() 函数捕获警告消息?
在 R 脚本Fit12_for_stack.R
中,我调用rstan
包的stan()
函数。当我Fit12_for_stack.R
在交互式 R 会话中运行代码时,我从以下位置收到这些警告消息stan()
:
警告信息: 1:预热后有 13 个不同的转换。将 adapt_delta 增加到 0.8 以上可能会有所帮助。2:检查pairs()图以诊断抽样问题
Fit12_for_stack.R
当我使用以下命令在命令行上运行脚本时:
我得到输出,但没有警告消息。运行在命令行上调用的 R 脚本时,如何捕获警告消息?stan()
stan()
从帖子如何将所有控制台输出保存到 R 中的文件?,我尝试添加
到脚本的顶部,但test.log
再次显示输出,没有stan()
警告消息。
这Fit12_for_stack.R
看起来像:
这try8.stan
看起来像:
performance - 简单的隐马尔可夫模型遇到可能的 PyMC3 限制
我正在尝试进入语言处理,从简单的 HMM 开始,但构建可能需要离散参数的模型(因此 Stan 可能无法工作)。最终,我要处理大量的语言数据,所以需要相当的效率。PyMC3 似乎可能是我唯一的选择(我愿意接受建议)。
我在尝试一个简单的“隐藏”马尔可夫模型时遇到了问题——斯坦手册中的第一个 HMM 模型,其中“潜在”状态是观察到的数据。该模型包含 N=300 个人工数据,使用 Metropolis 在 PyMC3 中运行,但这需要 11 分钟,而 Stan 需要 2.5 秒(使用 NUTS)。数百倍的时间表明 Metropolis 采样器没有足够的可扩展性。PyMC3 中的 NUTS 采样器给出了“Scaling is not positive 限定”错误,尽管提供了一个非常准确的 MAP 估计值。
我还尝试在 PyMC3 中运行 N=1000 的模型。我尝试了 fmin_powell 和 L-BFGS-B 优化器。两者都运行了两个小时,并在用完我系统上的所有可用内存(16GB RAM,16GB 交换)后崩溃——不知道为什么。Stan 不需要明确的 MAP 估计,并在大约 20 秒内完成了 N=1000 的贝叶斯分析。如果我正确阅读了 Stan 手册,它只是从随机值开始,而不是 MAP 估计值。
我不清楚我的问题是由于我提供的 PyMC3 模型中的一些新手缺陷,还是 PyMC3 中的一些问题或限制,或者这是否不是 PyMC3 应该解决的那种模型(或者最终可能是贝叶斯估计)。我试图进一步对模型进行矢量化,这可能会有所帮助,但似乎无法找出可行的方法,也没有在网上看到太多可以提供指导的东西。
我用来运行模型的所有代码,以及使用的人工数据都可以在这里找到: https ://drive.google.com/folderview?id=0B8242b1Xh6pzSWFDM2lQbDZwajg&usp=sharing
型号为:
floating-point - 由于数值精度,无法重现基本的 Stan 示例
我正在尝试重现 Stan 手册 2.11 版第 15.2-15.3 节中的示例:
gpdemo.stan gpdemo.R但斯坦抱怨说这Sigma
不是肯定的:
事实上它不是:
但问题似乎是数值精度之一,而不是其他问题:
显然这个例子在某人的机器上运行没有数字问题(否则它不会出现在手册中,更不用说在互联网上的博客上转载了)。这是一个非常简单的例子,所以我想知道我是否只是在某个地方犯了错误。
对于它的价值,我能够通过更明智地循环构造来使其工作Sigma
:
r - 使用 rstan 对贝叶斯模型进行线性模型诊断
我正在寻找一种有效的方法来识别对线性模型的参数有巨大影响的数据点。这对于普通的线性模型来说是直截了当的,但我不确定如何使用贝叶斯线性模型来做到这一点。
这是使用普通线性模型的一种方法,我们可以计算每个数据点的库克距离,并绘制包含库克距离的诊断图:
这里我们有一个带有嵌套列表的数据框,该model
列包含每个物种的线性模型:
该broom::augment
函数允许我们将每个数据点的 Cook 距离值添加到该数据帧中,我们可以像这样检查它们:
使用该autoplot
方法,我们可以制作显示 Cook 距离值的信息诊断图,并帮助我们快速识别对模型参数有巨大影响的数据点:
这只是制作的地块之一:
现在,使用贝叶斯线性模型,我们可以类似地计算数据框中每个组的线性模型:
但是该broom::augment
方法没有库克的距离值:
而且没有autoplot
方法:
一些学术文献谈到了模型扰动、phi-divergence、Cook 后验模态距离和 Cook 后验平均距离、Kullback -Leibler 散度等方法。但是我看不到任何用 R 代码探索过的地方,我被困住了。
在 Cross-validated 上有一个关于这个主题的未回答的问题。我在这里发帖是因为我正在寻找关于编写代码来计算影响统计的想法(而不是关于统计理论和方法等的建议,应该针对其他问题)
我怎样才能从输出中得到类似库克距离测量值的东西rstanarm::stan_lm
?
stan - 用新数据更新 Stanfit 对象
我通过 API 调用生成数据,一次一个数据点。我想将每个点提供给 Stan 模型,保存更新的模型,然后丢弃数据点。
斯坦有可能吗?
如果是这样,您如何处理组级参数?例如,如果我的模型有 J 个组级参数,但我一次只输入一个数据点,这不会产生错误吗?
bayesian - 斯坦。使用目标 += 语法
我开始学习斯坦。
谁能解释何时以及如何使用诸如...之类的语法?
而不仅仅是:
例如,在 Stan 手册中,您可以找到以下示例。
我认为目标线增加了目标值,我认为它是后验密度的对数。
但是什么参数的后验密度?
什么时候更新和初始化?
在 Stan 完成(并收敛)之后,您如何访问它的值以及我如何使用它?
其他示例:
上面的示例使用 target 两次而不是一次。
另一个例子。
最后一个例子甚至混合了这两种方法。
要做到这一点更加困难,我已经读过
具有相同的效果
谁能解释一下为什么?
谁能提供一个以两种不同方式编写的简单示例,请使用“target +=”和常规更简单的“y ~”方式?
问候