Python 局部水平模型未完全优化不规则状态

Python 局部水平模型未完全优化不规则状态,python,statsmodels,Python,Statsmodels,我们使用了一个地方级模型来拟合该数据: import pandas as pd from scipy import stats from statsmodels.tsa.statespace.structural import UnobservedComponents data = { 'Basque': [3.85318463, 3.9456583, 4.03356173, 4.0234219, 4.01378197, 4.2859184, 4.5743361, 4.8989573

我们使用了一个地方级模型来拟合该数据:

import pandas as pd
from scipy import stats
from statsmodels.tsa.statespace.structural import UnobservedComponents


data = {
    'Basque': [3.85318463, 3.9456583, 4.03356173, 4.0234219, 4.01378197, 4.2859184, 4.5743361, 4.89895735, 5.19701498, 5.33890298, 5.46515301, 5.54591563, 5.61489573, 5.85218493, 6.08140542, 6.17009424, 6.2836334, 6.5555554, 6.81076856, 7.1051843, 7.37789168],
    'another': [3.54662963, 3.69044557, 3.826835, 3.87567838, 3.92173673, 4.2417882, 4.57533548, 4.83804641, 5.0813341, 5.15809788, 5.22365053, 5.33247651, 5.42944892, 5.67437885, 5.91552394, 6.06683787, 6.22764921, 6.53906013, 6.83797506, 6.98736082, 7.12489303]
}

data = pd.DataFrame(data)

model = UnobservedComponents(data['Basque'], level='llevel', exog=data['another'])
fm = model.fit()
这将产生以下收敛参数:

sigma2.irregular    2.365834e-11
sigma2.level        4.032277e-03
beta.another        9.704585e-01
dtype: float64
但随后我们将相同的结果与来自R的
bsts
数据包进行比较,得到的水平和β值基本相同,但差异很大:
0.16
方差(标准偏差为0.38)

然后,我们决定计算残差的对数似然,同时忽略水平分量(因为其方差相对较低),以确定不规则项的最合适值,如下所示:

residuals = data['Basque'] - fm.params[-1] * data['another']
stats.norm.logpdf(residuals, 0, scale=5e-6).sum() # statsmodels sd
-> -39342125822.669464

stats.norm.logpdf(residuals, 0, scale=0.38).sum() # bsts sd
-> -5.789754559185148
residuals = data['Basque'] - fm.params[-1] * data['another']
stats.norm.logpdf(residuals, 0, scale=5e-6).sum() # statsmodels sd
-> -39342125822.669464

stats.norm.logpdf(residuals, 0, scale=0.38).sum() # bsts sd
-> -5.789754559185148
然后我们计算了两个标准偏差的对数似然(statsmodels为5e-6,R为0.38),如下所示:

residuals = data['Basque'] - fm.params[-1] * data['another']
stats.norm.logpdf(residuals, 0, scale=5e-6).sum() # statsmodels sd
-> -39342125822.669464

stats.norm.logpdf(residuals, 0, scale=0.38).sum() # bsts sd
-> -5.789754559185148
residuals = data['Basque'] - fm.params[-1] * data['another']
stats.norm.logpdf(residuals, 0, scale=5e-6).sum() # statsmodels sd
-> -39342125822.669464

stats.norm.logpdf(residuals, 0, scale=0.38).sum() # bsts sd
-> -5.789754559185148
事实证明,正是由于这种差异,我们从两个包中观察到了相互冲突的结果,因此我想寻求帮助,以了解为什么
不规则的
组件产生的值似乎没有完全优化拟合数据的对数可能性

从表面上看,statsmodels通过最大化观测数据的数量来找到状态空间的最佳值;在这种情况下,最终状态不应该收敛到标准偏差0.38,因为它进一步提高了目标成本吗

作为参考,我们的图书馆是在statsmodels的基础上开发的;这是一个与因果影响推断相关的非常有趣的问题,不规则组件让Python包确定地得出结论,存在因果影响,而R的结论正好相反


我们使用所有稳定版本的statsmodels进行了测试,但得到了相同的
不规则的
sd结果。

这是一个有趣的问题,也是两个软件包之间的比较。这种差异显然来自不同的估计方法:STATS模型中的最大似然法和bsts中的贝叶斯MCMC。在这种情况下出现差异并不奇怪,因为时间序列很短

我这样说的原因是,给定bsts输出的
sigma.obs
sigma.level
,以及
系数
,对于其MCMC算法的任何迭代,我可以通过使用迭代中的参数值,将卡尔曼滤波器应用于局部水平+exog模型,从而复制迭代中的一步预测误差和对数似然

它们确实与Statsmodels有一个区别,即它们基于数据集的第一次观察和数据集的方差为未观察到的状态设置优先级,这可能不是最优的(但不应该导致任何重大问题)。Statsmodels取而代之的是使用漫反射先验,这同样不会导致任何重大差异。正如我上面提到的,当我使用它们的prior时,我可以匹配它们的过滤输出

所以差异一定是在估计方法上,这可能与他们的MCMC算法的细节和他们设置的优先级有关。您可以跟踪他们,看看他们是否有任何直觉,知道他们的设置可能会影响结果

残差和对数似然计算的讨论

然后,我们决定计算残差的对数似然,同时忽略水平分量(因为其方差相对较低),以确定不规则项的最合适值,如下所示:

residuals = data['Basque'] - fm.params[-1] * data['another']
stats.norm.logpdf(residuals, 0, scale=5e-6).sum() # statsmodels sd
-> -39342125822.669464

stats.norm.logpdf(residuals, 0, scale=0.38).sum() # bsts sd
-> -5.789754559185148
residuals = data['Basque'] - fm.params[-1] * data['another']
stats.norm.logpdf(residuals, 0, scale=5e-6).sum() # statsmodels sd
-> -39342125822.669464

stats.norm.logpdf(residuals, 0, scale=0.38).sum() # bsts sd
-> -5.789754559185148
然后我们计算了两个标准偏差的对数似然(statsmodels为5e-6,R为0.38),如下所示:

residuals = data['Basque'] - fm.params[-1] * data['another']
stats.norm.logpdf(residuals, 0, scale=5e-6).sum() # statsmodels sd
-> -39342125822.669464

stats.norm.logpdf(residuals, 0, scale=0.38).sum() # bsts sd
-> -5.789754559185148
residuals = data['Basque'] - fm.params[-1] * data['another']
stats.norm.logpdf(residuals, 0, scale=5e-6).sum() # statsmodels sd
-> -39342125822.669464

stats.norm.logpdf(residuals, 0, scale=0.38).sum() # bsts sd
-> -5.789754559185148
问题在于,不规则分量的方差估计与状态不是常数的模型中残差的方差不同。相反,模型是:

y\u t=x\u t\beta+\alpha\u t+\varepsilon\t

和Var(y_t-x_t\beta | t-1)=Var(\alpha_t | t-1)+Var(\varepsilon|t | t-1)

由于Var(\alpha_t|t-1)=sigma2.level和Var(\varepsilon_t|t-1)=sigma2.unregular,适当的方差为sigma2.level+sigma2.unregular=0.00403。如果您这样做:

stats.norm.logpdf(residuals, 0, scale=0.00403).sum() # statsmodels sd
-> -205.4612464569425

好的,这仍然比你原始帖子中由
bsts
计算的数值小,但这是因为状态不是常数,所以
残差
不包含对数似然计算的实际相关残差。实际的对数似然计算是使用
fm完成的。使用
fm的方差预测误差。预测误差cov

感谢@cfulton提供的这一信息性答案!只是想知道,如何使用与BST相同的策略在statsmodels中设置优先级?我尝试了
model.fit(start_params=[0,1,1])
,但没有改变结果。此外,我们是否可以使用一些指标(如AIC)来进一步解释每个模型并比较结果?不幸的是,目前修改
未观测组件的先验值并不容易。因为估计范式不同(经典估计与贝叶斯估计),没有一个一致的框架来评估不同模型的结果。在Statsmodels中,我们正在最大化似然函数,而bsts并不是这样做的。因此,您会发现,与bsts估计的参数生成的模型相比,我们的估计将导致更高的对数似然值和更小的AIC值。嗨,Chad,感谢您的帮助!我们将更新我们的库,添加我们在以下答案中了解到的信息:)!