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.