自定义MLEModel子类后调用get_smoothed_decomposition报错,如何获取趋势成分?
解决自定义状态空间模型提取趋势成分的问题
你遇到的AttributeError是因为get_smoothed_decomposition并非通用MLEResults类的方法——这个方法属于UnobservedComponentsResults(statsmodels内置的不可观测成分模型的结果类),而非自定义MLEModel子类返回的MLEResults。要从自定义的局部线性趋势模型中提取趋势成分,需要直接从平滑后的状态变量中获取,步骤如下:
1. 明确自定义模型的状态定义
首先要确认你在LocalLinearTrend类中定义的状态向量含义。标准局部线性趋势模型的状态通常包含两个变量:
- 第1个状态:水平项(level),即序列的趋势成分
- 第2个状态:斜率项(slope),即趋势的变化率
假设你的模型状态定义符合这个标准,状态转移矩阵和观测矩阵的设置类似:
class LocalLinearTrend(sm.tsa.statespace.MLEModel): def __init__(self, endog): super().__init__(endog, k_states=2, k_posdef=2) # 状态转移矩阵:level_t = level_{t-1} + slope_{t-1}, slope_t = slope_{t-1} self.ssm['transition'] = [[1, 1], [0, 1]] # 观测矩阵:y_t = level_t + 噪声 self.ssm['design'] = [[1, 0]] # 初始化协方差(可通过参数更新) self.ssm['state_cov'] = np.diag([1e-6, 1e-6]) self.ssm['obs_cov'] = [[1e-6]] def update(self, params, **kwargs): params = super().update(params, **kwargs) # 用拟合参数更新协方差矩阵 self.ssm['state_cov'] = np.diag(params[:2]**2) self.ssm['obs_cov'] = [[params[2]**2]]
2. 从平滑状态中提取趋势成分
拟合模型后,通过result.smoothed_state属性获取平滑后的状态矩阵(形状为(观测数, 状态数)),提取对应水平项的列即可得到趋势成分:
model = LocalLinearTrend(endog=NP1['LnKSI']) result = model.fit(method='lbfgs', maxiter=50) # 提取第1列(水平项)作为趋势成分 trend_component = result.smoothed_state[:, 0]
替代方案:使用内置不可观测成分模型
如果不需要自定义模型,可以直接使用statsmodels内置的UnobservedComponents类定义局部线性趋势模型,其结果类自带get_smoothed_decomposition方法:
import statsmodels.api as sm model = sm.tsa.UnobservedComponents(NP1['LnKSI'], 'local linear trend') result = model.fit(method='lbfgs', maxiter=50) # 直接获取分解结果,趋势成分存储在trend字段 decomp = result.get_smoothed_decomposition() trend_component = decomp.trend
内容的提问来源于stack exchange,提问作者Blair
相关产品推荐
相关产品推荐

