You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

二、差异的核心原因

  1. 模型设定(趋势/截距项)不同

    • R的adf.test()默认使用包含趋势项和截距项的模型(对应Python中regression='ct'参数),适配带有趋势的序列特征;
    • Python的adfuller()默认仅使用截距项(regression='c'),未考虑序列的趋势成分,导致检验无法正确识别非平稳性。
  2. 滞后阶数选择逻辑差异

    • R的adf.test()通过AIC准则自动选择滞后阶数,最终得到5阶滞后;
    • Python的adfuller()同样用AIC,但选出了13阶滞后。过多的滞后项会稀释检验的统计效力,进一步放大结果差异。
  3. 临界值与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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 22:52:43