| name | r-timeseries |
| description | Expert time series forecasting and analysis in R using fable/tsibble/feasts. ONLY R - do NOT activate for Python time series (statsmodels, prophet in Python). Use when user mentions "série temporal", "time series", "time series in R", "time series with R", "previsão", "forecasting", "forecast in R", "predict time series", "prever série temporal", "analisar série temporal", "analyze time series", "temporal data in R", "dados temporais", "time-based prediction", "ARIMA in R", "ARIMA model", "ETS in R", "ETS model", "fable", "tsibble", "feasts", "forecast package", "prophet in R", "sazonalidade", "seasonality", "seasonal patterns", "padrões sazonais", "lidar com sazonalidade", "handle seasonality", "tendência", "trend", "decomposição", "decomposition", "temporal", "time-based", "temporal patterns", "padrões temporais", or any R-specific time series task. |
| version | 1.1.0 |
| user-invocable | false |
| allowed-tools | Read, Write, Edit, Bash(Rscript *), Bash(R -e *) |
R Time Series Forecasting Expert
You are an expert in time series analysis and forecasting using R's modern fable/tsibble/feasts ecosystem.
Core Philosophy
- Model Pluralism: Fit multiple models and compare performance
- Diagnostic Rigor: Always check residuals and model assumptions
- Cross-Validation: Use time series CV for robust evaluation
- Forecast Uncertainty: Communicate prediction intervals
- Domain Context: Consider business/scientific context in model selection
When This Skill Activates
Use this skill when:
- Forecasting future values from time series data
- Analyzing temporal patterns (trend, seasonality, cycles)
- Building ARIMA, ETS, or regression models for time series
- Evaluating forecast accuracy
- Working with tsibble/fable/feasts packages
- Decomposing time series
- Detecting seasonality or trends
Task Classification & Dispatch
1. Data Preparation & Exploration
Triggers: "explore time series", "understand patterns", "visualize temporal data"
Workflow:
- Convert to tsibble format
- Visualize with time plots, seasonal plots, ACF/PACF
- Check for missing values and gaps
- Identify patterns (trend, seasonality, cycles)
- Assess stationarity
See: references/data-visualization.md
2. Model Selection & Fitting
Triggers: "build forecast model", "fit ARIMA", "which model to use"
Workflow:
- Specify multiple candidate models
- Fit models using
model()
- Check diagnostics (residuals, Ljung-Box test)
- Compare model accuracy
- Select best model based on criteria
See: references/forecasting-methods.md
3. Forecasting & Prediction
Triggers: "forecast next", "predict future", "generate forecast"
Workflow:
- Use selected model to generate forecasts
- Specify forecast horizon (
h =)
- Visualize forecasts with prediction intervals
- Export predictions if needed
See: templates/forecasting-workflow.md
4. Forecast Evaluation
Triggers: "evaluate accuracy", "test performance", "compare models"
Workflow:
- Create train/test split or time series CV
- Generate forecasts on test set
- Calculate accuracy measures (MAE, RMSE, MASE)
- Compare multiple models
- Select best performer
See: references/forecast-evaluation.md
Quick Start Workflows
Complete Forecasting Workflow
library(fable)
library(tsibble)
library(feasts)
library(tidyverse)
ts_data <- data |>
mutate(Month = yearmonth(date)) |>
as_tsibble(index = Month)
ts_data |> autoplot(value)
ts_data |> gg_season(value)
ts_data |> gg_tsdisplay(value, plot_type = "partial")
fit <- ts_data |>
model(
mean = MEAN(value),
naive = NAIVE(value),
snaive = SNAIVE(value),
ets = ETS(value),
arima = ARIMA(value)
)
fit |> select(arima) |> gg_tsresiduals()
fit |> accuracy()
fc <- fit |> forecast(h = 12)
fc |> autoplot(ts_data)
fc |> accuracy(test_data)
Model Selection Decision Framework
By Data Pattern
| Pattern | Recommended Models |
|---|
| No trend, no seasonality | MEAN, NAIVE, ETS(A,N,N) |
| Trend, no seasonality | Drift, ARIMA(0,1,0), ETS(A,A,N) |
| No trend, seasonality | SNAIVE, ETS(A,N,A/M), ARIMA seasonal |
| Trend + seasonality | ETS(A,A,A/M), ARIMA with seasonal terms |
| Multiple seasonality | TBATS, Prophet |
| With predictors | Dynamic regression, ARIMAX |
By Objective
- Accuracy Priority: Try multiple models, select by cross-validation
- Interpretability: ETS (error/trend/seasonal framework is intuitive)
- Automation: ARIMA()/ETS() with automatic selection
- Multiple Seasonality: TBATS, Prophet
- External Predictors: Dynamic regression (ARIMA with xreg)
Time Series Data Structures (tsibble)
Creating tsibbles
library(tsibble)
library(lubridate)
ts_data <- data |>
mutate(Month = yearmonth(date_column)) |>
as_tsibble(index = Month, key = group_var)
yearquarter()
yearmonth()
yearweek()
as_date()
as_datetime()
Key Operations
ts_data |> filter(condition)
ts_data |>
index_by(Year = year(Month)) |>
summarise(total = sum(value))
ts_data |>
fill_gaps() |>
tidyr::fill(value, .direction = "down")
scan_gaps(ts_data)
Visualization Patterns
autoplot(ts_data, value)
gg_season(ts_data, value, labels = "both")
gg_subseries(ts_data, value)
gg_tsdisplay(ts_data, value, plot_type = "partial")
ts_data |>
model(stl = STL(value)) |>
components() |>
autoplot()
Forecasting Methods Overview
Simple Methods
model(
mean = MEAN(value),
naive = NAIVE(value),
snaive = SNAIVE(value),
drift = RW(value ~ drift())
)
Exponential Smoothing (ETS)
model(
ets_auto = ETS(value),
ets_aaa = ETS(value ~ error("A") + trend("A") + season("A")),
ets_mam = ETS(value ~ error("M") + trend("A") + season("M"))
)
ARIMA
model(
arima_auto = ARIMA(value),
arima_manual = ARIMA(value ~ pdq(1,1,1) + PDQ(1,1,1)),
arima_with_drift = ARIMA(value ~ pdq(1,1,0) + PDQ(0,1,1) + 1)
)
Regression Models
model(
tslm = TSLM(value ~ trend() + season()),
dynamic_reg = ARIMA(value ~ xreg_var)
)
Advanced Methods
model(
prophet = prophet(value),
nnetar = NNETAR(value),
tbats = TBATS(value)
)
Diagnostic Workflows
Residual Diagnostics
fit |>
select(model_name) |>
gg_tsresiduals()
augment(fit) |>
features(.innov, ljung_box, lag = 24, dof = 0)
Model Comparison
fit |> accuracy()
fit |> glance()
ts_cv <- ts_data |>
stretch_tsibble(.init = 60, .step = 1)
cv_fit <- ts_cv |> model(arima = ARIMA(value))
cv_fc <- cv_fit |> forecast(h = 12)
cv_fc |> accuracy(ts_data)
Forecast Evaluation Metrics
- MAE: Mean Absolute Error (scale-dependent)
- RMSE: Root Mean Squared Error (penalizes large errors)
- MAPE: Mean Absolute Percentage Error (percentage)
- MASE: Mean Absolute Scaled Error (scale-independent, preferred)
forecast_results |>
accuracy(actual_data) |>
select(.model, MAE, RMSE, MASE) |>
arrange(MASE)
Transformations
Box-Cox Transformation
lambda <- ts_data |>
features(value, features = guerrero) |>
pull(lambda_guerrero)
fit <- ts_data |>
model(ARIMA(box_cox(value, lambda)))
Differencing
ts_data |> mutate(diff_value = difference(value))
ts_data |> mutate(seasonal_diff = difference(value, lag = 12))
ts_data |>
features(value, unitroot_ndiffs)
ts_data |>
features(value, unitroot_nsdiffs)
Seasonality Handling
Detecting Seasonality
gg_season(ts_data, value)
gg_subseries(ts_data, value)
ts_data |>
features(value, feat_stl) |>
select(seasonal_strength_year)
Modeling Seasonal Patterns
ARIMA(value ~ pdq() + PDQ())
TBATS(value)
prophet(value)
Common Patterns and Solutions
Pattern: Missing Values
scan_gaps(ts_data)
ts_data |>
fill_gaps() |>
mutate(value = na.interp(value))
Pattern: Outliers
autoplot(ts_data, value)
Pattern: Structural Breaks
train_data <- ts_data |> filter(Month < break_date)
test_data <- ts_data |> filter(Month >= break_date)
Best Practices
Data Preparation
- Always convert to tsibble format first
- Check for gaps:
scan_gaps()
- Visualize before modeling: time plot, seasonal plot, ACF
- Assess stationarity:
gg_tsdisplay() and unit root tests
Model Building
- Fit multiple models for comparison
- Check residual diagnostics for all candidates
- Use automatic model selection as starting point
- Refine based on domain knowledge
- Consider forecast horizon (different models excel at different horizons)
Forecasting
- Always report prediction intervals
- Use h-step ahead forecast matching business needs
- Consider computational cost for large-scale forecasting
- Re-fit models regularly as new data arrives
Evaluation
- Use time series cross-validation, not random splits
- Evaluate on multiple horizons (1-step, 3-step, 12-step)
- Use scale-independent metrics (MASE) for comparison
- Compare against simple benchmark (naive, seasonal naive)
Common Pitfalls
❌ Using non-time series methods (random split, standard regression)
✅ Use tsibble, time series cross-validation, ARIMA/ETS
❌ Ignoring residual diagnostics
✅ Always check gg_tsresiduals() and Ljung-Box test
❌ Overfitting (too many parameters)
✅ Use information criteria (AICc), cross-validation
❌ Forgetting seasonality
✅ Check gg_season() and include seasonal terms
❌ Not handling missing values
✅ Use scan_gaps() and fill_gaps()
❌ Comparing models on different data
✅ Use consistent train/test splits
Supporting Resources
Comprehensive References
Workflow Templates
Complete Examples
Quick Reference
Package Loading
library(fable)
library(tsibble)
library(feasts)
library(tidyverse)
Essential Functions
| Task | Function |
|---|
| Create tsibble | as_tsibble(index = , key = ) |
| Visualize | autoplot(), gg_season(), gg_tsdisplay() |
| Fit models | model() |
| Generate forecasts | forecast(h = ) |
| Check diagnostics | gg_tsresiduals() |
| Evaluate accuracy | accuracy() |
| Cross-validation | stretch_tsibble() |
Quick Model Comparison Template
fit <- ts_data |>
model(
naive = NAIVE(value),
snaive = SNAIVE(value),
ets = ETS(value),
arima = ARIMA(value)
)
fit |> accuracy() |> arrange(MASE)
best_model <- fit |> select(arima)
forecast <- best_model |> forecast(h = 12)
forecast |> autoplot(ts_data)
Integration with Other Skills
- r-datascience: Use for data preparation, EDA, visualization
- r-style-guide: Follow for R code formatting
- tdd-workflow: Use for testing forecast pipelines
- r-performance: Use for large-scale forecasting optimization
Remember: Good forecasting combines statistical rigor with domain expertise. Always validate model assumptions, use multiple models, and communicate forecast uncertainty.