R中adf.test报错‘wrong embedding dimension’的原因及解决方法
解决ADF检验报错:
wrong embedding dimension的问题 我来帮你拆解这个问题,一步步解决:
错误含义
这个错误是tseries包的adf.test()函数抛出的,直白来说就是:你输入的时间序列样本量太小,根本没法做ADF检验。函数内部有个硬检查,如果样本量小于3,就会直接抛出这个错误。
产生原因
看你的timeseries数据,分组后存在样本量严重不足的组:比如client=11683且stuff="00564СМР- Магнит ТС"的分组,只有1条Sales记录。当dplyr遍历到这个分组时,调用adf.test()就触发了样本量不足的检查,直接报错终止了整个操作。
另外还有个小优化点:你在summarise里两次调用adf.test(Sales),这会对同一个组重复运行检验,完全没必要,既浪费算力也不优雅。
修正方案
我们需要先过滤掉样本量不够的分组,再对有效分组执行一次ADF检验并提取结果:
完整修正代码
library("tseries") library(dplyr) library(purrr) # 用pluck函数更方便提取结果 # 先过滤样本量≥10的分组(10是经验值,保证ADF结果可靠,至少要≥3) timeseries %>% group_by(client, stuff) %>% filter(n() >= 10) %>% # 过滤小样本 summarise( adf_result = list(adf.test(Sales)), # 每个组只跑一次检验 adf_statistic = pluck(adf_result, 1, "statistic"), adf_p_value = pluck(adf_result, 1, "p.value") )
代码说明
- 过滤小样本:用
filter(n() >= 10)筛选出至少有10个观测值的分组,如果你只是想满足函数的最低要求,可以改成n() >=3,但小样本的ADF检验结果参考价值很低,建议用10作为阈值。 - 单次检验调用:用
list(adf.test(Sales))把每个组的检验结果存成列表,然后用purrr::pluck()从结果对象里提取统计量和p值,避免重复运行检验。 - 结果解读:如果
adf_p_value小于显著性水平(比如0.05),就可以拒绝原假设,认为该时间序列是平稳的;反之则无法拒绝原假设,序列可能存在单位根(非平稳)。
内容的提问来源于stack exchange,提问作者psysky
相关产品推荐
相关产品推荐

