Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 状态空间模型中用户提供的初始状态_Python_Statsmodels - Fatal编程技术网

Python 状态空间模型中用户提供的初始状态

Python 状态空间模型中用户提供的初始状态,python,statsmodels,Python,Statsmodels,我试图复制1985年宏观经济时间序列趋势和周期的结果。如果只使用局部线性模型,我可以得到相同的结果,但在添加平稳的周期性成分时,我没有做到这一点。虽然我不完全确定,但我怀疑这与我对所有状态使用完全漫反射优先级有关,而不是仅对局部线性组件使用漫反射优先级。为了保持一定程度的灵活性,我想使用known关键字向statsmodels提供初始值,并在update方法中更新它们。现在我不太担心使用近似漫反射。实现这一目标的最佳方式是什么 从v0.10开始,您可以通过创建自己的初始化实例来灵活设置初始化。使

我试图复制1985年宏观经济时间序列趋势和周期的结果。如果只使用局部线性模型,我可以得到相同的结果,但在添加平稳的周期性成分时,我没有做到这一点。虽然我不完全确定,但我怀疑这与我对所有状态使用完全漫反射优先级有关,而不是仅对局部线性组件使用漫反射优先级。为了保持一定程度的灵活性,我想使用known关键字向statsmodels提供初始值,并在update方法中更新它们。现在我不太担心使用近似漫反射。实现这一目标的最佳方式是什么

从v0.10开始,您可以通过创建自己的初始化实例来灵活设置初始化。使用此方法,可以独立设置每个状态或状态块,以使用可用方法之一:已知、静止、近似_漫反射或漫反射

这里是局部级别模型的示例,但不规则组件被建模为AR1。第一个状态是AR1,我指定静态初始化。第二个状态是水平,我使用已知的初始化,通过最大似然估计初始水平。第三种状态是坡度,我将其初始化设置为“漫反射”


这太棒了!谢谢你的回答!这真是一个很棒的包裹。我正在尝试运行您的代码,并看到以下警告ConvergenceWarning:最大似然优化无法收敛。检查mle_retvals。这正常吗?我还注意到你没有使用“燃烧”初始化,关键字漫反射会自动处理吗?很高兴听到你发现它很有用!在这种情况下,由于我的起始参数不好,它需要比默认值多迭代几次才能在指定的公差下收敛。如果使用:res=mod.fitmaxiter=100,则消息将消失。是的,使用漫反射时,不需要指定logu burn,因为它可以直接计算精确值。
import numpy as np
import pandas as pd
import statsmodels.api as sm

from statsmodels.tsa.statespace.initialization import Initialization
from statsmodels.tsa.statespace.tools import (
    constrain_stationary_univariate,
    unconstrain_stationary_univariate)

class LocalLevelAR1(sm.tsa.statespace.MLEModel):
    def __init__(self, endog):
        super().__init__(endog, k_states=3, k_posdef=3)

        self['design', 0, :2] = 1
        self['transition', 1:, 1:] = np.array([[1., 1.],
                                               [0., 1.]])
        self['selection'] = np.eye(3)

        init = Initialization(3)
        init.set(0, 'stationary')
        init.set(1, 'known', stationary_cov=[[0]])
        init.set(2, 'diffuse')
        self.ssm.initialization = init

    @property
    def state_names(self):
        return ['ar1', 'level', 'slope']

    @property
    def param_names(self):
        return ['level0', 'phi', 'sigma2.ar1', 'sigma2.level', 'sigma2.slope']

    @property
    def start_params(self):
        return np.r_[0, 0, 1e-5, 1e-5, 1e-5]

    def transform_params(self, unconstrained):
        constrained = unconstrained.copy()
        constrained[1] = constrain_stationary_univariate(unconstrained[1:2])
        constrained[2:5] = constrained[2:5]**2
        return constrained

    def untransform_params(self, constrained):
        unconstrained = constrained.copy()
        unconstrained[1] = unconstrain_stationary_univariate(constrained[1:2])
        unconstrained[2:5] = constrained[2:5]**0.5
        return constrained

    def update(self, params, **kwargs):
        params = super().update(params, **kwargs)

        self['transition', 0, 0] = params[1]
        self['state_cov'] = np.diag(params[2:5])
        self.ssm.initialization.set(1, 'known', constant=params[:1], stationary_cov=[[0.]])

dta = sm.datasets.macrodata.load_pandas().data
dta.index = pd.period_range(start='1959Q1', end='2009Q3', freq='Q')

mod = LocalLevelAR1(dta['infl'])
res = mod.fit()

print(res.summary())