去除数据的线性趋势

Posted by WT on December 29, 2018

去除数据的线性趋势

以Matlab为例

MATLAB® 函数 detrend 从数据中减去均值或最佳拟合线(以最小二乘方式)。如果您的数据包含多个数据列,detrend 会分别处理每个数据列。

通过从数据中去除趋势,您能够将分析集中在趋势数据的波动上。线性趋势通常表示数据的系统性增加或减少。例如,传感器漂移可能导致系统性偏移。虽然趋势可能是有意义的,但在去除趋势后,某些类型的分析能展现更好的洞察力。

视分析目的不同,您可决定是否需要去除数据中的趋势效应。

例:

此示例说明如何从股票每日收盘价中去除线性趋势,以重点观察整体涨幅的价格波动。如果数据确实有趋势,则去除线性趋势会强制其均值为零并减少总体变化。该示例使用从 gallery 函数获取的分布来模拟股价波动。

创建一个模拟数据集并计算其均值。sdata 表示股票的每日价格变动。

t = 0:300;
dailyFluct = gallery('normaldata',size(t),2); 
sdata = cumsum(dailyFluct) + 20 + t/100;
求出数据的平均值。

mean(sdata)
ans = 39.4851
绘制和标记数据。可以看到,数据显示股价呈系统性增长。

figure
plot(t,sdata);
legend('Original Data','Location','northwest');
xlabel('Time (days)');
ylabel('Stock Price (dollars)');

dt1

应用 detrend,它对 sdata 执行线性拟合,然后对其进行去除趋势处理。从输入中减去输出,得出计算所得的趋势线。

detrend_sdata = detrend(sdata);
trend = sdata - detrend_sdata;
求出去除线性趋势后的数据的平均值。

mean(detrend_sdata)
ans = 1.1425e-14
去除线性趋势后,数据均值非常接近 0,与预期相符。

将趋势线、去除线性趋势后的数据及其均值添加到图中,以显示结果。

hold on
plot(t,trend,':r')
plot(t,detrend_sdata,'m')
plot(t,zeros(size(t)),':k')
legend('Original Data','Trend','Detrended Data',...
       'Mean of Detrended Data','Location','northwest')
xlabel('Time (days)'); 
ylabel('Stock Price (dollars)');

dt2

引用文献:Matlab