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

多变量时间序列重复时间处理:多国寿命预测模型报错解决

多维度(面板)时间序列拆分警告解决方案

问题描述

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 12:03:10