如何在tsibble中为特定分组配置数据变换适配ETS/ARIMA预测模型?
针对tsibble中特定地区自动应用数据变换的实现方法
核心思路
通过分组映射结合条件变换,可实现对指定地区的value列自动应用数据变换,模型拟合完成后再对预测结果做逆变换还原,保证最终结果的可用性。
具体实现步骤
1. 定义变换与逆变换函数
先明确变换逻辑及对应的逆变换,避免预测结果出现偏差:
# 对数+1变换 log_plus1 <- function(x) log(x + 1) # 逆变换:指数减1 inv_log_plus1 <- function(x) exp(x) - 1
2. 按地区分组处理并拟合模型
借助tsibble的分组特性,结合dplyr的条件判断函数,针对特定地区(如HU)应用变换后统一拟合模型:
library(fable) library(tsibble) library(dplyr) # 分组处理数据并拟合ETS、ARIMA模型 model_fit <- your_tsibble %>% group_by(geo) %>% mutate( transformed_value = case_when( geo == "HU" ~ log_plus1(value), TRUE ~ value # 其他地区保留原始数据 ) ) %>% model( ETS = ETS(transformed_value), ARIMA = ARIMA(transformed_value) )
3. 生成预测并还原变换
生成预测后,对HU地区的预测结果应用逆变换,其他地区直接保留预测值:
forecast_result <- model_fit %>% forecast(h = 3) %>% mutate( value = case_when( geo == "HU" ~ inv_log_plus1(.mean), TRUE ~ .mean ) )
4. (可选)多地区多变换的复用方案
如果需要给多个地区设置不同变换,可以将规则封装成映射列表,写成自定义函数更便于复用:
# 定义变换规则:键为地区代码,值为包含变换/逆变换函数的列表 transform_rules <- list( "HU" = list(transform = log_plus1, inv_transform = inv_log_plus1), "IT" = list(transform = sqrt, inv_transform = function(x) x^2) # 示例:给IT地区应用平方根变换 ) # 自定义分组变换函数 apply_transform <- function(data, rules) { data %>% group_by(geo) %>% mutate( transformed_value = if_else( geo %in% names(rules), rules[[geo]]$transform(value), value ), # 存储对应逆变换函数,方便后续预测还原 inv_transform = if_else( geo %in% names(rules), list(rules[[geo]]$inv_transform), list(function(x) x) ) ) %>% ungroup() } # 应用变换并拟合模型 processed_data <- your_tsibble %>% apply_transform(transform_rules) model_fit_custom <- processed_data %>% group_by(geo) %>% model( ETS = ETS(transformed_value), ARIMA = ARIMA(transformed_value) ) # 生成预测并自动还原变换 forecast_custom <- model_fit_custom %>% forecast(h = 3) %>% left_join(processed_data %>% distinct(geo, inv_transform), by = "geo") %>% mutate( value = map2_dbl(.mean, inv_transform, ~ .y(.x)) )
内容的提问来源于stack exchange,提问作者umbe1987
相关产品推荐
相关产品推荐

