使用R语言ts()函数创建每日时间序列时异常的问题求助
问题描述
我尝试基于以下数据集结构构建每日时间序列:
> head(eg, n = 1) # A tibble: 1 × 3 date var1 var2 <date> <dbl> <dbl> 1 2022-12-21 453 5324. > tail(eg, n = 1) # A tibble: 1 × 3 date var1 var2 <date> <dbl> <dbl> 1 2023-06-14 619 6311. > glimpse(eg) Rows: 176 Columns: 3 $ date <date> 2022-12-21, 2022-12-22, 2022-12-23, 2022-12-24, 2022-12-25, 202… $ var1 <dbl> 453, 277, 359, 321, 251, 259, 258, 248, 317, 334, 326, 437, 449,… $ var2 <dbl> 5324.073, 3107.398, 3716.288, 3315.080, 3541.247, 3810.109, 3905…
该数据集共176条数据,时间范围为2022年12月21日至2023年6月14日,但使用ts()函数处理后,得到的序列有178个值,且时间范围完全异常:
> prd <- eg[3] > prd <- ts(prd, start = c(2022,1), end = c(2023,176), frequency = 2) > prd Time Series: Start = c(2022, 1) End = c(2110, 2) Frequency = 2
请问我哪里操作出错了?
错误分析与解决办法
你犯的三个关键错误
ts()不适合每日时间序列:ts()是给月度、季度这种固定年周期的序列设计的,frequency参数代表每年的周期数(比如月度设12,季度设4)。你设frequency=2等于告诉R每年只有2个周期,完全不符合每日数据的逻辑,直接导致时间索引计算混乱。start/end参数用错了:ts()的c(年, 周期位置)里的“周期位置”是对应frequency的,比如frequency=12时,12代表当年12月。你用c(2023,176)加frequency=2,R会算成2023 + (176-1)/2 = 2110.5,自然时间范围全错。- 提取数据的方式不对:
eg[3]提取的是整个tibble列(数据框结构),ts()处理数据框时会把每列当成单独的序列,导致值的数量异常。要提取单个数值向量,应该用eg$var2或者eg[[3]]。
正确的每日时间序列构建方式
优先用zoo或xts包,它们原生支持日期索引,比ts()适合每日数据:
# 安装并加载zoo包 install.packages("zoo") library(zoo) # 用var2和对应的日期构建时间序列 prd_zoo <- zoo(eg$var2, order.by = eg$date) # 查看结果 prd_zoo
如果非要用基础R的ts(),需要先计算日期在当年的天数位置,不过这种方式要考虑闰年问题,比较麻烦:
# 计算起始日期是2022年的第几天(yday从0开始,所以加1) start_day <- as.POSIXlt(eg$date[1])$yday + 1 # 计算结束日期是2023年的第几天 end_day <- as.POSIXlt(eg$date[nrow(eg)])$yday + 1 # 构建ts对象,frequency设为365 prd_ts <- ts(eg$var2, start = c(2022, start_day), end = c(2023, end_day), frequency = 365)
内容的提问来源于stack exchange,提问作者Diogo Bichon
相关产品推荐
相关产品推荐

