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

小时级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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 17:32:25