立即开始增强您的 PostgreSQL。
作者:Anber Arif
时序数据是在各个行业以特定时间间隔收集的。这对于 跟踪随时间推移的变化、识别模式和进行预测 至关重要。例如,金融市场分析每日股票价格,气象学家测量每小时的温度,企业跟踪每月的销售数据。这些数据有助于观察趋势和季节性模式,这对战略决策至关重要。
分析时序数据 的一个关键方面是理解其平稳性,因为许多统计方法和模型都假设平稳性。非平稳数据会导致结果不准确,而平稳分析可以降低复杂性并增强可解释性。
在本文中,我们将介绍平稳时序分析的基础知识,全面概述有效分析此类数据的关键概念和技术。我们还将分享平稳分析示例:您将学习如何高效处理时序数据并应用平稳分析来获得有意义的见解,最终增强您做出数据驱动型决策的能力。
平稳时序是一种统计特性不会随时间变化的时序。这意味着,无论何时记录观察结果,过程的统计行为都保持不变。
从直观上看,这意味着如果我们在任何时间点对时序进行快照,则该快照的统计特性将与在不同时间点拍摄的任何其他快照相似。例如,时序的均值和方差将相同,并且观测值之间的相关性仅取决于它们之间的时间差,而不取决于记录它们的绝对时间。
从技术上讲,平稳时序被定义为其联合分布是平移不变的随机过程。这意味着无论我们如何移动时间轴,过程的联合分布都保持不变。换句话说,过程的统计特性不会随时间变化。
我们可以寻找数据中的特定特征来确定时序是平稳的还是非平稳的。例如,平稳时序将具有随时间推移不变的均值、方差和自相关性。另一方面,非平稳时序可能会表现出趋势、季节性或变化的方差。
根据这些特征,我们可以确定以下哪些时序图是平稳的,哪些是非平稳的。
序列 (d)、(h) 和 (i) 由于其明显的季节性而非平稳。季节性是指在一段时间内以固定间隔重复出现的模式。在这些序列中,我们可以看到每年或每隔几年重复出现的峰谷的清晰模式。
序列 (a)、(c)、(e)、(f) 和 (i) 也由于其趋势和不断变化的水平而非平稳。趋势是时序均值的长期增加或减少,而不断变化的水平是指均值的突然变化并持续一段时间。在这些序列中,我们可以看到均值随时间推移不是恒定的,而是系统地增加或减少。
方差增加也排除了序列 (i)。方差是指数据围绕均值的分布。在这个序列中,我们可以看到方差随时间推移而增加,表明数据变得更加分散且更难预测。
只剩下序列 (b) 和 (g) 作为潜在的平稳序列。乍一看,序列 (g) 可能由于其强烈的周期性而非平稳。但是,这些周期是非周期性的,这意味着它们不会以固定的间隔重复出现。相反,它们是由猞猁种群过大而导致可用食物供应不足,从而导致繁殖减少和随后的种群减少。一旦食物供应恢复,种群就会再次增长,从而导致另一个周期。由于这些周期的发生时间从长远来看是不可预测的,因此该序列被认为是平稳的。
平稳性可以用多种方式定义,每种方式都有自己的一套标准。让我们探索常见的平稳性类型
这种平稳性与提供的初始定义一致,强调过程的统计特性随时间推移保持不变。本质上,强平稳性要求过程的整个概率分布在时间偏移下保持不变。这意味着无论何时记录观察结果,分布的形状、分布和位置都保持不变。
假设有一个时间序列数据集,表示一个地区的每日温度。如果该数据集表现出强平稳性,则意味着随着时间的推移,不仅平均温度保持不变,而且整个温度分布也保持不变。例如,无论我们观察的是 1 月还是 7 月的温度,温度分布(包括寒冷和炎热天气的频率)都保持不变。
在一阶平稳性中,关键标准是时间序列的平均值是时不变的。这意味着无论何时记录观测值,过程的均值都随时间保持恒定。换句话说,数据的集中趋势不会随着我们沿着时间轴移动而改变。
让我们考虑一个时间序列数据集,该数据集表示某只股票在一年内的每日收盘价。如果该数据集表现出一阶平稳性,则意味着该股票的平均收盘价在全年保持不变,而与所考虑的具体日期或时间段无关。例如,如果全年的平均收盘价为每股 100 美元,则无论我们分析的是 1 月还是 12 月的数据,该平均值都保持一致。平均收盘价的这种稳定性表明一阶平稳性。
弱平稳性通过添加另一个标准扩展了一阶平稳性的原理:不同时间点之间的互协方差也是平稳的。这意味着随着时间的推移,不仅时间序列的平均值保持不变,而且不同观察值之间的关系也保持稳定。
让我们继续以股票每日收盘价为例。在弱平稳时间序列中,不仅平均收盘价随时间保持不变,而且不同日期收盘价之间的关系也保持稳定。例如,如果某一天的股票收盘价与下一天的收盘价高度相关,则无论具体日期如何,这种关系都会随着时间的推移保持一致。
在二阶平稳性中,不仅时间序列的平均值随时间保持不变,而且过程的方差也应保持不变。这意味着除了时不变均值之外,数据点围绕均值的散布或变异性也应随时间保持一致。
例如,如果股票在一段时间内的平均收盘价为每股 100 美元,并且收盘价围绕该平均值的方差或标准差为 5 美元,则二阶平稳性意味着方差随时间保持不变。这意味着即使股票价格每天都在波动,收盘价围绕均值的变异程度或离散程度也保持一致。
平稳性的概念涵盖了统计特性相对于时间偏移的稳定性。但是,对平稳性的解释可能会因分析或预测目标而异。更宽松的定义可以容忍统计特性的微小波动,从而为分析嘈杂或不规则数据提供了灵活性。相反,更严格的定义要求关键指标(例如均值和方差)具有一致的稳定性,这对于准确的预测或假设检验至关重要。因此,平稳性定义的选择取决于分析目标和数据特征。
让我们探讨平稳性在时间序列分析中的意义
时间序列数据跨越时间:时间序列数据本质上是时间性的,它捕获了一系列时间间隔内的观察结果。为了进行有意义的分析,数据的统计特性必须随着时间的推移保持一致。这种一致性使分析师能够就驱动数据的潜在过程得出可靠的结论,并根据这些见解做出明智的决策。
简化统计分析:当时间序列的统计特性随时间变化时,统计分析将变得具有挑战性和复杂性。均值、方差和自相关等特性的不一致性会使建模工作复杂化并阻碍解释。平稳性通过提供一个稳定的框架来简化分析,在该框架中,这些特性随时间保持不变。
预测和模型的基础:假设一定程度的平稳性至关重要,尤其是在预测和建模方面。通过假设平稳性,我们可以更有效地处理数据中的噪声,从而获得更可靠的预测和模型结果。
了解时间序列是否平稳对于准确建模和预测至关重要。在本节中,我们将探讨用于确定时间序列平稳性的各种方法。
单位根检验是一种统计方法,用于确定时间序列是否由于存在单位根而变得非平稳。这个概念植根于时间序列的随机特性及其特征方程。
单位根检验评估值 1 是否是从控制时间序列的随机过程导出的特征方程的根。简而言之,这涉及检查该序列是否可以通过一个方程式来描述,其中单位根(值 1)的存在意味着非平稳性。
在数学上,这意味着该序列可以用自回归模型表示,如果滞后项的系数等于 1,则该序列具有单位根。
其中 *yt* 是时间序列在时间 *t* 时的值,
*t-1* 是时间序列在时间 *t-1* 时的值,*ϵt* 是白噪声误差项。
非平稳性:如果检验表明 1 是特征方程的根,则确认时间序列是非平稳的。这种非平稳性的特征是统计特性(例如均值和方差)随时间变化。
无确定性趋势:即使该序列是非平稳的,也不意味着存在确定性趋势。相反,该序列遵循随机游走,它可以随时间漂移而没有可预测的模式。
根本上是混乱的:简而言之,具有单位根的时间序列从根本上说是混乱的。这意味着对系统的冲击具有永久性影响,导致该序列偏离其初始值,而不是恢复到长期均值。这种行为使得建模和预测变得具有挑战性,因为过去的值不能为预测提供稳定的基础。
最常用的单位根检验如下
增广迪基-福勒 (ADF) 检验是一种广泛使用的统计检验,用于检测时间序列中是否存在单位根,这有助于确定该序列是否是非平稳的。该检验通过包括该序列的滞后差分来解释高阶自相关,从而扩展了更简单的迪基-福勒检验,使其更加稳健可靠,适用于实际应用。
ADF 检验通过估计以下回归方程来进行
其中
Δ*Yt* 是时间序列 *Yt* 的一阶差分(即,*Yt* −*Yt*−1)。
*t* 是时间趋势(可选)。
*Yt*−1 是时间序列的滞后水平。
*α* 是一个常数。
*β* 是时间趋势的系数。
*γ* 是时间序列的滞后水平的系数。
*p* 是模型中包含的滞后差分的数量。
*δi* 是滞后差分的系数。
*ϵt* 是误差项。
ADF 检验的原假设是时间序列具有单位根(即,*γ*=0),这意味着非平稳性。备择假设是该序列是平稳的(*γ*<0)。
ADF 检验的结果是一个检验统计量,它告诉我们时间序列中存在单位根的可能性。
检验统计量:ADF 检验统计量的计算公式为
ADF 统计量 =
其中:
ŷ 是滞后水平项 *Yt*−1 的估计系数,SE(ŷ) 是其标准误差。
以下是解释此数字的总体思路
负值越多:ADF 统计量越负,我们就可以越有把握地断定该序列没有单位根,因此是平稳的。这是因为较大的负值表示估计的 *γ* 显着小于零,这表明时间序列恢复到均值并且没有表现出随机游走。
临界值:将计算出的 ADF 统计量与不同显着性水平(例如 1 %、5 % 和 10 %)下的临界值进行比较。如果 ADF 统计量小于临界值,则我们拒绝原假设并得出该序列是平稳的结论。
例如,如果 ADF 统计量为 -3.5,而 5 % 显着性水平下的临界值为 -3.0,则我们拒绝单位根的原假设,因为 -3.5 比 -3.0 更负。这表明有强有力的证据表明时间序列是平稳的。
Kwiatkowski-Phillips-Schmidt-Shin (KPSS) 检验评估时间序列是否是趋势平稳的,这意味着它在移除任何确定性趋势后是平稳的。它通过检查序列在考虑趋势后是否恢复到均值来提供趋势平稳性的阳性检验。
KPSS 检验涉及将时间序列 *Yt* 分解为三个部分
*Yt* =*βt*+*rt*+*ϵt*
其中
*βt* 是一个确定性趋势。
*rt* 是一个随机游走。
*ϵt* 是一个平稳误差项。
KPSS 检验的检验统计量基于 *Yt* 对 *α* 和 *βt* 的回归残差。检验统计量由下式给出
其中
*St* 是残差的部分和。
*T* 是观测值的次数。
*σ*<*sup>2* 是残差的长期方差的估计值。
KPSS 检验的原假设是时间序列围绕确定性趋势是平稳的。备择假设是该序列是非平稳单位根过程。 如果检验统计量大于临界值,则拒绝原假设,表明该序列不是平稳的并且可能具有单位根。
KPSS 检验的临界值对于确定是否拒绝平稳性的原假设至关重要。下表提供了两种情况下不同显着性水平(10 %、5 % 和 1 %)的KPSS 检验临界值:检验 A(仅截距)和检验 B(线性趋势)。
显着性水平 | 检验 A(仅截距) | 检验 B(线性趋势) |
0.10 | 0.347 | 0.119 |
0.05 | 0.463 | 0.146 |
0.01 | 0.739 | 0.216 |
要解释这些值,请计算数据的 KPSS 统计量并将其与相关的临界值进行比较。如果 KPSS 统计量超过临界值,则拒绝平稳性的原假设。例如,KPSS 统计量为 0.5,而检验 A 中 5 % 显着性水平的临界值为 0.463,则将拒绝水平平稳性,而统计量为 0.12,而检验 B 中的临界值为 0.146,则不会导致拒绝趋势平稳性。
当时间序列数据不平稳时,对其进行转换可以帮助稳定其属性以便进行分析。常用的技术包括
差分: 计算连续观测值之间的差值,以消除趋势并稳定均值。例如,ΔYt =Yt −Yt−1
对数变换: 应用对数来稳定方差。这对于呈指数增长的数据特别有用。例如,log(Yt)。
季节性差分: 通过在等于季节性周期的滞后时间差分序列来消除季节性影响,例如,对于具有年度季节性的月度数据,Δ12Yt =Yt −Yt−12。
分解: 将时间序列分解为趋势、季节性和残差成分,其中残差(噪声)成分通常是平稳的。
将数据转换为平稳序列后,我们就可以分析其稳定的属性,例如均值、方差和自相关函数。利用这些属性,我们可以构建时间序列模型并进行预测。
最后,我们可以通过反向变换将结果连接到原始序列。例如,如果我们对数据进行了自然对数变换,则可以对预测值求幂以获得原始序列的预测值。
这是一个说明变换过程的简单图表
在时间序列分析中,通常对原始数据应用变换以稳定方差、使数据平稳或消除趋势和季节性。以下是三种常见的变换
随机游走模型是一种非平稳时间序列模型,其中任何时间点的值都是前一个值加上一个随机冲击。在数学上,它可以表示为
Yt =Yt−1 + ϵt
其中 ϵt 是白噪声误差项。
然而,在许多情况下,时间序列可能会表现出趋势,即序列的值随着时间的推移而增加或减少。为了解释这种趋势,我们可以在随机游走模型中引入一个漂移项,从而得到带有漂移的随机游走模型:
Yt = c + Yt−1 + ϵt
其中 c 是漂移项,表示连续时间段内 Yt 值的平均变化。如果 c 为正,则平均变化是 Yt 值的增加,并且时间序列将倾向于随着时间的推移而向上漂移。另一方面,如果 c 为负,则平均变化是 Yt 值的减少,并且时间序列将倾向于随着时间的推移而向下漂移。
将随机游走模型转换为平稳序列通常涉及差分。随机游走序列的一阶差分去除了对先前值和漂移项的依赖性,从而得到平稳序列
ΔYt =Yt −Yt−1 = c + ϵt
其中 ΔYt 是 Yt 的一阶差分。
在这种情况下,撤消变换涉及对差分值求和以获得原始序列。如果对差分序列进行建模,则必须对预测值进行积分(求和)以将其转换回原始尺度。
二阶差分涉及取一阶差分的差分。当时间序列显示二次趋势时使用此技术。在数学上,它表示为
Δ2Yt = Δ(Yt −Yt−1) = (Yt −Yt−1)−(Yt−1 −Yt−2) = Yt − 2Yt−1 +Yt−2
使用二阶差分变换序列有助于消除多项式趋势,使其平稳。撤消此变换涉及两次对差分求和。如果对二阶差分序列进行预测,则必须首先对其进行积分以获得一阶差分,然后再求和以返回到原始尺度。
季节性差分用于消除时间序列中的季节性影响。这涉及在等于季节性周期的滞后时间差分序列。例如,对于具有年度季节性的月度数据
ΔsYt =Yt −Yt−s
其中 s 是季节性周期(例如,对于具有年度季节性的月度数据,为 12)。
季节性差分消除了季节性模式,从而得到平稳序列。撤消变换涉及通过将差分值添加到滞后季节性周期的序列来反转季节性差分。如果变换后的序列用于建模和预测,则必须通过加回季节性成分来调整预测值。
您可以使用几个强大的时间序列软件包来执行平稳分析
TSstudio for R:TSstudio 是一个 R 软件包,为时间序列分析提供了一个用户友好的界面。它通过直观的函数简化了探索和理解时间序列数据的过程。
Statsmodels for Python:这是一个强大的 Python 统计建模库,包括用于时间序列分析的工具。它提供了执行各种检验、分解和预测的功能。
Django-TimescaleDB:在 PostgreSQL 环境中处理时间序列数据时,强烈建议使用 TimescaleDB,因为它具有高性能和可扩展性。对于 Python 集成,首选 django-timescaledb
扩展,因为它将 TimescaleDB 与 Django 框架无缝集成。此外,psycopg2 或 psycopg3 库对于与 PostgreSQL 数据库进行高效交互至关重要。如果有任何不确定性,请使用推荐的 vanilla PostgreSQL 库,以确保管理和分析时间序列数据的兼容性和可靠性。
让我们以 USgas 数据集为例,这是一个软件包数据集,表示自 2000 年 1 月以来美国每月的天然气消费量(单位:十亿立方英尺)。
安装 TSstudio 软件包(如果您尚未安装)并加载库,如下所示
install.packages("TSstudio")
library(TSstudio)
现在,您可以加载序列并显示其信息,如下所示
# Load the USgas dataset
data("USgas")
ts_info(USgas)
以下是分解序列的方法
ts_decompose(USgas)
趋势:在这种情况下,趋势明显向上,表明美国天然气消费量一直在增加。
季节性:时间序列的季节性成分表示以固定间隔出现的重复模式。
在这种情况下,季节性成分显示出冬季天然气消费量较高、夏季消费量较低的明显模式。这可能是由于冬季对供暖的需求增加,而夏季对制冷的需求增加。
随机(噪声):噪声成分显示出一些可变性,但与趋势和季节性成分相比相对较小。
对于时间序列的噪声成分,我们可以分析其平稳性,以更好地了解潜在的模式和趋势。
让我们执行二阶平稳性分析,以检查时间序列数据中噪声成分的稳定性
# Load the forecast package
library(forecast)
# Fit an ARIMA model to the USgas time series data
model <- auto.arima(USgas)
# Extract the residuals from the model
residuals <- resid(model)
# Perform the Ljung-Box test on the residuals for autocorrelation
lb_test_autocorr <- Box.test(residuals, type = "Ljung-Box")
# Test for constant mean using a t-test
mean_test <- t.test(residuals, mu = 0)
# Test for constant variance using the chi-squared test
variance_chi_squared <- chisq.test(residuals^2)
# Print the test results
print("Autocorrelation (Ljung-Box test):")
print(lb_test_autocorr)
print("\nMean Test:")
print(mean_test)
print("\nVariance Test:")
print(variance_chi_squared)
此代码使用 R 中 forecast
软件包中的 auto.arima()
函数将 ARIMA 模型拟合到 USgas 时间序列数据。然后,它从模型中提取残差,并执行三项检验以检查平稳性:用于自相关的 Ljung-Box 检验、用于常数均值的 t 检验和用于常数方差的卡方检验。
残差分析表明没有显着的自相关性,如 Ljung-Box 检验的 p 值 0.8227 所示。鉴于此 p 值超过了典型的 0.05 显着性水平,因此我们不拒绝原假设。
其次,为评估残差均值而进行的单样本 t 检验表明,与零没有统计学意义上的显着偏差。p 值为 0.3528,我们无法拒绝残差均值等于零的原假设。这表明,平均而言,残差以零为中心,表明 ARIMA 模型有效地捕捉了数据中的潜在趋势。然而,卡方检验表明明显缺乏常数方差(p < 2.2e-16),这可能表明违反了二阶平稳性。
以下是使用 R 中残差置信区间和模型预测区间的趋势和季节性基本模型示例
# Load the forecast package
library(forecast)
# Load the USgas dataset
data(USgas)
# Convert the USgas data to a time series object
USgas_ts <- ts(USgas, start = c(1960, 1), frequency = 12)
# Fit a seasonal ARIMA model with trend and seasonality
model <- auto.arima(USgas_ts, seasonal = TRUE)
# Print the summary of the model
summary(model)
# Plot the original time series and the fitted values
plot(USgas_ts, main = "US Gas Consumption")
lines(fitted(model), col = "red")
# Calculate the residuals
residuals <- resid(model)
# Calculate the average and variance of the residuals
mean_residuals <- mean(residuals)
var_residuals <- var(residuals)
# Print the average and variance of the residuals
cat("Mean of residuals:", mean_residuals, "\n")
cat("Variance of residuals:", var_residuals, "\n")
# Calculate the standard deviation of the residuals
sd_residuals <- sd(residuals)
# Calculate the upper and lower bounds of the 95% confidence interval
upper_bound <- mean_residuals + 1.96 * sd_residuals
lower_bound <- mean_residuals - 1.96 * sd_residuals
# Plot the original time series, the fitted values, and the 95% confidence interval
plot(USgas_ts, main = "US Gas Consumption")
lines(fitted(model), col = "red")
lines(USgas_ts + upper_bound, col = "blue", lty = 2)
lines(USgas_ts + lower_bound, col = "blue", lty = 2)
# Shade the area between the upper and lower bounds of the 95% confidence interval
polygon(c(time(USgas_ts), rev(time(USgas_ts))), c(USgas_ts + upper_bound, rev(USgas_ts + lower_bound)), col = "lightblue", border = NA)
编者注:详细了解 使用 R 进行时间序列分析。
在此代码中,我们首先加载 USgas 数据集并将其转换为时间序列对象。然后,我们使用 auto.arima()
函数拟合具有趋势和季节性的季节性 ARIMA 模型。summary()
函数提供了有关拟合模型的详细信息。
接下来,我们绘制原始时间序列和从 ARIMA 模型获得的拟合值。 然后,我们计算模型的残差并计算其均值和方差,以评估模型的性能。
我们还计算残差的标准差,以确定残差 95% 置信区间的上限和下限。这些界限有助于我们可视化残差围绕均值的变异性。
最后,我们绘制原始时间序列、拟合值和 95% 置信区间。我们对置信区间上限和下限之间的区域进行阴影处理,以说明模型预测值周围的可变性和不确定性。
平稳性分析是 时间序列分析 中的一项关键技术。理解和识别数据中的平稳性为更高级的建模和预测奠定了基础,因为它使您能够对数据随时间推移的行为做出可靠的假设。
通过确保时间序列的统计特性保持不变,您可以更有效地解释和预测未来值,即使在看似混乱的数据集中也是如此。借助这份入门读物,您可以从学习平稳性分析以及如何将其应用于您的 时间序列数据 开始。
准备好释放时间序列数据的全部潜力了吗?试试 TimescaleDB,这是为扩展时间序列数据而优化的 PostgreSQL 数据库。立即开始并发现其功能,注册免费试用(推荐)或如果您更喜欢自行托管,只需安装它。