多变量时间序列重复时间处理:多国寿命预测模型报错解决
多维度(面板)时间序列拆分警告解决方案
问题描述
使用Kaggle的「Life Expectancy WHO Updated」数据集(2000-2015年179个国家的寿命数据,无缺失值)构建时间序列预测模型时,执行time_series_split出现如下警告:
Data is not ordered by the 'date_var'. Resamples will be arranged by year. Overlapping Timestamps Detected. Processing overlapping time series together using sliding windows.
问题根源:数据集属于面板时间序列数据(每个年份对应179个国家的记录),存在重复时间戳,且数据未按「国家+年份」有序排列,导致拆分工具无法识别多维度信息。
原始预处理代码
library(tidyverse) library(tidymodels) library(readxl) library(janitor) library(modeltime) library(lubridate) dados <- read_csv("Life Expectancy Data.csv") dados <- clean_names(dados) dados <- subset(dados, select = -c(economy_status_developing)) dados$economy_status_developed <- as.factor(dados$economy_status_developed) dados$year <- ymd(sprintf("%d-01-01",dados$year)) splits <- time_series_split(date_var = year, dados) recipe_spec <- recipe(life_expectancy ~ year + infant_deaths + under_five_deaths + adult_mortality + alcohol_consumption + hepatitis_b + measles + bmi + polio + diphtheria + incidents_hiv + gdp_per_capita + population_mln + thinness_ten_nineteen_years + thinness_five_nine_years + schooling + economy_status_developed, dados) %>% step_timeseries_signature(year) %>% step_dummy(all_nominal()) recipe_spec %>% prep() %>% juice()
解决步骤
1. 先按「国家+年份」排序数据
首先要确保每个国家的时间序列是连续有序的,这是解决「未按date_var排序」警告的核心:
# 按国家分组,再按年份升序排序 dados <- dados %>% arrange(country, year)
2. 使用分组时间序列拆分
针对面板数据,需要明确指定分组维度(国家),避免不同国家的同一年份数据被混在一起处理:
方案A:拆分单训练/测试集
如果只需要划分一次训练集和测试集(例如用前12年训练,后4年测试):
# 按国家分组,标记训练/测试样本 splits <- dados %>% group_by(country) %>% mutate(is_train = row_number() <= 12) %>% # 2000-2011为训练,2012-2015为测试 ungroup() train_data <- splits %>% filter(is_train) test_data <- splits %>% filter(!is_train)
方案B:时间序列交叉验证(CV)
如果需要构建交叉验证集,使用time_series_cv并指定group = country:
# 创建面板数据的时间序列交叉验证折 cv_splits <- time_series_cv( data = dados, date_var = year, group = country, # 指定国家为分组维度,确保每个折内的时间序列属于同一国家 initial = 10*365, # 初始训练集覆盖10年(用日期间隔适配date_var的日期格式) assess = 2*365, # 每个评估集覆盖2年 cumulative = TRUE # 训练集随折数递增 )
3. 更新特征工程流程
将国家信息纳入模型(转为哑变量或保留为分组特征),让模型学习国家间的差异:
# 修改recipe,加入country特征并转为哑变量 recipe_spec <- recipe(life_expectancy ~ country + year + infant_deaths + under_five_deaths + adult_mortality + alcohol_consumption + hepatitis_b + measles + bmi + polio + diphtheria + incidents_hiv + gdp_per_capita + population_mln + thinness_ten_nineteen_years + thinness_five_nine_years + schooling + economy_status_developed, data = dados) %>% step_timeseries_signature(year) %>% step_dummy(all_nominal(), -contains("year_")) # 对国家、经济状态转哑变量,排除时间特征的名义列 recipe_spec %>% prep() %>% juice()
4. 验证警告消除
完成上述步骤后,重新运行拆分代码,警告会消失——此时数据已按「国家+年份」有序排列,拆分工具能正确识别每个国家的独立时间序列。
内容的提问来源于stack exchange,提问作者Paulo Luis
相关产品推荐
相关产品推荐

