Main Content

Perform nonclassical multidimensional scaling using `mdscale`

.

The function `mdscale`

performs nonclassical
multidimensional scaling. As with `cmdscale`

, you use
`mdscale`

either to visualize dissimilarity data for which no
“locations” exist, or to visualize high-dimensional data by reducing
its dimensionality. Both functions take a matrix of dissimilarities as an input and
produce a configuration of points. However, `mdscale`

offers a
choice of different criteria to construct the configuration, and allows missing data
and weights.

For example, the cereal data include measurements on 10 variables describing
breakfast cereals. You can use `mdscale`

to visualize these data in
two dimensions. First, load the data. For clarity, this example code selects a
subset of 22 of the observations.

load cereal.mat X = [Calories Protein Fat Sodium Fiber ... Carbo Sugars Shelf Potass Vitamins]; % Take a subset from a single manufacturer mfg1 = strcmp('G',cellstr(Mfg)); X = X(mfg1,:); size(X) ans = 22 10

Then use `pdist`

to transform the 10-dimensional
data into dissimilarities. The output from `pdist`

is a symmetric
dissimilarity matrix, stored as a vector containing only the (23*22/2) elements in
its upper triangle.

dissimilarities = pdist(zscore(X),'cityblock'); size(dissimilarities) ans = 1 231

This example code first standardizes the cereal data, and then uses city block distance as a dissimilarity. The choice of transformation to dissimilarities is application-dependent, and the choice here is only for simplicity. In some applications, the original data are already in the form of dissimilarities.

Next, use `mdscale`

to perform metric MDS. Unlike
`cmdscale`

, you must specify the desired number of dimensions,
and the method to use to construct the output configuration. For this example, use
two dimensions. The metric STRESS criterion is a common method for computing the
output; for other choices, see the `mdscale`

reference page in the online documentation. The second
output from `mdscale`

is the value of that criterion evaluated for
the output configuration. It measures the how well the inter-point distances of the
output configuration approximate the original input dissimilarities:

[Y,stress] =... mdscale(dissimilarities,2,'criterion','metricstress'); stress stress = 0.1856

A scatterplot of the output from `mdscale`

represents the
original 10-dimensional data in two dimensions, and you can use the `gname`

function to label selected
points:

plot(Y(:,1),Y(:,2),'o','LineWidth',2); gname(Name(mfg1))

Metric multidimensional scaling creates a configuration of points whose
inter-point distances approximate the given dissimilarities. This is sometimes too
strict a requirement, and non-metric scaling is designed to relax it a bit. Instead
of trying to approximate the dissimilarities themselves, non-metric scaling
approximates a nonlinear, but monotonic, transformation of them. Because of the
monotonicity, larger or smaller distances on a plot of the output will correspond to
larger or smaller dissimilarities, respectively. However, the nonlinearity implies
that `mdscale`

only attempts to preserve the ordering of
dissimilarities. Thus, there may be contractions or expansions of distances at
different scales.

You use `mdscale`

to perform nonmetric MDS in much the same way
as for metric scaling. The nonmetric STRESS criterion is a common method for
computing the output; for more choices, see the `mdscale`

reference
page in the online documentation. As with metric scaling, the second output from
`mdscale`

is the value of that criterion evaluated for the
output configuration. For nonmetric scaling, however, it measures the how well the
inter-point distances of the output configuration approximate the disparities. The
disparities are returned in the third output. They are the transformed values of the
original dissimilarities:

[Y,stress,disparities] = ... mdscale(dissimilarities,2,'criterion','stress'); stress stress = 0.1562

To check the fit of the output configuration to the dissimilarities, and to understand the disparities, it helps to make a Shepard plot:

distances = pdist(Y); [dum,ord] = sortrows([disparities(:) dissimilarities(:)]); plot(dissimilarities,distances,'bo', ... dissimilarities(ord),disparities(ord),'r.-', ... [0 25],[0 25],'k-') xlabel('Dissimilarities') ylabel('Distances/Disparities') legend({'Distances' 'Disparities' '1:1 Line'},... 'Location','NorthWest');

This plot shows that `mdscale`

has found a configuration of
points in two dimensions whose inter-point distances approximates the disparities,
which in turn are a nonlinear transformation of the original dissimilarities. The
concave shape of the disparities as a function of the dissimilarities indicates that
fit tends to contract small distances relative to the corresponding dissimilarities.
This may be perfectly acceptable in practice.

`mdscale`

uses an iterative algorithm to find the output
configuration, and the results can often depend on the starting point. By default,
`mdscale`

uses `cmdscale`

to construct an
initial configuration, and this choice often leads to a globally best solution.
However, it is possible for `mdscale`

to stop at a configuration
that is a local minimum of the criterion. Such cases can be diagnosed and often
overcome by running `mdscale`

multiple times with different
starting points. You can do this using the `'start'`

and
`'replicates'`

name-value pair arguments. The following code
runs five replicates of MDS, each starting at a different randomly-chosen initial
configuration. The criterion value is printed out for each replication;
`mdscale`

returns the configuration with the best fit.

opts = statset('Display','final'); [Y,stress] =... mdscale(dissimilarities,2,'criterion','stress',... 'start','random','replicates',5,'Options',opts); 35 iterations, Final stress criterion = 0.156209 31 iterations, Final stress criterion = 0.156209 48 iterations, Final stress criterion = 0.171209 33 iterations, Final stress criterion = 0.175341 32 iterations, Final stress criterion = 0.185881

Notice that `mdscale`

finds several different local solutions,
some of which do not have as low a stress value as the solution found with the
`cmdscale`

starting point.