# Fuzzy Set Ordination Web Page

## What is fuzzy set ordination (FSO)?

Ordination is a way to find associations between site factors and species distributions (Pielou 1984) that is commonly used by plant community ecologists. Many different techniques have been developed; Michael Palmer's Ordination Web Page is a good place to start for an overview. FSO is a subset of fuzzy set theory (click here to learn everything (maybe more!) you wanted to know about fuzzy set theory and its uses). The references I've been able to find that use FSO and related techniques are located below.

FSO is a different approach to the ordination of vegetation data. It was introduced by Roberts (1986) as a heuristic alternative to traditional ordination techniques. Unlike these latter techniques, an investigator using fuzzy set ordination must hypothesize a relationship between the environment and the vegetation before performing the ordination. Sites are assigned values that can range from 0 to 1 that denote their membership in a set. For example, the values of site in a fuzzy set of "high elevations" would range from 0 (the lowest site) to 1 (the highest site). Conversely, the values of sites in a low-elevation fuzzy set would range from 0 (the highest site) to 1 (the lowest site). The sets are considered to be fuzzy because each site or element in the set can have partial membership; in classical set theory, elements are either completely in or completely out of a given set. The operations of classical set theory, such as union and intersection, can also be performed on fuzzy sets. One very useful operator in vegetation analysis is the anticommutative difference (Roberts 1986), which can be understood as "while not." This can be used, for example, to construct a fuzzy set that includes the membership of sites that are similar in composition to high elevation sites while not actually at high elevation.

Roberts (1986) has shown that fuzzy set ordination is a general technique that includes specific types of ordination that ecologists are more familiar with, such as direct gradient analysis (Whittaker 1967), Bray-Curtis ordination (Bray & Curtis 1957), and environmental scalars ordination (Loucks 1962). Species responses to environmental factors are not restricted to any particular function; they can be, for example, nonlinear or discontinuous. Also, each axis of the ordination is chosen beforehand, so the basis of interpretation is predetermined. Thus, the ecologist can use fuzzy set ordination to explicitly test hypotheses.  So FSO, like RDA and CCA, is a constrained or direct ordination technique; in fact, FSO is the constrained version of Bray-Curtis (polar) ordination, the grandaddy of all ordination techniques.

## Software for FSO

### Mulva-5

While software packages have been developed for many ordination techniques, few exist for FSO. MULVA-5 for Macintosh and Windows is one that I'm aware of that incorporates an FSO routine (FUZZORD). It also incorporates a step-across routine (FSPATH) to remove horseshoe/curlover effects (read below to find out more about that). However, your choice of similarity indices in MULVA-5 is limited, and it matters a great deal (see below) as to which similarity index is used.

### SAS

I originally developed SAS code to perform FSO.  However, I no longer have access to SAS.  You can click here to use the archived SAS material, but be aware that I no longer maintain it, and it is not completely up-to-date.  Also, it is rather slow...

### Fuzzy Grouping

This is a program developed by Pisces Conservation Ltd. and is described at http://www.pisces-conservation.com/softfuzz.html.  It retails for £95.00.  I have tried the demo version only.  It appears to run FSO on binary (presence/absence) data, using the 9 binary indices tested by Boyce and Ellison (2001).  As the software has incorporated the algorithms I developed for SAS (above), it gives the same answers the other procedures described here.

### R

This will give you the most options and is the cheapest in terms of money.  Here's what you need to do:

#### 1) Get R

Fortunately, Dave Roberts at Montana State University has developed FSO routines that run in this open-source (i.e., free) statistical programing language.  While R won't cost you any money, it does take some time to master.  It is an object-oriented language, similar to C++, which takes some getting used to if you are an old-school linear programmer like me.  To get R, you should go to http://cran.r-project.org/, then I recommend that you go to Hank Steven's R for Statistics, By Example to learn how to use it.  You will need to have a basic familiarity with how R works before you can proceed much farther

#### 2) Get FSO software

Dave Roberts has developed a whole suite of programs for vegetation analysis, not just FSO, at the Laboratory for Dynamic Synthetic Vegephenomenology.  In order to get his software, go to http://cran.r-project.org/src/contrib/PACKAGES.html to get the packages fso and labdsv.  I strongly suggest that you work through all the pages up to and including FSO on Robert's LabDSV page before you attempt to run FSO.

#### 3) Get your evironmental and vegetation data and calculate a distance (similarity) matrix

In order to run FSO, you need two data sets.  The first is a set of environmental factors, where the data are arranged in columns, and each row corresponds to a site.  On his LabDSV site (see above), Roberts uses brycesit.s, which is a set of environmental data collected from Bryce Canyon National Park.  When you download it, you will see that each factor, such as elevation, is arranged in a column.  The second data set you will need is the vegetation data (please excuse my plantist assumptions here; most of you will be plant ecologists, but FSO is perfectly usable for data collected from other kingdoms!).  Roberts uses bryceveg.s, which is a set of plant species data also collected from Bryce Canyon.  When you download it, you will see that each species is arranged in a column, with each row corresponding to the same site as the same row in the environmental data.

FSO, however, does not use the raw vegetation data, but rather a similarity (or distance) matrix, which you must calculate before performing FSO.  A similarity matrix gives a measure of similarity between each site, based solely on the vegetation.  Thus, it has the same number of rows as columns, which are equal to the number of sites.  FSO requires that a similarity index (SI) be 0, if two sites have no species in common, and 1, if they have the same composition.  There are at least a dozen that can be used, however.

Only a few SIs will give you good results in FSO.  For binary data, or presence/absence data, I (Boyce & Ellison 2001) recommend any of the following five:  Baroni-Urbani & Buser, Jaccard, Kulczynski, Ochiai or Sørensen (these SIs are also described in Krebs (1989) and Legendre & Legendre (1998)).  For abundance data, or data where you have a quantitative measure of species abundance, I (Boyce and Weisenburg unpublished but to be submitted soon) recommend any of the following three:  Baroni-Urbani & Buser, Horn, or Yule.  "But wait!" you may say; Baroni-Urbani & Buser and Yule are binary indices.  Yes, but Tamás et al. (2001) have shown how you can convert any binary SI into an abundance SI, which I've done (see below).

There are several libraries in R that will calculate SIs for you (go to http://cran.r-project.org/src/contrib/PACKAGES.html to see all the libraries available).  Technically, most of these will calculate distance indices (DIs).  However, distances are the complement of SI and are related as DI = 1 - SI.  Roberts' routines assume that you will be giving the data as DIs.  These tables show which R library will calculate each DI, at least in a form that can be used for FSO.

Binary Data
 Distance Boyce** labdsv vegan Index Formula* Baroni-Urbani & Buser (a + sqrt(a*d))/(a + b + c + sqrt(a*d)) √ Jaccard a/(a + b + c) √ √ Kulczynski 0.5* (a/(a + b) + a/(a + c)) √ √ Ochiai a/sqrt((a + b) * (a + c)) √ √ Sørensen 2 * a/(2 * a + b + c) √ √
*Where a = # spp. both sites have in common, b = # spp. in 1st site but not 2nd, c = # ssp. in 2nd site but not 1st, and d = # ssp. that are absent from both sites but are present elsewhere.

Abundance Data

 Distance Index Boyce** Formula* Baroni-Urbani & Buser √ Horn √ Yule*** √
*Where sites j and k are being compared, based upon species i = 1 to S, where S is the total number of species, xij is the abundance of species i at site j, maxj(xij) = the maximum value of species i across all sites j, and Nj = ∑ xij
***This was developed from "Yule 1" presented in Tamás et al. (2001).  In its original form, it ranges from -1 to 1.  It was normalized to range from 0 to 1 before being converted to an abundance similarity index.

Step-Across
All ordination methods suffer from distortion in ordination space.  For example, PCA has the horseshoe effect, and CA and CCA have the arch effect.  FSO can exhibit something called I've called "curlover" (Boyce and Ellison 2001), where data points at the end of the gradient curl back onto themselves.  It is most serious when the gradient over which your sites fall is longer that the average species range in your study.  In this case, you can have sites with no species in common and thus an SI value of 0.  But if both of the sites have many species in common with several other sites, it makes sense to say they are more similar than two sites that have only a few species in common at a few other sites.  At least a couple of "step-across" algorithms have been developed to adjust these 0 values.  I recommend stepacross() in the R library vegan; below, I show how you can use it.

At this point, you are ready to perform FSO, using the library fso that you have downloaded as described above under step 2.  I suggest that you initially follow the steps that Roberts has outlined on his LabDSV page for FSOL <http://ecology.msu.montana.edu/labdsv/R/lab11/lab11.html>.

Let's work through a couple of examples.

#### 4) Examples

Binary Data
First, let's use a dataset that was presented in Boyce et al. (2005).  These data were collected from an alpine area of the Rocky Mountains in Colorado.  The vegetation or species data are contained in goliathveg.txt, and the environmental or site data are in goliathsite.txt.  In order to duplicate what I show here, you will need to slightly modify the code in fso.  Roberts has set it up to report Pearson r's.  I prefer Spearman r, as it is insensitive to nonlinearity in the two factors being compared.  The modification is not hard.  In R, open fso.  Search for cor() functions.  Within each cor()function, insert method="spearman"

Start in R with:
`library(labdsv)library(fso)veg <- read.table("goliathveg.txt",header=T, sep="\t")site <- read.table("goliathsite.txt",header=T,sep="\t")`
I've already formatted the data as presence/absence data, i.e., if a species is present at a site, it is given a 1, and if absent, a 0.  If your data are given as abundances and you want to convert it to presence/absence, include the following line:
`veg[veg > 0] <- 1`
To compute a distance matrix, use following function, which I've adapted from dist.binary in the R library ade4 (note that this may be downloaded as binarysim.R
`sim.binary <- function (df, method = NULL, diag=FALSE, upper=FALSE){    df <- as.matrix(df)    a <- df %*% t(df)    b <- df %*% (1 - t(df))    c <- (1 - df) %*% t(df)    d <- ncol(df) - a - b - c   #1=Jaccard, 2=Baroni-Urbani & Buser, 3=Kulczynski, 4=Ochiai, 5=Sorensen    if (method == 1) {        sim <- a/(a + b + c)    }    else if (method == 2) {        sim <- (a + sqrt(a*d))/(a + b + c + sqrt(a*d))    }    else if (method == 3) {        sim <- 0.5* (a/(a + b) + a/(a + c))    }    else if (method == 4) {        sim <- a/sqrt((a + b) * (a + c))    }    else if (method == 5) {        sim <- 2 * a/(2 * a + b + c)    }    sim2 <- sim[row(sim) > col(sim)]    class(sim2) <- "dist"    attr(sim2, "Labels") <- dimnames(df)[]    attr(sim2, "Diag") <- diag    attr(sim2, "Upper") <- upper    attr(sim2, "Size") <- nrow(df)    attr(sim2, "call") <- match.call()return(sim2)}`
This creates a function that will calculate a similarity matrix of the form required by fso().  I've included the 5 indices recommended by Boyce and Ellison (2001).  Since we used Sørensen's index for this study, let's go ahead and do this.  We will then convert the similarity index into a distance index, which is also required by fso():
`#Change method number to the similarity index you want to usesim <- sim.binary(veg,method=5)dis.sor <- 1 - sim`
We will use the attach command so that we can refer to individual variables in site without having to use the site\$ prefix:
`attach(site)`
We will start by performing FSO on elevation, which often is an important variable.
`elev.fso <- fso(elev,dis.sor)elev.fsoplot(elev.fso, title = "Mt. Goliath", xlab="Actual Elevation", ylab="Apparent Elevation")` Note that the Spearman r value is fairly high.  Listing elev.fso (simply enter elev.fso in R) will give the p-value, which is 5.994494e-11.  Roberts has said that these p-values tend to be lower than they should be.  However, you can use a permutation test in FSO to derive robust and perfectly good p-values.  Using 1000 permutations will give a lower p-value limit of 0.001; if you want a limit of 0.0001, you will need to use 10,000 permutations.  While these p-values are accurate, be aware that they can take a long time to generate!
`elev.fso <- fso(elev,dis.sor, permute=1000)`
Let's look at the other factors examined by Boyce and Ellison (1998), which includes av (aspect value), sicl (silt + clay soil fraction), and snow (snow depth):
`av.fso <- fso(av,dis.sor)av.fsoplot(av.fso)` `sicl.fso <- fso(sicl,dis.sor)sicl.fsoplot(sicl.fso)` `snow.fso <- fso(snow,dis.sor)snow.fsoplot(snow.fso)` As Roberts suggests, you can quickly screen all of the site variables* using the following:
`grads.fso <- fso(~av+elev+hl+sicl+slope+snow+pH+X.C+X.N+C.N, dis.sor)summary(grads.fso)`
`   col variable         r            p1    2     elev 0.7284380 4.203349e-112    3       hl 0.7013599 9.598198e-103    1       av 0.6887476 1.736076e-094    8      X.C 0.5759182 4.382177e-085    9      X.N 0.5709465 2.784349e-096    6     snow 0.5368028 7.619472e-067   10      C.N 0.5114200 2.670224e-058    5    slope 0.4314090 6.907113e-059    7       pH 0.4056518 5.709669e-0410   4     sicl 0.1346999 2.388193e-02`
*Where hl = heat load (estimated from aspect and slope), X.C (%C in soil), X.N(%N in soil, and C.N (C:N soil ratio).

As stated in Boyce and Ellison, many of these factors were correlated with one another.  Four variables were chosen that were not correlated with each other:  elev, av, sicl, and snow.  We also use the permute= option so that we get correct p-values:
`grads.fso <- fso(~ elev+av+sicl+snow, dis.sor, permute=1000)summary(grads.fso)  col variable         r     p1   1     elev 0.7309908 0.0012   2       av 0.6869921 0.0013   4     snow 0.5399591 0.0014   3     sicl 0.1503474 0.126`
So elevation, aspect value and snow depth all explain variation in the plant community, while soil texture does not.

It is also possible to do multidimensional FSO (Roberts 2008).  Here, FSO is first performed on the variable that explains the most variation.  Then, essentially the residuals from that ordination are used with the next most important variable, and the process is repeated.  Here's the results of a multidimensional FSO with the 3 factors included.  Note that I've included the scaling=2 option, which normalizes the ordination distances from 0 to 1.  Note also that you will get a succession of figures, which show the relationship between the "apparent" factors (ordination locations), which you hope are all uncorrelated.  I show only the last figure here, which essentially shows you how successful you were in explaining species variation with your variables.
`grads.mfso <- mfso(~ elev+av+snow, dis.sor, scaling=2, permute=1000)summary(grads.mfso)plot(grads.mfso,dis.sor)  variable         r     p      gamma1     elev 0.7309908 0.001 1.000000002       av 0.6985632 0.001 0.976717663     snow 0.2402497 0.001 0.09013415` The ordination thus does a reasonably good job of explaining variation in the vegetative data.

Abundance Data
Here, we will use Roberts' data from Bryce Canyon.  The vegetation or species data are contained in bryceveg.s and the environmental or site data are in brycesit.s.  Start in R with:
`library(labdsv)library(fso)veg <- read.table("bryceveg.s",header=T)site <- read.table("brycesit.s",header=T)`
To compute a distance matrix, use following function (also downloadable as abundsim.R).  I'll be the first to admit that this function is not written in the most efficient manner, and it is slow.  If you have more proficiency in R programming, feel free to write a new one, and I'll post it here.
`sim.abund <- function (df, method = NULL, diag = FALSE, upper = FALSE) {    METHODS <- c("Baroni-Urbani & Buser", "Horn", "Yule (Modified)")    if (!inherits(df, "data.frame"))         stop("df is not a data.frame")    if (any(df < 0))         stop("non negative value expected in df")    if (is.null(method)) {        cat("1 = Baroni-Urbani & Buser\n")        cat("2 = Horn\n")        cat("3 = Yule\n")        cat("Select an integer (1-3): ")        method <- as.integer(readLines(n = 1))    }    df <- as.matrix(df)    sites <- nrow(df)    species <- ncol(df)	sim <- array(0, c(as.integer(sites),as.integer(sites)))	spmax <-array(0,c(as.integer(species)))    for (x in 1:species) {    spmax[x] <- max(df[,x])    }    if (method == 1) {	#compute similarities (Baroni-Urbani & Buser)	for (x in 1:sites) {    for (y in 1:sites) {        h1 <- 0        h2 <- 0        h3 <- 0        for (i in 1:species) {            h1 <- h1 + min(df[x,i],df[y,i])            h2 <- h2 + max(df[x,i],df[y,i])            h3 <- h3 + spmax[i] - max(df[x,i],df[y,i])            }        numer <- h1 + sqrt(h1*h3)        denom <- h2 + sqrt(h1*h3)        sim[x,y] <- ifelse(identical(denom,0), 0, numer/denom)        }    }    }    else if (method == 2) {	#compute similarities (Horn)	for (x in 1:sites) {    for (y in 1:sites) {        h1 <- 0        h2 <- 0        h3 <- 0        for (i in 1:species) {            if((df[x,i] + df[y,i]) > 0) h1 <- h1 + (df[x,i] + df[y,i]) * log10(df[x,i] + df[y,i])            if(df[x,i] > 0) h2 <- h2 + df[x,i] * log10(df[x,i])            if(df[y,i] > 0) h3 <- h3 + df[y,i] * log10(df[y,i])            }        x.sum <- sum(df[x,])        y.sum <- sum(df[y,])        xy.sum <- x.sum + y.sum        if (identical(xy.sum, 0)) (sim[x,y] <- 0) else (sim[x,y] <- (h1 - h2 - h3)/(xy.sum * log10(xy.sum)-x.sum * log10(x.sum) - y.sum * log10(y.sum)))        }    }}    else if (method == 3) {	#compute similarities (Yule)	for (x in 1:sites) {    for (y in 1:sites) {        h1 <- 0        h2 <- 0        h3 <- 0        h4 <- 0        for (i in 1:species) {            h1 <- h1 + min(df[x,i], df[y,i])            h2 <- h2 + max(df[x,i], df[y,i]) - df[y,i]            h3 <- h3 + max(df[x,i], df[y,i]) - df[x,i]            h4 <- h4 + spmax[i] - max(df[x,i], df[y,i])            }        numer <- sqrt(h1*h4)        denom <- sqrt(h1*h4) + sqrt(h2*h3)        sim[x,y] <- ifelse(identical(denom,0), 0, numer/denom)        }    }    }	    else stop("Non convenient method")	sim >- t(sim)    sim2 <- sim[row(sim) > col(sim)]    attr(sim2, "Size") <- sites    attr(sim2, "Labels") <- dimnames(df)[]    attr(sim2, "Diag") <- diag    attr(sim2, "Upper") <- upper    attr(sim2, "method") <- METHODS[method]    attr(sim2, "call") <- match.call()    class(sim2) <- "dist"    return(sim2)}`
As in the binary case, this will calculate a similarity matrix,of the form required by fso().  I've included the 3 indices I recommend.  For this example, I'll use Horn's index (method = 2; Baroni-Urbani and Buser is 1, and Yule is 3).  Also, we will convert the similarity index into a distance index, which is also required by fso():
`sim <- sim.abund(veg,method=2)simdis.ho <- 1 - sim`
As done in the binary case, we will use the attach command:
`attach(site)`
We will start be performing FSO on elevation, which is usally an important variable in the West.
`elev.fso <- fso(elev, dis.ho)plot(elev.fso, title="Bryce Canyon", xlab="Actual Elevation", ylab="Apparent Elevation")` The Spearman r value is fairly high (the Pearson r = 0.827).  Listing elev.fso will give an extremely low p-value--0!  As in the above example, it is best to use a permutation test in FSO.
`elev.fso <- fso(elev, dis.ho,permute=1000)`
The above command uses 1000 permutations and gives us p < 0.001.

Roberts also looked at slope, and we can do the same:
`slope.fso <- fso(slope,dis.ho)plot(slope.fso, title="Bryce Canyon")` (Pearson r = 0.331)

Let's also use use the commands which allow us to rapidly screen all of the site factors:
`grads.fso <- fso(~elev+av+slope+annrad+grorad,dis.ho)summary(grads.fso)`
Here's the output:
`  col variable          r            p1   1     elev 0.83100659 0.000000e+002   4   annrad 0.21870566 5.137353e-043   5   grorad 0.20833365 3.557737e-044   3    slope 0.20368768 1.948038e-055   2       av 0.09118575 2.478808e-01`
Let's do this with permutations, as the p-values are likely to be more accurate:
`grads.fso <- fso(~elev+av+slope+annrad+grorad,dis.ho, permute=1000)summary(grads.fso)  col variable          r     p1   1     elev 0.83100659 0.0012   4   annrad 0.21870566 0.0023   5   grorad 0.20833365 0.0044   3    slope 0.20368768 0.0025   2       av 0.09118575 0.089`
Here's the findings using Pearson r values:
`  col variable          r     p1   1     elev 0.82669241 0.0012   3    slope 0.33067848 0.0013   5   grorad 0.27886855 0.0014   4   annrad 0.27155417 0.0015   2       av 0.09187828 0.137`
These findings are quite similar to those shown by Roberts.

We can also repeat the multidimensional FSO.  Here's the results of a multidimensional FSO with the elevation, slope, and growing-season radiation included:
`grads.mfso <- mfso(~elev+slope+grorad,dis.ho,scaling=2)summary(grads.mfso)plot(grads.mfso)  variable          r     p     gamma1     elev 0.83100659 0.001 1.00000003   grorad 0.19167651 0.003 0.16203222    slope 0.05178301 0.003 0.7454107` Using Pearson r's, we get:
`  variable         r     p     gamma1     elev 0.8266924 0.001 1.00000002    slope 0.2843232 0.001 0.74541073   grorad 0.1597620 0.001 0.1620322`
and the Pearson r for the fit between ordination distance and matrix dissimilarity = 0.803.

So, this ordination also gives a pretty good fit to the vegetation data, and one slightly better that that demonstrated by Roberts with the Bray-Curtis SI.

Step-Across
We can also see if a step-across correction might improve the ordination.  Here is a function I've written which incorporates a function in the library vegan
`st.acr <- function(sim, diag=FALSE, upper = FALSE){	library(vegan)	dis <- 1 - sim	#use "shortest" or "extended"	edis <- as.matrix(stepacross(dis, path = "shortest", toolong = 1))	sim <- 1 - edis	amax <- max(sim)	amin <- min(sim)	sim <- (sim-amin)/(amax-amin)    sim2 <- sim[row(sim) > col(sim)]    attr(sim2, "Size") <- nrow(sim)    attr(sim2, "Labels") <- dimnames(sim)[]    attr(sim2, "Diag") <- diag    attr(sim2, "Upper") <- upper    attr(sim2, "call") <- match.call()    class(sim2) <- "dist"    return(sim2)}`
N.B.  If you use dsvdis() in labdsv to calculate similarity/distances matrices, it can do step-across as part of the function.

Let's call this function, then perform a multidimensional FSO and see if it causes an improvement.
`sim.new <- st.acr(sim)dis.ho.new <- 1 - sim.new﻿grads.mfso <- mfso(~elev+slope+grorad,dis.ho.new,scaling=2,permute=1000)summary(grads.mfso)﻿  variable          r     p     gamma1     elev 0.79813451 0.001 1.00000003   grorad 0.19636705 0.002 0.14144692    slope 0.09942535 0.002 0.8608167`

Elevation doesn't explain as much, whereas slope explains a bit more of the variation in vegetation.
`﻿plot(grads.mfso, dis.ho.new)` Overall, step-across improved the multidimensional FSO fit.  It appears to have done this by "expanding" all the points that had matrix dissimilarities = 1 before the step-aross was performed.

FSO References

Boyce, R.L. 1998. Fuzzy set ordination along an elevation gradient on a mountain in Vermont, USA. J. Veg. Sci. 9: 191-200.

Boyce, R.L.  2000.  Relationships between environmental factors and hemlock distribution at Mt. Ascutney, Vermont.  In Proceedings:  Symposium on sustainable management of hemlock ecosystems in eastern North America, June 22-24, 1999, Durham, NH.  General Technical Report NE-267. K.A. McManus, K.S. Schields and D. Souto, eds. Newtown Square, PA: U.S. Department of Agriculture, Forest Service, Northeastern Research Station, pp. 113-121.

Boyce, R.L, and P.C. Ellison.  2001. Choosing the best similarity index when performing fuzzy set ordination on binary data.  Journal of Vegetation Science 12:711-720.

Boyce, R.L., R. Clark, and C. Dawson.  2005.  Factors determining alpine species distribution on Goliath Peak, Front Range, Colorado, U.S.A.  Arctic, Antarctic, and Alpine Research 37:89-90

Bradfield, G.E., and N.C. Kenkel. 1987. Nonlinear ordination using flexible shortest path adjustment of ecological distances. Ecology 68: 750-753.

Bragg, D.C.  2002.  Fuzzy set classification of old-growth southern pineIn Proc. 2001 Southern Mensurationists' Conference, Chattanooga, TN, November 4-6, 2001.  Arkansas Forest Resources Center, Monticello, AR, pp. 37-43.

Bray, J.R., and J.T. Curtis. 1957. An ordination of the upland forest communities of southern Wisconsin. Ecol. Monogr. 27: 325-349.

Equihua, M. 1991. Fuzzy clustering of ecological data. J. Ecol. 78: 519-534.

Equihua, M. 1991. Análisis de la vegetación empleando la teoría de conjuntos difusos como base conceptual. Acta Botanica Mexicana 15: 1-16.

Fulton, M.R. 1996. An application of fuzzy set ordination to determine tree habitat suitability of sites from a regional data set. J. Veg. Sci. 7: 739-746.

Krebs, C.J. 1989. Ecological methodology. Harper & Row, New York.

Legendre, P., and L. Legendre.  1998.  Numerical ecology.  2nd English Edn.  Elsevier, Amsterdam, 853 p.

Loucks, O.L. 1962. Ordinating forest communities by means of environmental scalars and phytosociological indices. Ecol. Monogr. 32: 137-166.

Minieka, E. 1978. Optimization algorithm for networks and graphs. Marcel Dekker, New York.

Munzbergova, Z., and D. Ward.  2002.  Acacia trees as keystone species in Negev desert ecosystems.  J. Veg. Sci. 13: 227-236

Palmer, M.W. 1994. Fuzzy sets or blurry artifacts? A comment on Zhang and Oxley. J. Veg. Sci. 5: 439-440.

Palmer, M.W. 1995. Blurry artifacts: a retraction. J. Veg. Sci. 6: 447.

Pedersen, T.C., A. Baattrup-Pedersen, and T.V. Madsen.  2006.  Effects of stream restoration and management on plant communities in lowland streams.  Freshwater Biology 51: 161-179.

Pielou, E.C. 1984. The interpretation of ecological data. John Wiley & Sons, New York, USA.

Roberts, D.W. 1986. Ordination on the basis of fuzzy set theory. Vegetatio 66: 123-131.

Roberts, D.W.  1989.   Fuzzy systems vegetation theory.  Plant Ecology 83: 71-80

Roberts, D.W.  2008.  Statistical analysis of multidimensional fuzzy set ordinations.  Ecology 89:1246-1260.

Rohde, S., M. Schütz, F. Kienast, and P. Englmaier.  River widening: an approach to restoring riparian habitats and plant species.  River Research and Applications 21: 1075-1094.

Tamás, J., J. Podani, and P. Csontos. 2001. An extension of presence/absence coefficients to abundance data:  a new look at absence. Journal of Vegetation Science 12:401-410.

Williamson, M.H. 1978. The ordination of incidence data. J. Ecol. 66: 911-920.

Zhang, J.-T. 1994. A combination of fuzzy set ordination with detrended correspondence analysis: One way to combine multi-environmental variables with vegetation data. Vegetatio 115: 115-121.

Zhang, J.-T., and E.R.B. Oxley. 1994. A comparison of three methods of multivariate analysis of upland grasslands in North Wales. J. Veg. Sci. 5: 71-76.

Disclaimer and Request: All of these programs are works-in-progress and probably have some hidden bugs I haven't found yet. You download and use them at your own risk. I am not responsible for any injury, real or imagined, that occurs to you if you download or use them. After all, they are free! All I do ask in return is that you reference me if you publish any results that use these programs. Feedback on anything and everything on this page is most welcome. Return to Rick Boyce's Home Page