Main Content

detrend

Remove polynomial trend

Description

example

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.

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.

D = detrend(___,nanflag) specifies how NaN values are treated for any of the previous syntaxes. For example, detrend(A,"omitnan") removes NaN values before calculating the trend, while detrend(A,"includenan") includes them (default).

example

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.

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","Location","northwest")

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

NaN condition, specified as one of these values:

  • "includenan" — Include NaN values in the input data when computing the trend.

  • "omitnan" — Ignore all NaN values in the input data when computing the trend.

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:

Option for Table InputDescriptionExamples
Variable name

A character vector or scalar string specifying a single table variable name

'Var1'

"Var1"

Scalar variable index

A scalar table variable index

3

Logical vector

A logical vector whose elements each correspond to a table variable, where true specifies the corresponding variable as the sample points, and all other elements are false

[true false false]

Function handle

A function handle that takes a table variable as input and returns a logical scalar, which must be true for only one table variable

@isnumeric

vartype subscript

A table subscript generated by the vartype function that returns a subscript for only one variable

vartype('numeric')

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.

OptionDescriptionExamples
Variable name

A character vector or string scalar specifying a single table variable name

'Var1'

"Var1"

Vector of variable names

A cell array of character vectors or string array, where each element is a table variable name

{'Var1' 'Var2'}

["Var1" "Var2"]

Scalar or vector of variable indices

A scalar or vector of table variable indices

1

[1 3 5]

Logical vector

A logical vector whose elements each correspond to a table variable, where true includes the corresponding variable and false excludes it

[true false true]

Function handle

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

@isnumeric

vartype subscript

A table subscript generated by the vartype function

vartype("numeric")

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.

Extended Capabilities

Version History

Introduced before R2006a

expand all