UnobservedComponents:如何设置参数更新的边界?

时间:2018-10-30 05:28:43

标签: python statsmodels

在拟合UnobservedComponents模型时,是否可以为状态参数的最终值设置上限?

我们想模拟一种贝叶斯方法,用于选择各州的先验分布,并将最终值设置为具有最高初始值的20%的上限(例如,如果我们为本地级别选择先验值,则值为0.1,则最终值最多为0.12)。

背后的动机来自我们从R移植到Python的算法。当我们在给定的测试数据上拟合局部模型时,最终状态sigma最终约为0.3;在R中,存在上限假设,因此最终结果为0.12,这会产生相当大的不同置信区间。现在,我们一直在尝试对statsmodels中的相同行为进行建模。

通过研究代码,我们发现方法transform_params似乎能够在初始状态引入边界,但是我们不确定如何使用它来设置20%的上限(或者是否设置为是正确的方法。

1 个答案:

答案 0 :(得分:0)

刚刚找到了我所寻找的非常简单而精确的解决方案:我们可以使用输入参数$ valgrind ./a.out ==12820== Memcheck, a memory error detector ==12820== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al. ==12820== Using Valgrind-3.14.0 and LibVEX; rerun with -h for copyright info ==12820== Command: ./a.out ==12820== ==12820== ==12820== HEAP SUMMARY: ==12820== in use at exit: 0 bytes in 0 blocks ==12820== total heap usage: 1 allocs, 1 frees, 8 bytes allocated ==12820== ==12820== All heap blocks were freed -- no leaks are possible ==12820== ==12820== For counts of detected and suppressed errors, rerun with: -v ==12820== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0) ,它将已经限制了拟合算法搜索最佳值的边界。

下面是一个示例,如果有人需要这样做:

bounds

如果要为级别优化设置0.1的下边界和0.12的上边界,并且它对应于model = UnobservedComponents(data, level='choose level', exog=more data) bounds = [(None, None) for _ in range(len(model.param_names))] 中的索引1,可以这样进行:

model.param_names

然后只需运行bounds[1] = (0.1, 0.12) 命令:

fit

请记住,model.fit(bounds=bounds) 中的这些值对应于参数的标准偏差,而不是其方差。

它就像一种魅力:)