为何R与Python中Augmented Dickey-Fuller(ADF)检验结果差异显著?
为何Augmented Dickey-Fuller(ADF)检验在R与Python中的结果存在巨大差异?
针对AirPassengers时间序列数据集,R的ADF检验结果判定序列平稳,但Python结果显示序列非平稳——而从序列图来看,该序列明显存在趋势和季节性,属于非平稳序列。这种差异的核心原因是R和Python的ADF检验默认参数设定不同,具体分析如下:
一、代码及原始结果对比
Python代码及结果
import pandas as pd from statsmodels.tsa.stattools import adfuller df = pd.read_csv("../data/air_passengers.csv") adf_result = adfuller(df['Passengers']) print(f"ADF Statistic: {adf_result[0]}") print(f"p-value: {adf_result[1]}") print(f"Number of Lags Used: {adf_result[2]}")
输出:
ADF Statistic: 0.8153688792060371 p-value: 0.9918802434376408 Number of Lags Used: 13
R语言代码及结果
library(readr) library(tseries) air <- read_csv("../data/air_passengers.csv") adf.test(air$Passengers)
输出:
Augmented Dickey-Fuller Test Dickey-Fuller = -7.318571346919138243, Lag order = 5, p-value = 0.01000000000000000021 alternative hypothesis: stationary
二、差异的核心原因
模型设定(趋势/截距项)不同
- R的
adf.test()默认使用包含趋势项和截距项的模型(对应Python中regression='ct'参数),适配带有趋势的序列特征; - Python的
adfuller()默认仅使用截距项(regression='c'),未考虑序列的趋势成分,导致检验无法正确识别非平稳性。
- R的
滞后阶数选择逻辑差异
- R的
adf.test()通过AIC准则自动选择滞后阶数,最终得到5阶滞后; - Python的
adfuller()同样用AIC,但选出了13阶滞后。过多的滞后项会稀释检验的统计效力,进一步放大结果差异。
- R的
临界值与p值计算细节
两者使用的临界值表和p值计算方式存在细微差异,但这是次要因素,核心还是模型设定的不同。
三、修正后的Python代码
要让Python结果与R对齐,需指定包含趋势项的模型:
adf_result = adfuller(df['Passengers'], regression='ct') print(f"ADF Statistic: {adf_result[0]}") print(f"p-value: {adf_result[1]}") print(f"Number of Lags Used: {adf_result[2]}")
此时得到的p值会显著小于0.05,与R的结果一致。但需要注意:原序列本身存在趋势和季节性,正确的做法应该先对序列做差分处理,再进行平稳性检验。
时间序列可视化

内容的提问来源于stack exchange,提问作者Roman
相关产品推荐
相关产品推荐

