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

如何使用R语言正确检验面板数据的平稳性

面板平稳性检验与绘图问题解答

检验方法选择问题

你当前使用的adf.test()、kpss.test()都是针对单条独立时间序列设计的检验函数,你提到的两种输入方式都存在明显问题:

  • 直接将全样本堆叠的面板变量Y传入函数是完全错误的:面板数据按「国家-年份」结构存储,同一年份对应多个国家的Y观测值,函数会把不同国家、不同年份的观测值误判为同一条时间序列上连续的时间点,输出的检验结果没有任何统计意义。
  • 先计算每年Y的全样本均值再传入检验的做法偏差极大:均值序列会完全抹除不同国家的个体异质性趋势、波动特征,检验功效极低,很容易得出错误的平稳/非平稳结论。

正确操作是使用面板专用的单位根/平稳性检验函数,例如plm包中的purtest(),可以根据研究需求选择是否纳入共同时间趋势、个体固定效应,匹配面板数据结构。如果需要做初步的趋势判断,可以分国家对每个国家的单独时间序列做检验,再汇总结果,不要直接混同所有观测值。

绘图混乱出现满屏红线的原因

你绘制的时序图出现大量交叉红线,核心原因是传入plot()的year和Y不是单条时间序列的配对值:全样本堆叠状态下,同一年份对应多个国家的Y值,当你设置type='l'绘制线图时,函数会按照数据存储的行顺序逐点连线——也就是先画完第一个国家所有年份的线段,再跳转到第二个国家起始年份的点继续连线,自然会产生大量跨年份的交叉斜线,最终呈现网状的混乱效果。
同样的问题也出在ACF图的绘制上:直接传入全样本堆叠的Y计算自相关系数,结果完全不具备参考价值。

修正参考代码

# 加载依赖包
library(plm)
library(dplyr)

# 面板单位根检验(带时间趋势选项)
# 首先将原始数据转换为plm支持的面板数据格式,声明国家为个体维度、年份为时间维度
pdata <- pdata.frame(your_raw_data, index = c("country", "year"))
# ADF面板检验,纳入时间趋势项,滞后阶数按AIC准则自动选择
purtest(Y ~ 1, data = pdata, test = "adf", exo = "trend", lags = "AIC")
# KPSS面板检验,原假设为趋势平稳
purtest(Y ~ 1, data = pdata, test = "kpss", exo = "trend")

# 修正后的趋势可视化(以年度均值趋势为例)
year_agg <- pdata %>%
  group_by(year) %>%
  summarise(Y_avg = mean(Y, na.rm = TRUE))

pdf(file="Stationary Y_fixed.pdf")
par(mfrow = c(1,2))
plot(year_agg$year, year_agg$Y_avg,
     type='l',col='red',
     xlab = "时间(年)",
     ylab = "Y年度均值",
     main = "Y整体时间趋势")
acf(year_agg$Y_avg, lag.max = length(year_agg$Y_avg),
    xlab = "滞后阶数", ylab = 'ACF值',main='年度均值序列ACF')
dev.off()

如果需要观察单个国家的序列平稳性,可以按国家分组筛选数据后,逐个绘制单国家的时序图和ACF图即可。

内容的提问来源于stack exchange,提问作者TFT

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 14:09:25