计算并绘制 Distributions.jl 中分布的中心可信和最高后验密度区间

Compute and plot central credible and highest posterior density intervals for distributions in Distributions.jl

我想 (i) 计算和 (ii) 绘制 Distributions.jl 库中分布的中心可信区间和最高后验密度区间。 理想情况下,可以编写自己的函数来计算 CI 和 HPD,然后使用 Plots.jl 绘制它们。但是,我发现实现起来非常棘手(免责声明:我是 Julia 的新手)。 关于 libraries/gists/repo 有什么建议可以让计算和绘图更容易吗?

上下文

using Plots, StatsPlots, LaTeXStrings
using Distributions

dist = Beta(10, 10)
plot(dist)  # thanks to StatsPlots it nicely plots the distribution

# missing piece 1: compute CI and HPD
# missing piece 2: plot CI and HPD

下图或第 1 页中总结了预期的最终结果。 BDA3 中的 33 个。

目前找到的资源:

感谢您更新问题;它带来了新的视角。

主旨有点正确;只是它使用了早期版本的 Julia。 因此 linspace 应替换为 LinRange。使用 using Plots 而不是 using PyPlot。 我会将绘图部分更改为以下内容:

plot(cred_x, pdf(B, cred_x), fill=(0, 0.9, :orange))
plot!(x,pdf(B,x), title="pdf with 90% region highlighted")

乍一看,CI 的计算似乎是正确的。 (就像 Closed Limelike Curves 的答案或 [there][1] 问题的答案)。对于 HDP,我同意 Closed Limelike Curves。只有我要补充一点,您可以在要点代码的基础上构建您的 HDP 函数。我还会有一个已知分布的后验版本(如参考文档第 33 页,图 2.2),因为您不需要采样。另一个采样像 Closed Limelike Curves 表示。

您正在寻找 ArviZ.jl,以及 Turing.jl 的 MCMCChains。 MCMCChains 将为您提供非常基本的绘图功能,例如从每条链估计的 PDF 图。 ArviZ.jl(Python ArviZ 包的包装器)添加了更多的地块。

OP 编辑​​了问题,所以我给出了一个新答案。

对于中心可信区间,答案很简单:取每个点的分位数:

lowerBound = quantile(Normal(0, 1), .025)
upperBound = quantile(Normal(0, 1), .975)

这将为您提供一个区间,其中 x 低于下限的概率为 .025,上限也类似,加起来为 .05。

HPD 更难计算。此外,它们往往不太常见,因为它们具有一些中央可信区间所不具备的奇怪特性。最简单的方法可能是使用 Monte Carlo 算法。使用 randomSample = rand(Normal(0, 1), 2^12) 从正态分布中抽取 2^12 个样本。 (或者无论你想要多少样本,更多的样本会给出更准确的结果,受随机机会的影响更小。)然后,对于每个随机点,使用 pdf.(randomSample) 评估该随机点的概率密度。然后,选择概率密度最高的95%的点;将所有这些点包括在最高密度区间内,以及它们之间的任何点(我假设您正在处理像正态分布一样的单模分布)。

对于正态分布有更好的方法,但它们更难推广。