2024-06-16 11:37:32 发布
网友
我试图在宏观经济时间序列(1985年)的趋势和周期中复制结果。如果只使用局部线性模型,我可以得到相同的结果,但在添加平稳的周期性成分时,我没有做到这一点。虽然我不完全确定,但我怀疑这与我对所有状态使用完全漫反射优先级有关,而不是仅对局部线性组件使用漫反射优先级。为了保持一定程度的灵活性,我想使用known关键字向statsmodels提供首字母缩写,并在update方法中更新它们。现在我不太担心使用近似漫反射。实现这一目标的最佳方式是什么
known
statsmodels
update
从v0.10开始,通过创建自己的Initialization实例,您可以在设置初始化时获得相当大的灵活性。使用这种方法,每个状态或状态块可以独立地设置为使用以下可用方法之一:known、stationary、approximate_diffuse或diffuse
Initialization
stationary
approximate_diffuse
diffuse
这里是局部级别模型的示例,但不规则组件被建模为AR(1)。第一个状态是AR(1),我指定stationary初始化。第二个状态是级别,我使用known初始化通过最大似然估计初始级别。第三种状态是坡度,我将其初始化设置为diffuse
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())
从v0.10开始,通过创建自己的
Initialization
实例,您可以在设置初始化时获得相当大的灵活性。使用这种方法,每个状态或状态块可以独立地设置为使用以下可用方法之一:known
、stationary
、approximate_diffuse
或diffuse
这里是局部级别模型的示例,但不规则组件被建模为AR(1)。第一个状态是AR(1),我指定
stationary
初始化。第二个状态是级别,我使用known
初始化通过最大似然估计初始级别。第三种状态是坡度,我将其初始化设置为diffuse
相关问题 更多 >
编程相关推荐