如何在tsibble中手动控制fill_gaps的补全间隔?
手动设置tsibble的fill_gaps补全间隔,统一时间序列周期
问题背景
你有两个同月同日但年份相差2年的数据框,转换为以yearweek为索引的tsibble后,因原数据索引步长的最大公约数不同,导致fill_gaps()补全缺失值时使用的间隔不一致:2020年数据的补全间隔为4周,2022年数据为1周,无法统一周期。
原始数据及问题复现代码:
library(tidyverse) library(fpp3) df_2020 <- tibble(month_day = as_date(c('2020-1-1','2020-2-1','2020-3-1')), amount = c(5, 2, 1)) df_2022 <- tibble(month_day = as_date(c('2022-1-1','2022-2-1','2022-3-1')), amount = c(5, 2, 1)) # 转换为tsibble ts_2020 <- df_2020 |> mutate(year_week = yearweek(month_day)) |> as_tsibble(index = year_week) ts_2022 <- df_2022 |> mutate(year_week = yearweek(month_day)) |> as_tsibble(index = year_week) # 补全缺失值后间隔不一致 ts_2020_filled <- ts_2020 |> fill_gaps() ts_2022_filled <- ts_2022 |> fill_gaps()
解决方案
要统一补全间隔(比如统一为每周1次),可以通过以下两种方法实现:
方法1:手动构建目标间隔的完整索引,关联原数据
通过complete()函数生成你需要的间隔(如每周)的完整时间序列,再转换为tsibble,确保两个数据的补全间隔一致:
# 处理2020年数据:生成每周完整索引 ts_2020_full <- df_2020 |> mutate(year_week = yearweek(month_day)) |> complete(year_week = seq(min(year_week), max(year_week), by = 1)) |> as_tsibble(index = year_week) # 处理2022年数据:同样生成每周完整索引 ts_2022_full <- df_2022 |> mutate(year_week = yearweek(month_day)) |> complete(year_week = seq(min(year_week), max(year_week), by = 1)) |> as_tsibble(index = year_week)
方法2:将tsibble标记为不规则,手动指定补全间隔
先将tsibble设置为不规则序列(.regular = FALSE),再在fill_gaps()中手动指定目标间隔的索引序列:
# 转换为不规则tsibble ts_2020_irreg <- df_2020 |> mutate(year_week = yearweek(month_day)) |> as_tsibble(index = year_week, .regular = FALSE) ts_2022_irreg <- df_2022 |> mutate(year_week = yearweek(month_day)) |> as_tsibble(index = year_week, .regular = FALSE) # 手动指定每周间隔补全缺失值 ts_2020_filled <- ts_2020_irreg |> fill_gaps(year_week = seq(min(year_week), max(year_week), by = 1)) ts_2022_filled <- ts_2022_irreg |> fill_gaps(year_week = seq(min(year_week), max(year_week), by = 1))
两种方法都能让两个时间序列以每周为间隔补全缺失值,实现周期统一。
内容的提问来源于stack exchange,提问作者Isaiah
相关产品推荐
相关产品推荐

