MCMC格维克诊断

机器算法验证 马尔可夫链蒙特卡罗 诊断
2022-02-28 23:28:53

我正在运行 Metropolis 采样器 (C++),并希望使用之前的样本来估计收敛速度。

我发现一个易于实施的诊断是Geweke 诊断,它计算两个样本均值之间的差异除以其估计的标准误差。标准误差是从零处的光谱密度估计的。

Zn=θ¯Aθ¯B1nASθA^(0)+1nBSθB^(0),

在哪里A,B是马尔可夫链中的两个窗口。我做了一些研究是什么SθA^(0)SθB^(0)但是进入一堆关于能量谱密度和功率谱密度的文献,但我不是这些主题的专家;我只需要一个快速的答案:这些数量与样本方差相同吗?如果不是,计算它们的公式是什么?

对这个 Geweke 诊断的另一个疑问是如何选择θ? 上面的文献说是一些功能性的θ(X)并且应该暗示存在谱密度SθA^(0),但为方便起见,我想最简单的方法是使用标识函数(使用样本本身)。它是否正确?

R coda 包有一个描述,但它也没有指定如何计算S价值观。

2个回答

您可以通过对geweke.diag函数的调用查看包中函数的代码,coda以了解如何计算方差spectrum.ar0


这是计算 AR 的谱密度的简短动机(p) 过程为零。

AR的光谱密度(p) 频率处理λ由表达式给出:

f(λ)=σ2(1j=1pαjexp(2πιjλ))2
在哪里αj是自回归参数。

在计算 AR 的谱密度时,这个表达式大大简化了(p) 处理在0

f(0)=σ2(1j=1pαj)2

然后计算看起来像这样(用通常的估计器代替参数):

tsAR2 = arima.sim(list(ar = c(0.01, 0.03)), n = 1000)  # simulate an AR(2) process
ar2 = ar(tsAR2, aic = TRUE)  # estimate it with AIC complexity selection

# manual estimate of spectral density at zero
sdMan = ar2$var.pred/(1-sum(ar2$ar))^2

# coda computation of spectral density at zer0
sdCoda = coda::spectrum0.ar(tsAr2)$spec

# assert equality
all.equal(sdCoda, sdMan)

检查维基百科页面你会看到的Sxx(ω),即谱密度。在您的情况下,您应该使用Sxx(0).