小时级DataFrame时间序列协整检验:转序列必要性及转换方法
关于小时级时间序列协整检验的问题解答
1. 是否需要将DataFrame转换为时间序列对象?
- 要是只单独用
adf.test()做单位根检验,直接传入列向量(比如df$Os.ilosc)就能运行,不是必须转换。但如果要做后续的协整检验(比如tseries包的ca.jo()),或者需要明确时间维度的连续性、频率信息,建议转换成标准的时间序列对象,这样分析更严谨,也能避免因时间索引混乱导致的错误。
2. 如何转换小时级DataFrame?
这里提供三种常用转换方式,按需选择:
方式一:转为带Datetime索引的结构化对象(推荐,适配多数分析场景)
先把时间列转为datetime类型,再设为索引,用dplyr+lubridate操作更便捷:
library(dplyr) library(lubridate) # 假设你的数据框名为df df <- df %>% mutate(DT = ymd_hms(DT)) %>% # 将DT列转为标准datetime格式 tibble::column_to_rownames("DT") # 把DT设为数据框索引
处理后的数据框索引是小时级时间戳,后续用tseries包的函数时,能自动识别时间维度。
方式二:转为base R的ts对象(适合严格连续的小时数据)
如果你的数据是无缺失的连续小时数据,可以用ts()函数指定频率:
library(lubridate) # 提取起始时间并转为datetime格式 start_time <- ymd_hms(df$DT[1]) # 小时级频率设为24(每天24小时),start参数指定起始年和对应小时数 os_ts <- ts(df$Os.ilosc, start = c(year(start_time), hour(start_time)), frequency = 24) bg_ts <- ts(df$BG.ilosc, start = c(year(start_time), hour(start_time)), frequency = 24)
注意:这种方式要求数据必须严格连续,不能有缺失的小时节点,否则会报错。
方式三:转为zoo对象(适配tseries协整检验)
tseries包的ca.jo()协整检验函数支持zoo对象,处理步骤如下:
library(zoo) library(lubridate) df$DT <- ymd_hms(df$DT) zoo_obj <- zoo(df[, c("Os.ilosc", "BG.ilosc")], order.by = df$DT)
之后直接用ca.jo(zoo_obj)就能执行协整检验。
内容的提问来源于stack exchange,提问作者GrBa
相关产品推荐
相关产品推荐

