labdsv_2.1-0

This is a simple clean-up of some documentation (deleted broken url links)
and some changes requested by CRAN. 


labdsv_2.0-1

This is a fairly significant redesign of labdsv focused primarily on the
ordination routines.  This version creates a new ordination class "dsvord" that
incorporates all the existing ordinations and makes importing ordinations from
other packages simpler.  The plot(), points(), surf(), plotid(), hilight(),
chullord(), ellip(), rgl() and thull() functions have all been re-written to
accommodate the new dsvord class.  The result is much simpler, but should be
backward compatible with all existing scripts that use labdsv.  Many ordination
results from other packages can be converted to labdsv through the as.dsvord 
function.

labdsv now incorporates the t-Distributed Stochastic Neighbor Embedding 
routine from Rtsne as an ordination.

New functions were introduced to facilitate modeling species and environmental
variables as a function of ordinations: see predict and calibrate respectively.

The bestnmds and besttsne functions now include a single iteration from a 
PCO initial condition as part of the requested random starts.

Several new functions were introduced to make it easier to edit data.frames
in the workspace.  See factorize, defactorize, and gsr.

In addition, new community standardizations were developed, comprising
samptot (for standardize by sample total), spcmax (to standardize by species 
maximum) and hellinger (to perform the hellinger standardization).

A couple of changes were made to make labdsv more R-like in syntax.  metrify
can now be invoked as as.metric, euclidify can now be invoked as as.euclidean.  
(I know that verbs are now the rage, but I added the conversions anyway, and 
the old verbs still work.)

Changes were made to function concov() to make it work better when passed a
single cluster.

At least for the time being rgl is back in labdsv.

labdsv_1.8-0

Due to the ever increasing hassle of building rgl I deleted all references
to rgl from labdsv, and following vegan, ported those functions to another
package, labdsv3d.


labdsv_1.7-0

Quite a few changes were made to labdsv to (1) make it work better with tools
like knitr or Sweave, and (2) to improve and standardize the way functions work
with factors or classification vectors.  

With respect to knitr and Sweave, all functions which produce multiple panels
of plots with "hit return" prompts have been modified to allow you to specify
a single panel if desired by passing an argument called 'panel' which can be
an integer or the word 'all'.

With respect to clustering, , a new function called "clustify" was written to
manage the wide variety of forms clustering information can take.  All inputs
are converted to a factor, and then managed within the calling functions as
necessary.  as.numeric(clustify('input')) guarantees consecutive integers
beginning at one, and allows levels('input') to correctly label columns or list
objects with the original IDs.

Changes made in 1.6-1 to prevent passing unacceptable cluster IDs (e.g. 0)
broke the ability of some functions to use factors as cluster IDs.  The changes
in 1.7-0 fix that.

Finally, now that Google and Hadley Wickham have both said that 'else' does not
need to start on line by itself, all instances of

if () {
}
else {
} 

have been changed to 

if () {
} else {
}

I know it breaks the rules, but I agree with Hadley it's more readable and the
interpreter seems to handle it just fine.


labdsv_1.6-1

added a routine to function indval() to check the taxa matrix for species
which never occur [apply(x>0,2,sum) = 0] for some species.  indval() aborts
with an error message in such cases.  I also added a routine to the FORTRAN 
code to trap array out-of-bounds conditions caused by species not assigned 
to any cluster for any reason.  indval() gives such species a probability
of 1.0 and prints a warning message from indval() or summary.indval().

labdsv_1.6-0

adding a routine to check cluster memberships in all functions that 
accept cluster membership vectors as input.  Such vectors are now forced 
to consecutive integers (preserving the order) if they are not already in that
form.

labdsv 1.5-0

labdsv was updated in several areas, with the largest change being the
transition to a NAMESPACE format as mandated by R 2.14.  

Specific changes are:

1) function const() was modernized to replace truncation code with formatting
code.  More importantly, const() was modified to return the result with a
return() statement, rather than a print() statement to make it embeddable in the
new concov() function (see just below).

2) a new function called concov() was added to combine the two functions const()
and importance() in a single output, commonly called a "constancy/coverage
table" by ecologists.  

3) a new function called homoteneity() was added to facilitate diversity
analysis.  homoteneity() is defined as the mean constancy of the S most constant
species, expressed as a fraction, where S is the mean species richness of a
type. This value represents the constancy of the average species in a community
type; higher values for homoteneity indicate greater uniformity in species
composition among plots.  This function was adapted from the Virginia heritage
program at http://www.dcr.virginia.gov/natural_heritage/ncstatistics.shtml.

4) function importance() was modified to replace truncation code with formatting
code.  More importantly, importance was modified to allow calculating "typical"
importance, as opposed to "mean" importance where typical importance is the sum
of the abundance of a species divided by the number of plots in which it occurs, 
whereas mean importance is the sum of the abundance of a species divided by the
number of plots in the type.  Typical importance is the default.

5) function plot.pca() was updated to use more conventional R graphing code.
function surf.pca() had a typo fixed that produced a bug when surfing
non-thinplate spline surfs for binary variables.

6) a new function called reconcile() was added to help manage the taxa and site
environment data.frames.  Specifically, reconcile() returns as a list the
rows common to both the the taxa and site data.frames, and drops plots which only
occur in one or the other.

7) function rgl.pco() was added to produce rgl three-dimensional graphics of PCO
ordination.  rgl.nmds always worked on PCOs, but the naming convention made it
appear to be specific to NMDS.  Since rgl is not a S-3 generic function, it was
necessary to have two separately named functions to do the job.


labdsv 1.4-1

labdsv was modified in several subtle ways to better accommodate package
optpart, e.g. function indval was made generic to handle 'strides' from, package
optpart.  The hilight.nmds and hilight.pco functions were modified slightly to
overcome problems with ghosting.



labdsv 1.3-3

1) I added two new plotting routines for plotting NMDS ordinations:
thull and rgl.nmds.  thull stands for "tensioned hull" and fits a minimum
volume surface to a plot to contain a specific identified element. 
The rgl.nmds function uses the fabulous rgl library to plot a 3-D version
of an NMDS.

2) Since no one (as far as I know) uses labdsv in S-Plus, I simplified the 
plotting routines just using "asp = 1" where necessary.

3) In response to a problem noted by Miquel de Caceres, I modified an element
of code in indval.f to eliminate a >= comparison.  In some cases, because the
test compared a 64-bit real to an 80-bit register value the test would fail
even when the values were known to be the same.  The problem only occurred on
rare occasions where cluster sizes were equal and species were rare of
singletons.

It's possible that
alternative compiler optimizations would have solved the problem, but I do not
know how to write R make files for multiple systems that would solve the
problem.  In essence, the code was changed from 

   if (x >= y) then

to   

  if (x - y > -0.0001) then

to enforce a conservative test.  I would be happy to replace that with better
code if anyone has suggestions.

labdsv 1.3-2

1) I fixed a bug (typo) in surf.nmds() that affected thinplate splines of logical
variables.

2) Changed a parameter in the smooth function of the plot.indspc() function
as well as changing the axis labels.

3) I renamed the duleg function to "indval."  It now returns objects 
of class "indval."

4) I added a new function called ordtaxa which allows interactive re-ordering of
rows and columns in the taxon dataframe, re-ordering the rows in the site
dataframe to maintain the correspondence.

5) Similar to ordtaxa, I added an argument to summary.indval, const, and
importance to allow interactive re-ordering the rows in the summary tables.

6) I added simple functions dropspc and dropplt to simplify maintaining the
taxon and site dataframes.  dropspc eliminates species (columns) in the taxon
data.frame where the number of occurrences is less then a threshold.  dropplt
removes plots (rows) in both the taxon dataframe and the site dataframe where
plots have missing values for any site variable.

labdsv 1.3-1

This is a bug fix for 1.3-0.  dsvdis.R was missing a cast of the 
taxon data.frame to "as.double" and would fail on taxon matrices that
are strictly integers.  Taxon matrices with real numbers worked.

labdsv 1.3-0

A number of small changes, and a couple of larger ones were made in
the revision to 1.3-0.

1) A bug was fixed in the duleg FORTRAN code that compared a four-byte
floating point number to an eight-byte number.  This bug would only
appear in relatively few cases, and affected the calculated
probability of some observations, not the indicator value itself.  I
also improved the permutation code used in the probability estimates.

2) Subsequent to the discovery of duleg bug, all remaining four-byte
floating points (FORTRAN REAL) were converted to eight-byte floating
point (FORTRAN DOUBLE PRECISION) to achieve better correspondence with
R and avoid problems.  It does increase the storage requirement of
some programs, but this seems to rarely be a problem on modern
computers.

3) I discovered that I was using specialized FORTRAN code in several
places where the base package "dist()" function would work.  I
replaced all of those instances.  This resulted in dropping function
"vardist," and modifying internal function "orddist."

4) I modified function "ordcomp," changing the default
dimensionality to full dimensionality, rather than n=2.  It is still
possible to specify any desired dimensionality through the "dim="
argument; I only changed the default.

5) While updating function "ordcomp" I realized that it would be just
as easy to have function "ordcomp" avoid the call to internal function
"orddist" and do the calculations directly.  Consequently, function
"orddist" is now a stand-alone function useful for calculating the
pair-wise distances in an ordination for any purpose.  Function
"orddist" returns an object of class "dist."

6) I changed the surface fitting routine in all versions of the "surf"
functions (for pca, pco, and nmds) to use the "predict.gam" function
of package "mgcv" in place of the function "interp" from package
"akima."  This resulted in smoother, better fit surfaces, and allowed
me to no longer require package "akima" to load labdsv.  This change
was suggested and first implemented by Jari Oksanen for function
"ordisurf" in package "vegan."  Again, following the lead of vegan, I
made the default surface fitter a thin plate spline, rather then
additive independent smooth splines.  The original behavior is still
available by specifying thinplate=FALSE.  Finally, I added a
gamma argument to the surf function to allow users to control the 
smoothness of the surface by passing gamma tot he underlying gam 
function.

7) In response to a problem identified by P. Legendre, I inserted
checks to see that "taxa" is converted to a dataframe, rather than a
matrix, wherever necessary.

8) I added two new routines to simplify working with large sparse
data sets: "matrify" and "dematrify".  "matrify" takes data in three
column database format (sample_id, taxon, abundance) and converts it
into an expanded sparse matrix data.frame.  This routine allows users
to store their data in a compacted, three column form for exchange
with other programs.  "dematrify" takes a data.frame of taxa abundance
in sparse matrix form and writes it out three column database format
(sample_id, taxon, abundance).  

9) I added a new routine to nmds() and pco() called "density" which
calculates the fraction of plots within a convex hull that belong to 
the same type as the type that defines the convex hull.

10) Once again, I had to re-organize the web server that supports labdsv
and other activities.  The general site for all material is

http://ecology.msu.montana.edu/labdsv/

The material specifically relevant to this package is at

http://ecology.msu.montana.edu/labdsv/R/labdsv


labdsv 1.2-2

fixed a bug in jsurf.nmds where the ordination was not called
correctly

deleted extraneous files in the man directory (don't know why 
they were there in the first place)

moved confus to package optpart

labdsv 1.2-1

function tabdev.R was deleted to temporarily solve inscrutable
problems with Windows server.  tabdev.R worked under linux
and Windows XP, so there may be no need to update on your system.

In addition, the URL in the description file was updated to 
point to the current location of the lab manual for LabDSV.

labdsv 1.2-0

A couple of general changes were made to many functions.

1) in several functions the dataframe "veg" was changed to "taxa"
   to better represent the full range of community ecology the code
   is suitable for

2) in functions that used classified types or community types the
   vector specifying that was changed from "class" to "clustering"
   to avoid conflict with a reserved word, and to integrate better
   with code from package "cluster".

3) the package was checked and built on both linux and Windows to
   help ensure better utility on windows

In addition, a number of small changes were made to several functions,
listed below:

abuocc.R
	changed veg to taxa in function and documentation
confus.R
	added a correction for plotting factors correctly
	example changed to "\dontrun" because it requires library tree
const.R
	changed veg to taxa in function and documentation
	changed class to clustering in function and documentation
	changed class test to inheritance
	generally improved documentation
dga.R
	added an invisible return
	improved the example in the documentation
disana.R
	eliminated null class test
	eliminated FORTRAN call by using apply with na.rm
	corrected point labels to "attr(x,'Labels')"
dissim.R
	removed function dissim
dsvdis.R
	changed an attribute label from "index" to "method" to
		match dist()
	changed the test of step from > to >= so that step=1.0 works
duarm.R
	changed veg to taxa in function and documentation
	changed class to clustering
	simplified the presentation of results
duleg.R
	changed veg to taxa in function and documentation
	changed class to clustering
	enforced better casting of variable types in FORTRAN call
	added numitr to FORTRAN call and return
	improved the labeling of row and column names in output
	fixed possible bugs from uninitiated values in FORTRAN code
envrtest.R
	added an argument to function call to control plotting
	improved the default title on the plot
euclidify.R
	cast the input object to class "dist"
	improved the information in the attributes of the output object
hilight.R
	converted hilight to a generic function and wrote separate 
		methods for PCA. PCO, and NMDS
importance.R
	changed veg to taxa
	changed class to clustering
	changed class test to inheritance
metrify.R
	cast the input object as class "dist"
	changed the output attribute from "index" to "method" to
		match dist()
nmds.R
	deleted test for null class
	changed the name of the overlayed object in the 
		points.nmds function from "overlay" to "which"
	added "cex=0.8" as the default to function surf.nmds and jsurf.nmds
	corrected logical values from "T" to "TRUE"	
	improved the bestnmds function
	improved the hilight function by adding better control of colors
		and glyphs
	added a convex hull function called chullord.nmds()
npmmds.R
	dropped function npmmds()
ordcomp.R
	deleted the test of NULL class and the option to submit a matrix
		instead of a "dist" object
	added an invisible return
orddist.R
	cast the input object to double in FORTRAN call
ordpart.R
	added default axes to the plot, and renamed axes to ax and ay
	cast the values to double in FORTRAN call
        significantly improved the documentation
ordtest.R
	added an inheritance test for object of class "pco", "nmds" and 
		"metaMDS"
ordutils.R
	added hilight() and chullord() as generic functions
pca.R
	added an explicit "cex = 1" as the default in points.pca()
	corrected logicals from "T" to "TRUE"
	corrected the scaling on variance accounted for in varplot()
	added a jsurf.pca() function to jitter coordinates if necessary
	added hilight.pca() as a method
	added chullord.pca() as a method
	improved the documentation
pco.R
	eliminated NULL class test
	corrected logical "T" to "TRUE"
	added hilight.pco() as a method
	added chullord.pco() as a method
refine.R
	dropped function refine()
rndveg.R
	renamed rndveg() to rndtaxa()
	changed veg to taxa in function
simenv.R
	dropped function simenv(), replaced by envrtest()
spcdisc.R
	corrected logical "F" to "FALSE"
tabdev.R
	changed veg to taxa
	cast most variables as double in FORTRAN call
vardist.R
	cast arguments as double in FORTRAN call
vegtab.R
	changed veg to taxa
vegtrans.R
	eliminated FORTRAN call by conversion of algorithm to pure R
	eliminated function stdveg() to standardize by plot or
		species max
zzz.R
	no longer require stats (now included in base)
