处理过程如下:
在科学上,白噪声是一种具有均匀功率谱密度的随机信号。它的频谱在所有频率上具有相等的功率,因此频谱密度是常数。具体地说,白噪声在频率上呈现平坦的特性,即在特定频率范围内,每个频率的能量相等。白噪声的定义需要满足以下三个条件:
其中 代表白噪声序列。
从统计学的角度来看,白噪声是一个具有零均值和恒定方差的高斯随机过程。
白噪声检验是一种检验时间序列是否随机的方法。在统计学中,白噪声是一种理想的随机信号,其具有无自相关性和常数方差的特点。如果时间序列是白噪声,那么它就是完全随机的,过去的行为对未来的发展没有丝毫影响,故而没有必要再深入分析了。如果时间序列不是白噪声,那么就需要使用各种简单又不失准确的平稳时间序列预测模型进行预测。
以下是一些常用的白噪声检验方法:
自相关图:由定义知,白噪声完全无自相关性,除0阶自相关系数为1外,理想情况下对于所有 k>0,延迟 k 阶的样本自相关系数均为0。
实际上由于样本序列的有限性,延迟 k 阶自相关系数并不完全为0,只要在0值附近即认为无自相关性(自相关函数,用来衡量时间序列在滞后 k 的情况下的相关)。为了判断自相关性是否显著,我们通常在自相关图中添加置信区间。置信区间通常基于以下假设:如果时间序列是白噪声,那么任何非零延迟的自相关系数都应该接近于0,并且在一定的置信水平下,它们应该落在置信区间内。
通常情况下,我们使用95%置信区间,这意味着如果自相关系数落在置信区间之外,我们就有足够的理由拒绝“序列是白噪声”的原假设。在自相关图中,这个置信区间通常用两条水平线表示。当自相关系数的值超出这两条线时,表明在该延迟阶数下的自相关性是显著的。
以下为代码示例:
1import numpy as np
2import matplotlib.pyplot as plt
3from statsmodels.graphics.tsaplots import plot_acf
4
5np.random.seed(0)
6data = np.random.normal(0, 1, size=100)
7
8# 绘制时间序列的自相关图
9fig, ax = plt.subplots(figsize=(8, 4))
10plot_acf(data, lags=10, ax=ax, alpha=0.05) # 添加95%置信区间,alpha=0.05表示置信水平为95%
11plt.show()
1import numpy as np
2import matplotlib.pyplot as plt
3from statsmodels.graphics.tsaplots import plot_acf
4
5np.random.seed(0)
6data = np.random.normal(0, 1, size=100)
7
8# 绘制时间序列的自相关图
9fig, ax = plt.subplots(figsize=(8, 4))
10plot_acf(data, lags=10, ax=ax, alpha=0.05) # 添加95%置信区间,alpha=0.05表示置信水平为95%
11plt.show()
在上述代码中,我们使用 plot_acf
函数绘制了时间序列 data
的自相关图。通过设置 lags
参数为需要显示的滞后阶数(这里选择了10个滞后),我们可以观察与不同滞后值的自相关性。alpha=0.05
参数用于设置置信区间的置信水平。默认情况下,plot_acf
函数会计算并显示95%的置信区间,由图中的蓝色阴影区域表示。如果某个延迟阶数的自相关系数落在蓝色阴影区域外,就意味着在该延迟阶数上存在显著的自相关性。如果所有的自相关系数都在阴影区域内,那么我们不能拒绝时间序列是白噪声的假设。如果在图中的滞后值之间存在显著的相关性,那么时间序列可能不是白噪声。
输出结果:
Ljung-Box检验:Ljung-Box检验是一种统计检验,用于检验时间序列数据中至多某一滞后阶数的观测值是否随机(即无自相关性)。在使用Ljung-Box检验时,我们会设定一个原假设H0:“时间序列值相互独立,即为白噪声”。我们通过计算序列的自相关性来验证这个假设。自相关性是指时间序列中前后数据之间的相关关系。Ljung-Box检验会计算出一个检验统计量以及与之对应的p值(p-value)。
在实际应用中,我们通常会选择一个显著性水平α(例如0.05),如果计算出的p值低于这个水平,那么我们就有足够的证据拒绝原假设,认为序列不是白噪声。
以下为代码示例:
1import numpy as np
2import pandas as pd
3from statsmodels.stats.diagnostic import acorr_ljungbox
4
5# 假设我们有一个numpy数组或pandas序列 'ts' 表示我们的时间序列数据
6ts = pd.Series(np.random.randn(100)) # 我们这里生成了一个随机的时间序列作为例子
7
8# 对数据进行Ljung-Box检验
9lb_test_stat, lb_p_value = acorr_ljungbox(ts, lags=10)
10# lags参数表示检验的最大滞后阶数。你可以根据实际需要来设定
11
12print('Test statistic:', lb_test_stat)
13print('p-value:', lb_p_value)
1import numpy as np
2import pandas as pd
3from statsmodels.stats.diagnostic import acorr_ljungbox
4
5# 假设我们有一个numpy数组或pandas序列 'ts' 表示我们的时间序列数据
6ts = pd.Series(np.random.randn(100)) # 我们这里生成了一个随机的时间序列作为例子
7
8# 对数据进行Ljung-Box检验
9lb_test_stat, lb_p_value = acorr_ljungbox(ts, lags=10)
10# lags参数表示检验的最大滞后阶数。你可以根据实际需要来设定
11
12print('Test statistic:', lb_test_stat)
13print('p-value:', lb_p_value)
运行上述代码后,会得到一个测试统计量lb_test_stat
和对应的p值lb_p_value
,它们分别代表了在每一个滞后阶数下的Ljung-Box检验的结果。
如果所有滞后阶数的p值都大于预设的显著性水平(比如0.05),那么我们就不能拒绝原假设,即我们无法证明该序列不是白噪声。
注意:在进行Ljung-Box检验时,通常我们只关心检验的最大滞后阶数的结果,即lb_p_value[-1]
。
输出结果:
1Test statistic: [1.34214461e-04 6.63245366e-01 1.38424196e+00 2.55724613e+00
2 5.00521789e+00 5.62536475e+00 7.11510857e+00 7.15917272e+00
3 8.91556269e+00 1.14747609e+01]
4p-value: [0.99075664 0.71775809 0.70923263 0.63441515 0.41524372 0.46643601
5 0.41699411 0.5195607 0.44510479 0.32174435]
1Test statistic: [1.34214461e-04 6.63245366e-01 1.38424196e+00 2.55724613e+00
2 5.00521789e+00 5.62536475e+00 7.11510857e+00 7.15917272e+00
3 8.91556269e+00 1.14747609e+01]
4p-value: [0.99075664 0.71775809 0.70923263 0.63441515 0.41524372 0.46643601
5 0.41699411 0.5195607 0.44510479 0.32174435]
时间序列分析中,平稳性是非常重要的一个概念。平稳性的核心思想是,一个时间序列的统计特征在时间的推移中是恒定的。通常来说,我们将平稳性分为两种:强平稳和弱平稳。在实际的数据分析中,我们通常关注的是弱平稳。
所谓弱平稳,是指时间序列满足以下两个条件:
以下是两种常见的用于平稳性检验的方法:
观察法通过直观检查时间序列的图表来进行平稳性判断。例如,我们可以查看时间序列的趋势图和自相关图,看看是否存在明显的规律性变化。如果时间序列展现出明显的周期性,我们可能需要通过差分或移动平均等方法来消除这些周期性,使得序列平稳。对于非线性周期成分,则可能需要更复杂的方法来处理。另外,如果一个序列是平稳的,那么它的自相关系数应该会迅速减小并趋于零,这也是判断平稳性的一个重要依据。
单位根检验:其中,ADF(Augmented Dickey-Fuller)检验是一种广泛使用的单位根检验方法。它的基本思路是把时间序列表示为它自身的滞后项,然后进行检验。在ADF检验中,原假设是序列包含单位根,即非平稳;而备择假设是序列无单位根,即是平稳的或者趋势平稳的。如果检验结果不能拒绝原假设,则认为该序列非平稳;反之,则可以认为序列是平稳的。ADF检验的一个优点是它能够考虑到序列中可能存在的自相关和趋势性。
以下为代码示例:
1import numpy as np
2import pandas as pd
3from statsmodels.tsa.stattools import adfuller
4
5# 假设我们有一个numpy数组或pandas序列 'ts' 表示我们的时间序列数据
6ts = pd.Series(np.random.randn(100)) # 我们这里生成了一个随机的时间序列作为例子
7
8# 对数据进行ADF检验
9result = adfuller(ts)
10
11print('ADF Statistic: %f' % result[0])
12print('p-value: %f' % result[1])
13print('Critical Values:')
14for key, value in result[4].items():
15 print('\t%s: %.3f' % (key, value))
1import numpy as np
2import pandas as pd
3from statsmodels.tsa.stattools import adfuller
4
5# 假设我们有一个numpy数组或pandas序列 'ts' 表示我们的时间序列数据
6ts = pd.Series(np.random.randn(100)) # 我们这里生成了一个随机的时间序列作为例子
7
8# 对数据进行ADF检验
9result = adfuller(ts)
10
11print('ADF Statistic: %f' % result[0])
12print('p-value: %f' % result[1])
13print('Critical Values:')
14for key, value in result[4].items():
15 print('\t%s: %.3f' % (key, value))
在运行上述代码后,你会得到ADF统计量、p值以及不同置信度下的临界值。如果ADF统计量小于1%、5%或10%的置信度下的临界值,或者p值小于预设的显著性水平(如0.05),那么你就可以拒绝原假设,即认为该时间序列是稳定的。
输出结果:
1ADF Statistic: -1.545422
2p-value: 0.510934
3Critical Values:
4 1%: -3.504
5 5%: -2.894
6 10%: -2.584
1ADF Statistic: -1.545422
2p-value: 0.510934
3Critical Values:
4 1%: -3.504
5 5%: -2.894
6 10%: -2.584
记住,不同的处理方法适应于不同类型的非平稳性,需要根据具体的时间序列特点来选择合适的处理方法。并且,所有的这些平稳性处理都可能会带来一些信息损失,因此在实际应用中需要谨慎选择。
对于观测到的时间序列,若其检验为非白噪声且序列平稳,则通常根据相关系数(Autocorrelation Function, ACF)和偏相关系数Partial Autocorrelation Function, PACF)来识别模型,判断AR模型是否适用该序列,大致确定阶数 。
"ACF",又称自相关函数,它用来衡量时间序列在滞后k的情况下的相关性,是自相关系数构成的序列。
对于时间序列,与的相关系数称为的间隔为的自相关系数。由于时间序列中每个时刻下只有一个观测值,自相关系数通过计算序列自身前后两个时间段内的相关性来估算得到。
"PACF",又称偏自相关函数,它用来衡量在排除中间影响后,时间序列在滞后 的情况下的直接相关性。即 与 的偏自相关系数仅根据这两个数字得到,与中间的数值无关。
如果一个时间序列满足以下两个条件:
拖尾性和截尾性的解释:
拖尾性是描述数据分布在两端(高值或低值区域)渐渐减小但未迅速趋于零的特性。如果一个数据集具有拖尾性,就意味着即便是在这些极端的高值或低值区域,仍然有一定数量的数据点存在,它们的出现并非完全不可能。因此,这些数据集的尾部会显得比较长,尾部的数值也可能异常地大或小。拖尾性常常被用来形容那些极端值出现几率较高的分布,我们通常称之为“重尾”分布。
例如,假设我们调查一群人的年收入情况。如果这个收入的分布是拖尾的,那么在高收入区域,仍然有相对较多的人拥有高额收入,这就意味着收入分布的尾部呈现出一定的长度,并且可能延伸至非常高的收入水平。
截尾性则是指数据分布在某个特定的数值点上或之后突然中断,不再继续延伸。这通常是因为存在某种外部的限制或界限,它使得数据无法超过这个特定的值。在截尾分布中,你会发现数据在这个界限值处停止,不再有任何数值超过这个点。
比如,我们考察一次考试的成绩分布,假设这次考试的最高分是100分。如果成绩分布是截尾的,那么意味着成绩不可能超过100分,因为100分是这个考试的最高可能分数。在这种情况下,数据分布在100分这个上限处截止,不会有任何成绩超过这个分数。
总结一下,拖尾性描述了分布在尾部衰减的速度,而拖尾分布在尾部可能继续存在一些极端值。截尾性描述了分布在某个值上被截断或限制的情况,无法观察到超过该值的数据。
以下为计算ACF和PACF的代码示例:
1import numpy as np
2import pandas as pd
3import matplotlib.pyplot as plt
4from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
5from statsmodels.tsa.stattools import acf, pacf
6
7# 假设我们有一个numpy数组或pandas序列 'ts' 表示我们的时间序列数据
8ts = pd.Series(np.random.randn(100)) # 我们这里生成了一个随机的时间序列作为例子
9
10# 计算ACF的值并绘图
11acf_values = acf(ts, nlags=20, fft=True)
12print('ACF values:', acf_values)
13plot_acf(ts, lags=20)
14plt.title("ACF")
15
16# 计算PACF的值并绘图
17pacf_values = pacf(ts, nlags=20, method='ols')
18print('PACF values:', pacf_values)
19plot_pacf(ts, lags=20)
20plt.title("PACF")
21
22plt.show()
1import numpy as np
2import pandas as pd
3import matplotlib.pyplot as plt
4from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
5from statsmodels.tsa.stattools import acf, pacf
6
7# 假设我们有一个numpy数组或pandas序列 'ts' 表示我们的时间序列数据
8ts = pd.Series(np.random.randn(100)) # 我们这里生成了一个随机的时间序列作为例子
9
10# 计算ACF的值并绘图
11acf_values = acf(ts, nlags=20, fft=True)
12print('ACF values:', acf_values)
13plot_acf(ts, lags=20)
14plt.title("ACF")
15
16# 计算PACF的值并绘图
17pacf_values = pacf(ts, nlags=20, method='ols')
18print('PACF values:', pacf_values)
19plot_pacf(ts, lags=20)
20plt.title("PACF")
21
22plt.show()
这段代码会分别计算出ACF和PACF的值,并将它们打印出来。同时,也会分别绘制出ACF和PACF的图像。
输出结果:
1ACF values: [ 1. -0.03333762 0.10751979 0.01624085 -0.25064801 -0.07576264
2 -0.23142697 -0.0136735 0.03541102 0.00489263 0.14372612 -0.04120279
3 0.00558045 0.12662628 -0.06255391 -0.07397497 -0.09759775 -0.06796084
4 -0.01106238 -0.08811519 0.00109535]
5PACF values: [ 1. -0.03363457 0.11221159 0.02813805 -0.28560334 -0.12254314
6 -0.22578095 -0.03830744 0.01213197 -0.02052727 0.03225975 -0.11272723
7 -0.1024606 0.12969415 -0.01172058 -0.17775982 -0.14392398 -0.01093026
8 -0.00594263 -0.1163537 -0.10895326]
1ACF values: [ 1. -0.03333762 0.10751979 0.01624085 -0.25064801 -0.07576264
2 -0.23142697 -0.0136735 0.03541102 0.00489263 0.14372612 -0.04120279
3 0.00558045 0.12662628 -0.06255391 -0.07397497 -0.09759775 -0.06796084
4 -0.01106238 -0.08811519 0.00109535]
5PACF values: [ 1. -0.03363457 0.11221159 0.02813805 -0.28560334 -0.12254314
6 -0.22578095 -0.03830744 0.01213197 -0.02052727 0.03225975 -0.11272723
7 -0.1024606 0.12969415 -0.01172058 -0.17775982 -0.14392398 -0.01093026
8 -0.00594263 -0.1163537 -0.10895326]
模型假设里分明提到应用于时间序列模型的数据需要有独立性,然而这里白噪声检验是为了确保数据之间相互关联,这是否矛盾?
在这里我们需要澄清独立性和白噪声的概念:
独立性:在时间序列分析中,我们通常希望序列中的观测值之间是相互独立的,这意味着一个观测值的出现不会影响其他观测值的出现。然而,在实际的时间序列数据中,观测值之间往往存在某种程度的相关性,即使是在理论上独立的数据也可能展现出随时间的自相关性。因此,在时间序列分析中,当我们说数据需要具有独立性时,我们通常指的是观测值之间的相关性要足够低,以至于不会影响模型的预测能力。
白噪声:白噪声是一种特殊类型的时间序列数据,其中的观测值是完全随机的,互相独立且同分布(即具有相同的均值和方差)。它是一个理想化的概念,用于表示一个时间序列没有可被利用的结构(例如趋势或季节性),因此无法进行有效的预测。
白噪声检验的目的是为了确定一个时间序列是否包含可以被模型化的信息。如果一个序列是纯白噪声,那么它不包含任何可预测的模式,因此不需要进一步的时间序列分析。相反,如果序列不是白噪声,那么它可能包含趋势、周期性、或者其他可以通过模型捕捉并用于预测的结构。
总结一下,虽然白噪声确实是由独立的观测值组成的,但在时间序列分析中,我们通常希望找到非白噪声的序列,因为这意味着存在潜在的模式和结构,可以通过建立模型来预测未来的观测值。因此,白噪声检验可以帮助我们区分哪些序列值得进一步分析,哪些序列由于缺乏结构而不适合建模分析。
模型假设里提到应用于时间序列模型的数据需要有恒定方差,然而白噪声的定义中也包含了恒定方差,二者是否矛盾?
在时间序列分析中,"同方差性"或"稳定方差"的假设确实是指序列的波动性在整个观测期内是一致的。另一方面,白噪声是一种特殊的时间序列,其中的数据点是完全随机的,具有零均值和恒定方差。重要的是要区分这两个概念:一个是时间序列分析中的一般假设,另一个是特定类型的时间序列。
时间序列模型,是用来预测或解释时间序列数据中的模式和结构的。为了有效地应用这些模型,我们通常希望数据不是纯随机的,而是包含一些可以建模的趋势或季节性等特征。如果一个序列是白噪声,意味着它不包含任何可以预测的模式或结构,因此用时间序列模型去拟合白噪声是没有意义的。
现在来看"恒定方差"这个概念,它在这两个上下文中并不矛盾:
总结来说,"恒定方差"在时间序列模型的假设中是指模型误差的稳定性,而在白噪声的上下文中是指数据点分布的随机性和独立性。两者不矛盾,而是用于不同目的和分析阶段。