## Documentation Center |

Smooth response data

`yy = smooth(y)yy = smooth(y,span)yy = smooth(y,`

`yy = smooth(y)` smooths the
data in the column vector `y` using a moving average
filter. Results are returned in the column vector `yy`.
The default span for the moving average is `5`.

The first few elements of `yy` are given by

yy(1) = y(1) yy(2) = (y(1) + y(2) + y(3))/3 yy(3) = (y(1) + y(2) + y(3) + y(4) + y(5))/5 yy(4) = (y(2) + y(3) + y(4) + y(5) + y(6))/5 ...

Because of the way endpoints are handled, the result differs
from the result returned by the `filter` function.

`yy = smooth(y,span)` sets
the span of the moving average to `span`. `span` must
be odd.

`yy = smooth(y,method)` smooths
the data in

| Description |
---|---|

| Moving average (default). A lowpass filter with filter coefficients equal to the reciprocal of the span. |

| Local regression using weighted linear least squares and a 1st degree polynomial model |

| Local regression using weighted linear least squares and a 2nd degree polynomial model |

| Savitzky-Golay filter. A generalized moving average with filter coefficients determined by an unweighted linear least-squares regression and a polynomial model of specified degree (default is 2). The method can accept nonuniform predictor data. |

| A robust version of |

| A robust version of |

`yy = smooth(y,span,method)` sets
the span of

`yy = smooth(y,'sgolay',degree)` uses
the Savitzky-Golay method with polynomial degree specified by `degree`.

`yy = smooth(y,span,'sgolay',degree)` uses
the number of data points specified by `span` in
the Savitzky-Golay calculation. `span` must be odd
and `degree` must be less than `span`.

`yy = smooth(x,y,...)` additionally
specifies `x` data. If `x` is not
provided, methods that require `x` data assume `x
= 1:length(y)`. You should specify `x` data
when it is not uniformly spaced or sorted. If `x` is
not uniform and you do not specify `method`, `lowess` is
used. If the smoothing method requires `x` to be
sorted, the sorting occurs automatically.

Load the data in `count.dat`:

load count.dat

The 24-by-3 array `count` contains traffic
counts at three intersections for each hour of the day.

First, use a moving average filter with a 5-hour span to smooth all of the data at once (by linear index) :

c = smooth(count(:)); C1 = reshape(c,24,3);

Plot the original data and the smoothed data:

subplot(3,1,1) plot(count,':'); hold on plot(C1,'-'); title('Smooth C1 (All Data)')

Second, use the same filter to smooth each column of the data separately:

C2 = zeros(24,3); for I = 1:3, C2(:,I) = smooth(count(:,I)); end

Again, plot the original data and the smoothed data:

subplot(3,1,2) plot(count,':'); hold on plot(C2,'-'); title('Smooth C2 (Each Column)')

Plot the difference between the two smoothed data sets:

subplot(3,1,3) plot(C2 - C1,'o-') title('Difference C2 - C1')

Note the additional end effects from the 3-column smooth.

Create noisy data with outliers:

x = 15*rand(150,1); y = sin(x) + 0.5*(rand(size(x))-0.5); y(ceil(length(x)*rand(2,1))) = 3;

Smooth the data using the `loess` and `rloess` methods
with a span of 10%:

yy1 = smooth(x,y,0.1,'loess'); yy2 = smooth(x,y,0.1,'rloess');

Plot original data and the smoothed data.

[xx,ind] = sort(x); subplot(2,1,1) plot(xx,y(ind),'b.',xx,yy1(ind),'r-') set(gca,'YLim',[-1.5 3.5]) legend('Original Data','Smoothed Data Using ''loess''',... 'Location','NW') subplot(2,1,2) plot(xx,y(ind),'b.',xx,yy2(ind),'r-') set(gca,'YLim',[-1.5 3.5]) legend('Original Data','Smoothed Data Using ''rloess''',... 'Location','NW')

Note that the outliers have less influence on the robust method.

Was this topic helpful?