Main Content

detrend

Remove polynomial trend

Description

D = detrend(A) removes the best straight-fit line from the data in A and returns the remaining data.

  • If A is a vector, then detrend subtracts the trend from the elements of A.

  • If A is a matrix, then detrend operates on each column separately, subtracting each trend from the corresponding column of A.

  • If A is a multidimensional array, then detrend operates column-wise across all dimensions, subtracting each trend from the corresponding column of A.

  • If A is a table or timetable with numeric variables of type single or double, then detrend operates on each variable of A separately, subtracting each trend from the corresponding variable of A.

You can use detrend functionality interactively by adding the Find and Remove Trends task to a live script.

example

D = detrend(A,n) removes the nth-degree polynomial trend. For example, when n = 0, detrend removes the mean value from A. When n = 1, detrend removes the linear trend, which is equivalent to the previous syntax. When n = 2, detrend removes the quadratic trend.

example

D = detrend(A,n,bp) removes a continuous, piecewise trend with segments defined by the breakpoints specified in the vector bp.

example

D = detrend(___,nanflag) specifies whether to include or omit NaN values in A for any of the previous syntaxes. For example, detrend(A,"omitnan") ignores NaN values when computing the trend. By default, detrend includes NaN values.

D = detrend(___,Name,Value) specifies additional parameters using one or more name-value arguments. For example, detrend(A,1,bp,"Continuous",false) specifies that the fitted trend can have discontinuities.

example

Examples

collapse all

Create a vector of data, and remove the continuous linear trend. Plot the original data, the detrended data, and the linear trend.

t = 0:20;
A = 3*sin(t) + t;
D = detrend(A);

plot(t,A)
hold on
plot(t,D)
plot(t,A-D,":k")
legend("Input Data","Detrended Data","Trend")

Figure contains an axes object. The axes object contains 3 objects of type line. These objects represent Input Data, Detrended Data, Trend.

Create a table of data, and remove the continuous quadratic trend from a specified variable in the table. Plot the original data, the detrended data, and the trend.

t = (-4:4)';
trend = (t.^2 + 4*t + 3);
sig = [0 1 -2 1 0 1 -2 1 0]';
x = sig + trend;
T = table(t,trend,sig,x);
T = detrend(T,2,"DataVariables","x","SamplePoints","t","ReplaceValues",false)
T=9×5 table
    t     trend    sig    x     x_detrended
    __    _____    ___    __    ___________

    -4      3       0      3     -0.12121  
    -3      0       1      1       0.9697  
    -2     -1      -2     -3      -1.9654  
    -1      0       1      1       1.0736  
     0      3       0      3      0.08658  
     1      8       1      9       1.0736  
     2     15      -2     13      -1.9654  
     3     24       1     25       0.9697  
     4     35       0     35     -0.12121  

plot(T,"t","x")
hold on
plot(T,"t","x_detrended")
plot(T.t,T.x-T.x_detrended,":k")
legend("Input Data","Detrended Data","Trend","Location","northwest")

Figure contains an axes object. The axes object with xlabel t contains 3 objects of type line. These objects represent Input Data, Detrended Data, Trend.

Create a vector of data, and remove the piecewise linear trend using a breakpoint at 0. Specify that the resulting output can be discontinuous. Plot the original data, the detrended data, and the trend.

t = -10:10;
A = t.^3 + 6*t.^2 + 4*t + 3;
bp = 0;
D = detrend(A,1,bp,"SamplePoints",t,"Continuous",false);

plot(t,A)
hold on
plot(t,D)
plot(t,A-D,":k")
legend("Input Data","Detrended Data","Trend","Location","northwest")

Figure contains an axes object. The axes object contains 3 objects of type line. These objects represent Input Data, Detrended Data, Trend.

Input Arguments

collapse all

Input data, specified as a vector, matrix, multidimensional array, table, or timetable.

  • If A is a vector, then detrend subtracts the trend from the elements of A.

  • If A is a matrix, then detrend operates on each column separately, subtracting each trend from the corresponding column of A.

  • If A is a multidimensional array, then detrend operates column-wise across all dimensions, subtracting each trend from the corresponding column of A.

  • If A is a table or timetable with numeric variables of type single or double, then detrend operates on each variable of A separately, subtracting each trend from the corresponding variable of A.

Data Types: double | single
Complex Number Support: Yes

Polynomial degree, specified as a nonnegative integer scalar, or as "constant" (equivalent to 0) or "linear" (equivalent to 1).

Breakpoints to define piecewise segments of the data, specified as a vector containing one of the following:

  • Sample point values indicating the location of the breakpoints. Sample point values are contained either in the default sample points vector [1 2 3 ...] or specified by the SamplePoints name-value argument.

  • Logical values where logical 1 (true) indicates a breakpoint in the corresponding element of the input data. If bp contains logical values, it must be the same length as the sample points.

Breakpoints are useful when you want to compute separate trends for different segments of the data.

Data Types: double | single | datetime | duration | logical

Missing value condition, specified as one of these values:

  • "includemissing" or "includenan" — Include NaN values in A when computing the trend. If any element in the operating dimension is NaN, then the corresponding elements in D are NaN. "includemissing" and "includenan" have the same behavior.

  • "omitmissing" or "omitnan" — Ignore NaN values in A when computing the trend. If all elements in the operating dimension are NaN, then the corresponding elements in D are NaN. "omitmissing" and "omitnan" have the same behavior.

Name-Value Arguments

Specify optional pairs of arguments as Name1=Value1,...,NameN=ValueN, where Name is the argument name and Value is the corresponding value. Name-value arguments must appear after other arguments, but the order of the pairs does not matter.

Example: D = detrend(A,SamplePoints=1:10:1000)

Before R2021a, use commas to separate each name and value, and enclose Name in quotes.

Example: D = detrend(A,"SamplePoints",1:10:1000)

Continuity constraint, specified as one of these values:

  • true — The fitted trend must be continuous everywhere.

  • false — The fitted trend can contain discontinuities.

Sample points, specified as a vector of sample point values or one of the options in the following table when the input data is a table. The sample points represent the x-axis locations of the data, and must be sorted and contain unique elements. Sample points do not need to be uniformly sampled. The vector [1 2 3 ...] is the default.

When the input data is a table, you can specify the sample points as a table variable using one of these options:

Indexing SchemeExamples

Variable name:

  • A string scalar or character vector

  • "A" or 'A' — A variable named A

Variable index:

  • An index number that refers to the location of a variable in the table

  • A logical vector. Typically, this vector is the same length as the number of variables, but you can omit trailing 0 or false values

  • 3 — The third variable from the table

  • [false false true] — The third variable

Function handle:

  • A function handle that takes a table variable as input and returns a logical scalar

  • @isnumeric — One variable containing numeric values

Variable type:

  • A vartype subscript that selects one variable of a specified type

  • vartype("numeric") — One variable containing numeric values

Note

This name-value argument is not supported when the input data is a timetable. Timetables use the vector of row times as the sample points. To use different sample points, you must edit the timetable so that the row times contain the desired sample points.

Example: detrend(A,"SamplePoints",0:0.1:10)

Data Types: double | single | datetime | duration

Table or timetable variables to operate on, specified as one of the options in this table. The DataVariables value indicates for which variables of the input table or timetable to remove polynomial trends.

Other variables in the table or timetable not specified by DataVariables pass through to the output without being detrended.

Indexing SchemeValues to SpecifyExamples

Variable names

  • A string scalar or character vector

  • A string array or cell array of character vectors

  • A pattern object

  • "A" or 'A' — A variable named A

  • ["A" "B"] or {'A','B'} — Two variables named A and B

  • "Var"+digitsPattern(1) — Variables named "Var" followed by a single digit

Variable index

  • An index number that refers to the location of a variable in the table

  • A vector of numbers

  • A logical vector. Typically, this vector is the same length as the number of variables, but you can omit trailing 0 (false) values.

  • 3 — The third variable from the table

  • [2 3] — The second and third variables from the table

  • [false false true] — The third variable

Function handle

  • A function handle that takes a table variable as input and returns a logical scalar

  • @isnumeric — All the variables containing numeric values

Variable type

  • A vartype subscript that selects variables of a specified type

  • vartype("numeric") — All the variables containing numeric values

For vector, matrix, or multidimensional array input data, DataVariables is not supported.

Example: detrend(A,"DataVariables",["Var1" "Var2" "Var4"])

Replace values indicator, specified as one of these values when A is a table or timetable:

  • true or 1 — Replace input table variables with table variables containing detrended data.

  • false or 0 — Append input table variables with table variables containing detrended data.

For vector, matrix, or multidimensional array input data, ReplaceValues is not supported.

Example: detrend(A,"ReplaceValues",false)

Tips

  • The detrend function subtracts the mean or a best-fit line (in the least-squares sense) from your data. If your data is tabular or contains several data columns or is a table or timetable, detrend treats each data column separately.

    Removing a trend from the data enables you to focus your analysis on the fluctuations in the data about the trend. A linear trend typically indicates a systematic increase or decrease in the data. A systematic shift can result from sensor drift, for example. While trends can be meaningful, some types of analyses yield better insight once you remove trends.

    Whether it makes sense to remove trend effects in the data often depends on the objectives of your analysis.

Alternative Functionality

Live Editor Task

You can use detrend functionality interactively by adding the Find and Remove Trends task to a live script.

Find and Remove Trends task in the Live Editor

Extended Capabilities

Version History

Introduced before R2006a

expand all