Ova

How do you remove a trend from a time series in Matlab?

Published in Time Series Detrending 6 mins read

To remove a trend from a time series in MATLAB, you primarily use the detrend function for linear trends, and a combination of polyfit and polyval for nonlinear trends.

Removing a trend is a crucial step in time series analysis, often performed to achieve stationarity, making it easier to identify seasonality, cycles, and other patterns.

Understanding Time Series Trends and Why to Remove Them

A trend in a time series represents the long-term increase or decrease in the data. It reflects the underlying direction of the series over time. Removing this trend, a process known as detrending, is often necessary because:

  • Stationarity: Many time series models (like ARIMA) assume that the data is stationary, meaning its statistical properties (mean, variance, autocorrelation) do not change over time. Trends violate this assumption.
  • Isolating Components: Detrending allows you to isolate and analyze other components of the time series, such as seasonality, cyclical patterns, and random noise, without the overshadowing effect of the overall direction.
  • Improved Forecasting: Models built on detrended data can sometimes provide more accurate forecasts for the stationary component, which can then be re-trended.

Removing Linear Trends with detrend

For time series exhibiting a clear linear trend, MATLAB's built-in detrend function is the most straightforward and efficient tool. This function subtracts the best-fit line (or constant value) from the data.

How detrend Works

The detrend function fits a least-squares line (or constant) to your data and then subtracts this fitted component.

  • Syntax: Y_detrended = detrend(Y);
    • This removes the linear trend from the vector Y.
  • Syntax for Constant Trend: Y_detrended = detrend(Y, 'constant');
    • This removes only the mean (constant offset) from the data.
  • Syntax with Time Vector: Y_detrended = detrend(Y, 'linear', X);
    • If you have a specific time vector X (e.g., in seconds, days), you can pass it to detrend to ensure the trend is computed against these specific time points.

Practical Example

Suppose you have an ECG signal ecgl with a linear drift. You can remove it directly:

% Assume 'ecgl' is your time series data
% If ecgl is a row vector, detrend operates column-wise, so ensure it's a column or transpose if needed
% Example: Create some sample data with a linear trend
t = (0:99)'; % Time vector
true_trend = 0.5*t + 10;
noise = 5*randn(100,1);
ecgl = true_trend + noise; % Sample data with linear trend

% Remove the linear trend
dt_ecgl = detrend(ecgl);

% Plotting for visualization (optional but recommended)
figure;
plot(t, ecgl, 'b', t, dt_ecgl, 'r--');
legend('Original Signal', 'Detrended Signal');
title('Linear Trend Removal with detrend');
xlabel('Time');
ylabel('Amplitude');
grid on;

This code snippet first creates a sample time series with a linear trend and then applies detrend to remove it. Visualizing both the original and detrended signals is crucial to verify the effectiveness of the process.

Removing Nonlinear Trends with Polynomial Fitting

When the time series exhibits a curve or a more complex, nonlinear trend, detrend is insufficient. In such cases, fitting a low-order polynomial to the signal and then subtracting it is an effective method. MATLAB provides polyfit to determine the polynomial coefficients and polyval to evaluate the polynomial.

Steps for Nonlinear Trend Removal

  1. Create a Time Vector: If your time series data data does not explicitly have a corresponding time vector, create one (e.g., 1:length(data)).
  2. Fit a Polynomial: Use polyfit(x, y, degree) to find the coefficients of a polynomial that best fits your time series y with respect to its time x, for a specified degree. The choice of degree depends on the shape of your nonlinear trend (e.g., 2 for quadratic, 3 for cubic).
  3. Evaluate the Polynomial: Use polyval(p, x) to evaluate the fitted polynomial p at each point in your time vector x. This gives you the estimated trend component.
  4. Subtract the Trend: Subtract the evaluated polynomial (the trend component) from your original time series.

Practical Example

Let's assume your signal has a quadratic trend:

% Example: Create sample data with a quadratic trend
t = (0:99)'; % Time vector
true_trend = 0.05*t.^2 - 2*t + 50;
noise = 5*randn(100,1);
nonlinear_data = true_trend + noise;

% Step 1: Time vector (already created as 't')
% Step 2: Fit a polynomial (e.g., quadratic, degree=2)
degree = 2; % For a quadratic trend
p = polyfit(t, nonlinear_data, degree); % 'p' contains polynomial coefficients

% Step 3: Evaluate the polynomial at each time point to get the estimated trend
estimated_trend = polyval(p, t);

% Step 4: Subtract the estimated trend from the original data
data_detrended_nonlinear = nonlinear_data - estimated_trend;

% Plotting for visualization
figure;
plot(t, nonlinear_data, 'b', t, estimated_trend, 'k--', t, data_detrended_nonlinear, 'r:');
legend('Original Data', 'Fitted Polynomial Trend', 'Detrended Data');
title('Nonlinear Trend Removal with Polynomial Fitting');
xlabel('Time');
ylabel('Amplitude');
grid on;

Choosing the correct polynomial degree is crucial. A low degree (e.g., 2 or 3) usually suffices to capture broad nonlinear trends without overfitting the noise.

Other Advanced Trend Removal Techniques

While detrend and polynomial fitting are common, other methods can be useful, especially for more complex or irregular trends:

  • Differencing: This technique removes trends by computing the difference between consecutive observations (diff function). First-order differencing diff(Y) removes a linear trend, while second-order diff(diff(Y)) can remove a quadratic trend. Seasonal differencing can remove seasonal trends. It's effective but results in a loss of data points at the beginning of the series.
  • Moving Averages or Smoothing: You can estimate a trend by smoothing the time series using functions like movmean, movmedian, or smoothdata with methods like 'rloess' (robust locally weighted scatterplot smoothing) or 'sgolay' (Savitzky-Golay filter). Once the smoothed series (representing the trend) is obtained, subtract it from the original data. This is particularly useful for irregular, non-parametric trends.

Choosing the Right Method for Trend Removal

The choice of method depends on the nature of the trend in your time series. Visual inspection of your data is often the first step to determine if the trend is linear, nonlinear, or something more complex.

Method Trend Type MATLAB Function(s) Notes
detrend Linear or Constant detrend Simplest and most efficient for clear linear trends. Can also remove just the mean.
Polynomial Fitting Nonlinear (smooth curves) polyfit, polyval Flexible for various curve shapes (quadratic, cubic, etc.). Careful selection of polynomial degree is key.
Differencing Linear or Seasonal diff Directly removes trends by computing differences. Often used for achieving stationarity. Can lose initial data points.
Moving Averages / Smoothing Irregular Nonlinear movmean, smoothdata (with 'rloess', 'sgolay') Good for complex, less-defined trends. Provides a smoothed estimate of the underlying trend.

Always visualize your data before and after detrending to ensure the method chosen effectively removes the trend without introducing new artifacts or over-smoothing your valuable signal.