Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.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 ARMA MLE(实现文献中的算法) 概述_Python_Algorithm_Optimization_Kalman Filter_Mle - Fatal编程技术网

Python ARMA MLE(实现文献中的算法) 概述

Python ARMA MLE(实现文献中的算法) 概述,python,algorithm,optimization,kalman-filter,mle,Python,Algorithm,Optimization,Kalman Filter,Mle,我正在尝试通过卡尔曼滤波器使用最大似然估计(MLE)实现自回归滑动平均(ARMA)参数优化。我知道我可以使用Python中的statsmodels包来拟合ARMA模型,但我想编写自己的ARMA可能性实现和后续优化,作为未来C/C++实现的原型。另外,当我浏览statsmodels文档时,我发现statsmodels卡尔曼滤波对数似然实现了一个与我在文献中发现的略有不同的表达式 算法 为了计算ARMA对数可能性,我遵循Pearlman 1980年的论文: 高阶自回归移动平均过程精确可能性的算法〉,

我正在尝试通过卡尔曼滤波器使用最大似然估计(MLE)实现自回归滑动平均(ARMA)参数优化。我知道我可以使用Python中的statsmodels包来拟合ARMA模型,但我想编写自己的ARMA可能性实现和后续优化,作为未来C/C++实现的原型。另外,当我浏览statsmodels文档时,我发现statsmodels卡尔曼滤波对数似然实现了一个与我在文献中发现的略有不同的表达式

算法 为了计算ARMA对数可能性,我遵循Pearlman 1980年的论文:

高阶自回归移动平均过程精确可能性的算法〉,《生物计量学》67.1(1980):232-233

为了计算初始的p矩阵,我遵循

Gardner,G.,Andrew C.Harvey和Garry DA Phillips。“算法AS 154:通过卡尔曼滤波对自回归移动平均模型进行精确最大似然估计的算法”,《皇家统计学会杂志》。C辑(应用统计)29.3(1980):311-322

对于初始参数值,我目前正在使用statsmodels ARMA模型用于计算ARMA参数初始猜测的内部方法。将来我计划转移到我自己的实现,但我在调试MLE时使用了_fit_start_params

为了优化MLE,我只需在Scipy中使用L-BFGS解算器

代码 这是因为ARMA.\u initial\u p求解的是一个矩阵,其中p[0][0]<0.0。此时,AR参数的当前估计变得非平稳。然后,所有后续迭代都会警告AR和MA参数是非平稳的

问题
  • 这个实现正确吗?我已经检查了初始P矩阵是否满足它应该满足的方程。对于可能性计算,我看到了我期望从Pearlman论文中看到的几种行为:

    • R趋向于1。对于具有p-AR参数的纯AR过程,它在p步中达到这个极限。基本上,_似然函数中的break语句在Pearlman算法步骤的p次迭代后生效
    • L趋向于零向量
    • K趋向于F.g.我在计算可能性时通过观察abs(K-F.g)来检查这一点
    • 在对数中出现负值警告后,将不再遵守上述限制
  • 我还尝试实现ARMA参数的转换,以防止溢出/下溢,如中所建议的

    ARMA模型与缺失观测时间序列的最大似然拟合〉,《技术计量学》22.3(1980):389-395

    这种转变似乎对我观察到的错误没有影响

  • 如果实现是正确的,那么如何处理负R值?当scipy.optimize返回一个参数向量,该参数向量对应于顶部对角线元素为负的P矩阵时,问题似乎出现了。优化例程是否应该有界以防止负R值?我还尝试过对负值使用复对数,以及将所有numpy数据类型参数更改为“complex”。例如:

    def complex_log(val):
        '''
        Complex logarithm for negative values
    
        Returns log(val) + I*pi
        '''
        if val < 0.0:
            return complex(np.log(np.abs(val)), np.pi)
        return np.log(val) 
    
    def复杂度日志(val):
    '''
    负值的复对数
    返回日志(val)+I*pi
    '''
    如果val<0.0:
    返回复数(np.log(np.abs(val)),np.pi)
    返回np.log(val)
    
  • 但是,scipy.optimize无法处理复杂值函数,因此这个假定的修复方法到目前为止还不起作用。有什么预防或处理这些行为的建议吗

    谢谢你读到这里。非常感谢您的帮助

    RuntimeWarning: invalid value encountered in log
      likelihood += np.log(R[i])
    
    def complex_log(val):
        '''
        Complex logarithm for negative values
    
        Returns log(val) + I*pi
        '''
        if val < 0.0:
            return complex(np.log(np.abs(val)), np.pi)
        return np.log(val)