scatstat1 documentation

The scatstat1 function returns statistical values of all points within a given 1D radius of each value. This is similar to taking a moving mean, but points do not have to be equally spaced, nor do x values need to be monotonically increasing.

See also scatstat2.

Back to Climate Data Tools Contents.

Contents

Syntax

ybar = scatstat1(x,y,radius)
ybar = scatstat1(x,y,radius,fun)
ybar = scatstat1(...,options)

Description

ybar = scatstat1(x,y,radius) returns the mean of all y values within specified radius at each point x.

ybar = scatstat1(x,y,radius,fun) applies any function fun to y values, default fun is @mean, but could be @median, @nanstd, etc.

ybar = scatstat1(...,options) allows any options that the function accepts. For example, 'omitnan'.

Example 1

Get the local median of all points within 10 units of each x point. Start by creating some random non-sorted data with N = 10,000 points:

N = 10000;
x = randi(300,N,1) + 20+3*randn(N,1) ;
y = 3*sind(x) + randn(size(x)) + 3;
plot(x,y,'k.')
axis tight
box off

Now get the moving median of all points within 15 x units of each value:

yb = scatstat1(x,y,15,@median,'omitnan');

hold on
plot(x,yb,'bo')

Note, this function does not interpolate or enforce any equal spacing. Final values correspond to each x point, which need not be equally spaced or sorted. Here's a zoom-in so you can see that the x values are not equally spaced:

axis([167 173 1 6])

Example 2: Sea ice data

From 1978 to 1988 the NSIDC sea ice time series contains about one measurement about every two days. After 1988, it's a daily time series. What if you want a 2 year moving average of sea ice time series, on this dataset which does not have constant temporal resolution?

Here's the situation:

load seaice_extent.mat % loads the sample data

figure
plot(t,extent_N)
axis tight
box off
ylabel 'northern hemisphere sea ice extent 1\times10^6 km)'

Before 1988, the data is available every other day, and then there's a gap in the data, and then it's daily data. Plot the time between measurements (in days) as the gradient of the datenum values:

figure
plot(t,gradient(datenum(t)))
ntitle 'days between measurements'
box off

You see, there's a gap.

For a two-year moving average (a radius of 1 year), convert the datetime format t to datenum format, and use scatstat1 with a radius of 365.25 days:

extent_N_2yr = scatstat1(datenum(t),extent_N,365.25);

figure(1) % goes back to the sea ice time series figure

hold on
plot(t,extent_N_2yr,'k','linewidth',2)

And of course, you probably don't want to trust anything within 1 radius (1 year for the 2 year moving average) of the ends, which is why the strange wiggles appear on at the start and end of the time series.

Author info:

This function was written by Chad A. Greene of the University of Texas at Austin's Institute for Geophysics (UTIG), June 2016.