You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 08:56:05