I have several sets of choropleth maps showing ranges of poverty by census tract, each using a different poverty measure. All of the maps use the same categorical ranges to define poverty status.

The maps clearly differ visually in the distribution of poverty, but I am having trouble finding a way to provide a statistical comparison between maps. I have tried using contingency tables and the comparison of chi squared values - however, this really only compares the counts of areas that fall into each category, but provides no indication of spatial coincidence.

Are there any statistical measures to compare these types of maps both numerically and spatially?

Edit: Examples of maps are below

Measure 1 - Adjusted per capita income (by standard score)![][1]

Measure 2 - Income Ratio (by standard score)

  • 2
    It might be helpful if you could provide some information on the different poverty measures - are they single variable (numbers of households with an income below a certain $ value) or composite (i.e % of population without education and unemployed ....). Do you have the actual numerical data behind the ranges - something like a Getis-Ord approach might be applicable? – Andrew Tice Jul 23 '13 at 5:19
  • The poverty measures differ in units of measurement, ranging from percent of population below poverty line to per capita income of census tract. However, in the maps, the values of each tract are represented as standard scores (z scores) of how far each value is from the population mean. Ranges of values represent ranges of standard deviation. Therefore, units should be directly comparable across maps. – Krausers Jul 23 '13 at 12:00

It's been a while since this question was asked, but I saw it by chance today and since I already had a similar problem, I thought I'd throw in my 2 cents.

You might be interested in an algorithm called Mapcurves, which gives you a goodness-of-fit measure based on spatial overlap. The algorithm is described in this paper and an implementation in R and Matlab is available here. In short, Mapcurves calculates, for each pair of categories from both maps, a value between 0 and 1 representing the degree of similarity between the two classes (with 0 for no overlap and 1 if the classes are identical). This value is the percentage of class A (from map A) that overlaps with class B, weighted by the percentage of class B that overlaps with class A. This will give you a sort of "contingency table" with goodness-of-fit values instead of counts. Next, the scores are summed for each class (i.e. for the margins of that table). Then, for each possible degree of similarity between 0 and 1 (the choice of interval is up to you, e.g. the paper and implementation above use steps of 0.02), the percentage of all classes that are equal to or above that value is plotted on a curve (hence the name). The area under the curve, which will also be between 0 and 1, is a measure for overall similarity of the two maps.

From my experience, I'd say that this is useful if several maps are being compared (i.e. "is map 2 more similar to map 1 that map 3?"). A stand-alone goodness-of-fit value, on the other hand, is harder to interpret as the coarseness of the maps also affects the result. Another thing to consider, if comparing polygons with identical geometries as in this case, is whether you want to compare the values of objects directly (i.e. give only the attributes as input to the algorithm) rather than taking into account the area of the polygons.

Hope that helps (if you're still working on this problem!)


I think a good choice would be Bivariate Moran's I or Bivariate Local Moran's I (also called Bivariate LISA for Local Indicators of Spatial Association), both of which can be implemented in GeoDa. The tutorial is "old", but except for some menu renaming is still pretty usefl, and of course the statistical concepts are still applicable.

The basics are as follows. Bivariate Moran's I is an extension of Univariate Moran's I, which is an index on the scale of -1 to 1 of the spatial autocorrelation of a variable. A phenomenon that is clustered will have a positive Moran's I, while a variable that is dispersed (e.g. a checkerboard pattern) will have a negative Moran's I. Moran's I close to 0 indicates spatial randomness. Global Moran's I (usually just referred to as Moran's I) calculates the measure over the entire study area, while Local Moran's I calculates it for each location based on its local neighborhood. For Local Moran's I, GeoDa produces maps (in a red-blue color scheme which has become the standard) of High values surrounded by High values, High-Low, Low-High, and Low-Low.

enter image description here

Bivariate Moran's I does something similar, except it compares a variable (in your example, INCRAT) at a location to the weighted average of another variable in the neighboring areas (say, ADJPCI). A positive Moran's I would indicate that INCRAT is spatially correlated with ADJPCI. Local Moran's I would show you maps of clusters of high and low values.

To access these functions in GeoDa, go to Space→Bivariate Moran's I or Space→Bivariate Local Moran's I. In both cases, you have to specify a weights matrix. When the Select Weights dialog comes up, click the button to Create new weights file. Specify your unique identifier (e.g. from your maps, I would guess the Tract ID). Choose between Contiguity Weight and Distance Weight. The easiest choice is Contiguity Weight, where contiguous polygons are weighted 1 and all others are weighted 0. You have to choose between rook or queen contiguity, i.e. are polygons contiguous only if their edges touch, or even if they only have one vertex in common?

enter image description here

For Moran's I, GeoDa will produce a scatterplot of your X variable against the spatially lagged Y variable, as well as the computed value in the range of -1 to 1.

Moran Scatterplot of % Unemployment against Spatially Lagged % Poverty

For Local Moran's I, you have the option to produce the scatterplot, the cluster map (as shown above for the univariate case), and a significance map showing the significance level associated with each cluster.

Information on how to do this is contained in Chapter 21 of the tutorial linked above. Information on how to create the spatial weights matrix is in Chapter 15.


I may be mijudging the situation here, but you can treat this as a suitability problem and multiply the INCRAT AND ADJPCI for each area and display the product. You would have to shift the values to make them all positive but I have found it is a good way to compare multiple variables directly, regardless of what their range of values are.

  • 2
    The idea is good but the proposed implementation is not. Just back up one step: if you were to multiply the scores as expressed in standard deviations (exactly as shown in the two maps), you would get values that are interpretable. In fact, the sum of all these values is the correlation coefficient between the two datasets. Drawing a map of the individual products therefore shows which regions have positive values of the product (which contribute to positive correlation) and which regions have negative values (negative correlation). There is a population-weighted version of this, too. – whuber Jul 23 '13 at 15:51
  • My bad, I don't have enough statistics background. I didn't see that it was standard deviation,. – Eyrofire Jul 23 '13 at 17:35

Your Answer

