如何使用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
相关产品推荐
相关产品推荐

