估计未观测的:使用最大似然法在 Python 中估计移动平均模型

原文:towardsdatascience.com/estimate-the-unobserved-moving-average-model-estimation-with-maximum-likelihood-in-python-5f372cec3652?source=collection_archive---------11-----------------------#2024-06-28

如何使用最大似然估计(MLE)估计未观测协变量的系数

https://medium.com/@pollak.daniel?source=post_page---byline--5f372cec3652--------------------------------https://towardsdatascience.com/?source=post_page---byline--5f372cec3652-------------------------------- Daniel Pollak

·发布于Towards Data Science ·阅读时间:8 分钟·2024 年 6 月 28 日

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/300647241e2591ade3f90bbd02c13b0f.png

图片由Connor Naasz提供,来自Unsplash

对于有时间序列数据和预测经验的人来说,回归、AR、MA 和 ARMA 等术语应该不陌生。线性回归是一个简单的模型,具有封闭形式的参数解,可以通过最小二乘法(OLS)获得。AR 模型也可以通过 OLS 进行估计。然而,MA 模型的情况更为复杂,它构成了更高级的 ARMA 和 ARIMA 模型的第二个组成部分。

本文计划:

  1. 介绍移动平均模型

  2. 讨论为何 MA 模型没有封闭解

  3. 介绍最大似然估计方法

  4. MA(1) 最大似然估计——理论与 Python 代码

移动平均模型

MA 模型可以通过以下公式描述:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/d8b50b75af780962a4fd28205f7e819b.png

方程 1:MA(q) 公式

这里,θ(theta)表示模型参数,而ε(epsilon)是误差项,假定它们是互相独立且服从常方差的正态分布。这个公式背后的直觉是,我们的时间序列 X 总是可以通过系列中最后 q 个冲击来描述。从公式可以明显看出,每个冲击只影响后续的 q 个 X 值,这与 AR 模型不同,在 AR 模型中,冲击的影响会持续下去,尽管会随着时间逐渐减弱。

简单模型的封闭估计——线性回归

提醒一下,线性回归方程的一般形式如下:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/05e531f5319c4f008477de2efa698218.png

方程 2:一般线性回归公式

对于预测任务,我们通常的目标是使用一组 x 和 y 的样本来估计所有模型的参数(beta)。根据我们对模型的一些假设,高斯-马尔科夫定理指出,普通最小二乘法(OLS)对 betas 的估计具有在所有线性无偏估计量中最低的抽样方差。简单来说,OLS 为我们提供了 betas 的最佳估计。

那么,OLS 是什么?它是一个闭式解,用于损失函数最小化问题:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/44114c60ef9374efc409c10735aedd51.png

方程 3:OLS 最小化方程

其中,损失函数 S 定义如下 -

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/46e61adacddd09c1deaca8c27e0ac1a1.png

方程 4:OLS 损失函数

在这个背景下,y 和 X 是我们的样本数据,是可观察的数字向量(如时间序列)。因此,计算函数 S,求出其导数,并找到解决最小化问题的 beta 是直接的。

MA(q)的闭式估计

应该很清楚,为什么像 OLS 这样的估计方法应用于 MA(q)模型是有问题的——因变量,即时间序列值,是由不可观察的变量(epsilons)描述的。这就引出了一个问题:这些模型究竟如何进行估计呢?

最大似然估计(MLE)

似然函数

统计分布通常依赖于一个或多个参数。例如,正态分布由其均值和方差来表征,这些参数定义了它的“高度”和“质心”—

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/ece1c8b44d8345a842f0ef08a6bfcb99.png

正态分布来自于维基百科

假设我们有一个数据集 X={x_1,…x_n},由从一个未知的正态分布中抽取的样本组成,且其参数未知。我们的目标是确定那些最能描述我们数据集 X 的正态分布的均值和方差值,这些均值和方差值使得我们的数据集 X 最可能是从该正态分布中抽样得到的。

最大似然估计(MLE)提供了一个框架,可以精确解决这个问题。它引入了一个似然函数,这是一个输出另一个函数的函数。这个似然函数接受一个参数向量,通常用 theta 表示,并生成一个依赖于 theta 的概率密度函数(PDF)。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/90bb1564ef187f89653b8e970dcbf7a9.png

似然函数的一般定义

一个分布的概率密度函数(PDF)是一个函数,它接受一个值 x,并返回该值在分布中的概率。因此,似然函数通常表示如下:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/456f9612c7bf6b89851084577631fd3d.png

给定 x,似然作为 theta 的函数

该函数的值表示从由 PDF 定义的分布中,观察到 x 的似然性,假设 theta 是其参数

目标

构建预测模型时,我们有数据样本和一个参数化的模型,我们的目标是估计模型的参数。在我们的例子中,例如回归模型和 MA 模型,这些参数是各自模型公式中的系数。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/a686eaf98592b3337da346b90ecf6f4e.png

统计模型估计过程

MLE 中的等效概念是,我们有观察值和一个定义在一组未知且不可直接观察的参数 theta 上的分布的 PDF。我们的目标是估计 theta

MLE 方法包括寻找一组参数 theta,使得在给定可观察数据 x 的情况下,似然函数达到最大值。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/6fa203b5d5c3e4913ca968a43172b6d8.png

似然函数的最大化

我们假设我们的样本 x 是从一个已知 PDF 的分布中抽取的,该 PDF 依赖于一组参数 theta。这意味着,在该 PDF 下观察到 x 的似然性(概率)本质上是 1。因此,识别使得我们的似然函数值在样本上接近 1 的 theta 值,应该揭示出真实的参数值。

条件似然

请注意,我们并没有对似然函数所依据的分布(PDF)做出任何假设。现在,假设我们的观察值 X 是一个向量(x_1, x_2, …, x_n)。我们将考虑一个概率函数,表示在已经观察到(x_1, x_2, …, x_{n-1})的条件下,观察到 x_n 的概率——

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/b628eb50e4fbb5553662921a658cd9b7.png

这表示在已知前面观察值的条件下,仅观察 x_n 的似然性(以及 theta,参数集合)。现在,我们将条件似然函数定义如下:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/d432a00759163e07d59afd0e2c528354.png

条件似然函数

稍后我们将看到,为什么使用条件似然函数而不是精确似然函数是有用的。

对数似然

在实际应用中,通常使用似然函数的自然对数,称为对数似然函数:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/43e35a0a64b76e0493f71695bb840b3d.png

最大化对数似然函数

这样更方便,因为我们通常处理的似然函数是一个独立变量的联合概率函数,这等同于每个变量概率的乘积。取对数后,将这个乘积转换为和。

使用 MLE 估计 MA(1)

为了简化,我将演示如何估计最基本的移动平均模型——MA(1):

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/2cb70a6bc4250b8adbad548dd8b753bb.png

MA(1)模型

这里,x_t 表示时间序列观测值,alpha 和 beta 是待估计的模型参数,epsilon 是从均值为零且方差为 sigma 的正态分布中抽取的随机噪声,sigma 也将被估计。因此,我们的“theta”是(alpha, beta, sigma),我们要估计的正是这些参数。

让我们定义我们的参数并使用 Python 生成一些合成数据:

import pandas as pd
import numpy as np

STD = 3.3
MEAN = 0
ALPHA = 18
BETA = 0.7
N = 1000

df = pd.DataFrame({"et": np.random.normal(loc=MEAN, scale=STD, size=N)})
df["et-1"] = df["et"].shift(1, fill_value=0)
df["xt"] = ALPHA + (BETA*df["et-1"]) + df["et"]

请注意,我们已将误差分布的标准差设置为 3.3,alpha 设置为 18,beta 设置为 0.7。数据大致如下所示 —

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/3db379dc985a0e08595c01c315be070e.png

MA(1) 数据生成过程的模拟

MA(1) 的似然函数

我们的目标是构建一个似然函数来回答这个问题:假设我们的时间序列 X=(x_1, …, x_n) 是由前面描述的 MA(1) 过程生成的,那么观察到这些数据的可能性有多大?

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/947345b1be99350bbb24f5c8ea3a1762.png

观察 X 的似然

计算这个概率的挑战在于我们样本之间的相互依赖 —— 这从 x_t 和 x_{t-1} 都依赖于 e_{t-1} 的事实中可以看出 —— 使得计算所有样本的联合概率(即精确似然)变得非同寻常。

因此,如前所述,我们将不计算精确似然,而是使用条件似然。让我们从给定所有前述样本的情况下观察单个样本的似然开始:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/c0bb56d8d620460ed195d16df8b9ffc2.png

给定其余样本,观察 x_n 的条件似然

这计算起来要简单得多,因为 —

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/d6f46649792a3912f04dfbbfd1cdf268.pnghttps://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/be8c97e8745aec7ec37422597408f555.png

正态分布的概率密度函数

剩下的就是计算观察所有样本的条件似然:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/90b57b8dca8c17a5890715d0796b95dd.png

应用自然对数得:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/83615610be05471262a0d06a459e9076.png

最终的似然函数需要最大化

这是我们应该最大化的函数。

代码

我们将使用来自 statsmodels 的 GenericLikelihoodModel 类来实现我们的最大似然估计(MLE)。如 statsmodels 网站上的教程所述,我们只需继承这个类并包括我们的似然函数计算:

from scipy import stats
from statsmodels.base.model import GenericLikelihoodModel
import statsmodels.api as sm

class MovingAverageMLE(GenericLikelihoodModel):
    def initialize(self):
        super().initialize()
        extra_params_names = ['beta', 'std']
        self._set_extra_params_names(extra_params_names)

        self.start_params = np.array([0.1, 0.1, 0.1])

    def calc_conditional_et(self, intercept, beta):
        df = pd.DataFrame({"xt": self.endog})
        ets = [0.0]
        for i in range(1, len(df)):
            ets.append(df.iloc[i]["xt"] - intercept - (beta*ets[i-1]))

        return ets

    def loglike(self, params):
        ets = self.calc_conditional_et(params[0], params[1])
        return stats.norm.logpdf(
            ets,
            scale=params[2],
        ).sum()

函数 loglike 是实现的关键。给定迭代的参数值 params 和依赖变量(在此为时间序列样本),这些变量作为类成员 self.endog 存储,它计算条件对数似然值,正如我们之前讨论的那样。

现在让我们创建模型并拟合我们的模拟数据:

df = sm.add_constant(df) # add intercept for estimation (alpha)
model = MovingAverageMLE(df["xt"], df["const"])
r = model.fit()
r.summary()

输出结果为:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/9e4512927b243a89efd88794d665358f.png

来自 Python 的最大似然估计(MLE)结果

就这样!如演示所示,最大似然估计成功地估算了我们为模拟选择的参数。

总结

即使是估计一个简单的 MA(1) 模型,也能展示这种方法的强大功能,它不仅能高效地利用我们的数据,而且为理解和解释时间序列数据的动态提供了坚实的统计基础。

希望你喜欢这个内容!

参考文献

[1] Andrew Lesniewski, 时间序列分析, 2019, 巴鲁克学院,纽约

[2] Eric Zivot, ARMA 模型的估计, 2005

除非另有说明,所有图片均由作者提供

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值