Sie sind auf Seite 1von 14

Oikos Editorial Office

Structure of the VORTEX Simulation Model for Population Viability Analysis


Author(s): Robert C. Lacy
Source: Ecological Bulletins, No. 48, The Use of Population Viability Analyses in Conservation
Planning (2000), pp. 191-203
Published by: Oikos Editorial Office
Stable URL: http://www.jstor.org/stable/20113257
Accessed: 17-03-2015 05:12 UTC

Your use of the JSTOR archive indicates your acceptance of the Terms & Conditions of Use, available at
http://www.jstor.org/page/info/about/policies/terms.jsp

JSTOR is a not-for-profit service that helps scholars, researchers, and students discover, use, and build upon a wide range of content
in a trusted digital archive. We use information technology and tools to increase productivity and facilitate new forms of scholarship.
For more information about JSTOR, please contact support@jstor.org.

Oikos Editorial Office is collaborating with JSTOR to digitize, preserve and extend access to Ecological Bulletins.

http://www.jstor.org

This content downloaded from 137.219.254.202 on Tue, 17 Mar 2015 05:12:02 UTC
All use subject to JSTOR Terms and Conditions
Bulletins 48: 191-203. 2000
Ecological Copenhagen

Structure of the VORTEX simulation model for population


viability analysis

Robert C. Lacy

Lacy, R. C. 2000. Structure of the VORTEX simulation model for population viability
-
analysis. Ecol. Bull. 48: 191-203.

The structure of the VORTEX computer simulation model for population viability
analysis is outlined. Theprogram flow is described here in order to provide a detailed

specification of the structure of a widely used population viability analysis model.


VORTEX is an individual-based simulation program that models the effects of mean
rates, demographic stochasticity, environmental variation in
demographic demographic
rates, catastrophes, inbreeding depression, harvest and supplementation, and metapop
ulation structure on the The model
viability of wildlife populations. facilitates analysis
of density-dependent reproduction and changing habitat availability, and most demo
rates can be specified as flexible functions of density, time, popula
graphic optionally
tion gene diversity, inbreeding, age, and sex. VORTEX projects changes in population
size, age and sex structure, and genetic variation, as well as
estimating probabilities and
times to extinction and recolonization.

R. C. Lacy (rlacy@ix.netcom.com), Dept of Conservation Biology, Daniel F. &AdaL. Rice


Center, Chicago Zoological IL 60513, USA.
Society, Brookfield,

"VORTEX and like programs do exactly what they are are not available to the users, because the code is
proprie
told to do, as constrained the static mod information or otherwise not to users, or
by single-species tary provided
els that provide their structure.
They
can be useful for vari simply because the task of reading and understanding the
ous purposes so
long
as the user understands what the pro source code for large and complex programs is formidable.
grams are doing ..." (Caughley and Gunn 1996, p. 208). One possible remedy to the problem of PVA users
The complexity and multiplicity of processes influenc needing
to understand the models
being
used is for practi

ing the dynamics of natural populations of animals and tioners to


develop
their own
computer programs. This

plants means that population viability analysis (PVA) would result in the user having a full understanding of a
models are also
frequently complex.
Different models in model thatwould be specifically designed for the analysis.
corporate different population processes. Individual popu Development of
user-specific and case-specific models is
lation processes can be modeled in various ways, not however, as many biolo
requiring usually practical, population
different sets of driving variables, using different equations gists
are not skilled
computer programmers, and the time
to define the processes, and
providing different output to
required to develop a complex model is often prohibitive.
describe the population dynamics. Users of PVA models Moreover, a
complex computer program developed by and
should understand the basic structure of the models they used by
one
person will sometimes contain serious pro
use, and it is important that models used for scientific gramming
errors. The
testing of programs that are widely
studies and conservation efforts can be examined and used may be a necessary for reliable
rep prerequisite popula
licated. Yet often the details of PVA computer programs tion viability analyses to be employed effectively in biodi

ECOLOGICALBULLETINS48, 2000 191

This content downloaded from 137.219.254.202 on Tue, 17 Mar 2015 05:12:02 UTC
All use subject to JSTOR Terms and Conditions
versity conservation. Finally, the flexibility and expansive suits; 9) routines for
evaluating equations that specify de

capabilities of generic PVA software tomodel a large diver mographic


rates
(e.g., breeding, mortality)
as functions of

sity of population processes will often lead PVA practition population and individual variables
(e.g., population size,
ers to consider threats to that would (see note 3 be
population viability gene diversity, year, age, sex, inbreeding)
otherwise have been
neglected. low); 10) tallies of mean within-population statistics and
Widely available PVA software can serve the same role
metapopulation summaries; 11) algorithms for calculating
as do statistical analysis packages. The ease of use, flexible basic statistics, such as means, standard deviations, stand
to diverse needs, and extensive fa ard errors, and medians across and across iterations.
application prior testing years
cilitate many that would not otherwise be at Variables for intermediate calculations,
applications storing input,
tempted. Ideally, perhaps, all users of statistical methods and output are indicated in the pseudo-code by italicized
would write their own or otherwise the labels. Many of the variables are arrays a value stored
programs study (e.g.,
code of the software entrusted for the analyses. More prac for each or for each class, or for each indi
population, age
tically, confidence isgained in the reliability of generic soft vidual), as suggested by the loops within which they are
ware tools as more
people
use the
programs and compare calculated and used. The indices of such arrays are indicat
the
generated
results to expectations from statistical
theory ed within brackets (e.g.,MortalityRate[p][s][x], for each
and to results for simple and well known cases. Also, users sex, s, and x). VORTEX uses
population, p, age, many
of statistical software are expected to be sufficiendy famil more variables (not shown in the pseudo-code) for facili
iarwith the methods of statistical analysis to be able to tating
calculations andaccumulating sums, sums of
choose models to to their to be squares, and other needed for the basic statis
appropriate apply problem, components
able to provide the proper input, and to be able to interpret tics
reported
in the output.
the results. In the pseudo-code, loops are indicated with FOR: and
Unlike the situation for statistical methods, however, END LOOP statements, or by WHILE: and END
there are not yet widely accepted and published
accounts WHILE statements. Conditional actions are indicated by
of standardmethods for population viability analysis. The IF: and END IF statements, or by IF:, ELSE:, and END
methods of population-based models (e.g., Starfield and IF/ELSE statements. BREAK indicates that program flow
Bleloch 1986, Burgman et al. 1993) are extensions of the exits from the bottom of a loop. CONTINUE indicates
methods of population ecology and demography (e.g., Pie that program flow jumps back to the next value at the top
lou 1977, Caswell 1989), but many details of model con of the loop. Multiplication is indicated by the asterisk (*)
A indicates
struction require decisions about
algorithms
and methods symbol; exponentiation; SQRT indicates the
that are not in treatments. The root.
fully delineated general positive square
methods of individual-based PVA models have been only Function modules defined outside of themain body of
cursorily described in the scientific literature. Below is an the pseudo-code program are labeled in the form FUNC
outline of one widely used PVA software package, VOR TION(), and are specified below the main VORTEX()
TEX, ver. 8.20. The basic approach taken in theVORTEX program. The actual C code is subdivided into many
model is described in Lacy (1993), in Lindenmayer et al. smaller functions; the
pseudo-code shows only the flow of

(2000) and other papers describing applications of VOR the overall program and its
largest
modules. The functions

TEX, and in the software manual (Miller and Lacy 1999). RAND() and NRAND() indicate, respectively, that a ran
Detailed documentation of the program flow and algo dom number is
generated from the uniform 0-1 distribu
rithms is
provided here, so that users ofVORTEX can con tion or from a unit normal distribution.
firm that the model is the analyses that are in comments, sec
performing Explanatory following pseudo-code
and so that PVA practitioners in can see an are are
by //. More
tended, tions, extensive
general preceded explanations
example of the structure of an individual-based PVA mod given
in notes
following
the code.
el. The VORTEX program is available at http:// As an individual-based PVA simulation model, VOR
www2.netcom.com/-rlacy/vortex.html.
TEX represents each individual inmemory, simulates life
The pseudo-code presented below is an English events (such as sex determination,
breeding, mortality, and

language oudine of the program flow and primary algo dispersal) which could occur to each individual, and mon
rithms used by VORTEX (which iswritten in the C pro itors the status of each individual and the population as a
gramming language). This pseudo-code omits coding for: whole. The characteristics tracked for each animal are: sex,

1) input routines for reading parameters from files and/or alive/dead status, population membership, age, inbreeding
keyboard; 2) output routines for writing results to files; 3) coefficient, and two al?eles at each of six loci. In addition,
specification of default parameter values; 4) checks for ille VORTEX maintains a matrix of kinship coefficients be
error handling; 5) memory management and tween all pairs of living animals, as this provides inbreeding
gal values,
initialization of memory; 6) details of C coding to achieve coefficients for any offspring.
algorithms; 7) routines for on-line help; 8) routines for VORTEX models to a as a series of
changes population
graphical display of functions specifying demographic that occur
discrete events once (or other time in
per year
rates, sizes simulations, simulation re terval). The annual of events is:
population during sequence demographic

192 ECOLOGICALBULLETINS48,2000

This content downloaded from 137.219.254.202 on Tue, 17 Mar 2015 05:12:02 UTC
All use subject to JSTOR Terms and Conditions
breeding; mortality; age 1 yr; migrate (disperse) among ronmental variation in demographic rates is imposed by
populations;
harvest
(managed removals); supplementa sampling rates from specified distributions during each
tion (managed additions); carrying capacity truncation; simulated year. Catastrophes, which occur with specified
census 1). Occurrences of events are cause one-year reductions in
(Fig. probabilistic; probabilities, reproduction
from chance variation and survival. Genetic effects are modeled as reduced survi
demographic stochasticity emerges
in which individuals breed, die, and are of each sex. Envi vorship of inbred individuals.

Start End

Read in parameters Calculate and


output mean
census statistics
Set Iteration = 1
Yes

No
Create initial individualsK Iteration > ni ?

i
Set year, t= 1 Increment iteration

Yes
No
Determine annual t> ny?
modifiers for EV

Determine ifcatastrophes occur

Reproduction Increment year, t

Mortality Annual census of:


Demographic status
Genetic variation
Yes
np> 1? Dispersal among
Extinction status

No populations

Harvest of individuals

Supplement with new H N>K? Remove excess individuals


individuals

1. Flow chart of the of the Vortex simulation. Each step from "Create initial individuals"
Fig. primary components through "Annual
census" is applied to each in a modeled t = year; ny = number of years simulated; = number of
population metapopulation. np
ni = number of iterations; N= size; K=
= environmental
populations; population carrying capacity; EV variation.

ECOLOGICALBULLETINS48,2000 193

This content downloaded from 137.219.254.202 on Tue, 17 Mar 2015 05:12:02 UTC
All use subject to JSTOR Terms and Conditions
*
Set GlobalKEV[p] =KEV[p]
VORTEX program pseudo-code EVConcordanceAmongPopulations;
BEGINPROGRAMVORTEX(): Set LocalKEV[p] = SQRT( KEV[p] A2 -
Initialize random number generator; // See Note 1. A2);
GlobalKEV[p]
FOR (each scenario): // Partition EV in carrying capacity (KEV) into the com
READ_SPECIES_PARAMETERS(); ponent that is common to all populations (GlobalKEV)
IF (NumberOfPopulations > 1): and the that is to each
component specific population
READ_MIGRATION_PARAMETERS(); (LocalKEV).
// VORTEX describes dispersal between populations as END (population) LOOP
FOR (each iteration):
"migration."
END IF FOR (each population):
FOR (each population,/*): Create initial individuals, assigning population,
sex, age, alive/dead status, coefficient
READ_POPULATION_PARAMETERS(/>); inbreeding
END (population) LOOP and kinships (initially 0), and al?eles at six loci;
FOR (each population,pSource): FOR (each of five non-neutral loci, I):
II Calculate cumulative rates for each FOR (each founder al?ele, a):
migration pairwise
transition between IIThe probability that a given founder al?ele is a lethal is
populations.
Set CumMigrationProbfpSourceJfl] = NumberLethals / 10, because there are 10 al?eles across the
five diploid loci.
MigrationProbfpSourceJflJ;
FOR (each destination population, pDestination, IF (RANDO <NumberLethals I 10):
Set Lethal[l][a] =TRUE;
greater than 1):
Set CumMigrationProb[pSource][pDestination] // Al?ele, a, of locus, /, is a recessive lethal.
= ELSE:
CumMigrationPwbfpSourceJfpDestination
-1J+MigrationProbfpSourceJ'[pDestination]; Set Lethal[l][a] = FALSE;
END (pDestination) LOOP END IF/ELSE
END {pSource)LOOP END (founder al?ele) LOOP
* END (locus)LOOP
SetNumberLethah = InbreedingGeneticLoad
initial sizes on screen and
ProportionLoadDue ToLethals; Display population
Set LethalEquivalents = InbreedingGeneticLoad* (1 - write to
output files;
END (population) LOOP
ProportionLoadDue ToLethals) ;
II See Note 2. FOR (each year):
FOR (each population,/?): IF (NumberPopulations > 1):
*
Set GlobalBreedEV[p] = BreedEV[p] GLOBAL_EV_RANDS();
// Generate random numbers for environmen
EVConcordanceAmongPopulations; specifying
Set LocalBreedEV[p] = SQRT( BreedEV[p] A2 - tal variation, concordant across
populations, for the year.
END (NumberPopulations) IF
GlobalBreedEV[p] A2);
// Partition Environmental Variation in breeding FOR (each population,/?):
(BreedEV) into the component that is common to all LOCAL_EV_RANDS();
populations (GlobalBreedEV) and the component that is CATASTROPHES^);
// Determine if catastrophes occur that year.
specific to each population. (LocalBreedEV); TotalEVA 2
= GlobalEV* 2 + LocalEVA2 Determine carrying Capacity (K) for year;
II Note: EVs are as standard deviations. // See Note 3.
given *
FOR (each sex, s): Add LocalKEVNRand LocalKEV[p] to
FOR (each age, x, up to age of breeding): CarryingCapacity[p];
Set GlobalMortEV[p][s][x] = IIAdjust K for local EV.
*
MortEV[p][s][x]*
Add GlobalKEVNRand GlobalKEV[p] to
EVConcordanceAmongPopulations; CarryingCapacity[p];
Set LocalMortEV[p][s][x] = IIAdjust K for global EV.
A2-
SQRT(MortEV[p][s][x] BREEDS);
// Go through breeding cycle to produce offspring.
A2);
GlobalMortEV[p][s][x]
// Partition EV in mortality (MortEV) into the compo MORTALITY^);
nent that is common to all populations (GlobalMortEV) // Determine who dies that year.

and the that is to each END (population) LOOP


component specific population
(LocalMortEV). Add 1 to the age of each animal;
END (age)LOOP IF (NumberPopulations > 1):
END (sex)LOOP MIGRATEO;

194 ECOLOGICALBULLETINS48, 2000

This content downloaded from 137.219.254.202 on Tue, 17 Mar 2015 05:12:02 UTC
All use subject to JSTOR Terms and Conditions
// Determine which animals migrate between populations.
IF (population was extinct in prior year):
END IF // Recolonization
FOR (each population,/?): Set YearRecobnized[p] = CurrentYear,
IF (year during which animals are to be Set TimeToRecolonization[p] =
harvested): CurrentYear-
YearExtinct[p];
Increment
HARVEST^);
END (harvest year) IF NumberOfRecolonizations[p];
END (population) LOOP END (was extinct) IF
FOR (each population,/?): Set YearExtinct[p] = 0;
IF (year during which animals are to be // Flag for not extinct
supplemented): END (extinct) IF/ELSE
SUPPLEMENT^); Display PopulationSize[p] on screen graph;
END (supplement year) IF END (population) LOOP
END (population) LOOP FOR (each population,/?):
FOR (each population,/?): CALC_GENETIC_METRICS(?);
Tally PopulationSize[p]; END (population) LOOP
IF (population is not extinct AND END (year)LOOP
population
was not extinct
prior year): END (iteration) LOOP
// "Extinction" can be defined by the user as the absence of // At this point, the simulation is complete and summary
one sex, or as the population size falling below a specified statistics can be calculated.

lower limit. FOR (each population,/?):


=
r[p] \og(PopulationSize[p] I Calculate and report means, SDs, and SEs across

PopulationSizePriorYear[p]) ; iterations for


// Calculate population growth rate ( r ). =
Population growth rate: r[p] ^[CurrentYear]
END IF IN\PreviousYear\
IF (not extinct AND PopulationSize[p], N Time ToExtinction[p]
> Time ToRecolonization[p]
CarryingCapacity[p], K)\
FOR (each living animal): Time ToReextinction[p]
IF(RAND()>?7A0: FOR (each year):
// Stochastically kill excess above K. Calculate and output means, SDs, and SEs
Animal dies; across iterations for:
END IF Probability of extinction, PE[p]
END (each animal) LOOP Il SE = SQR3W* (l-PE) INumberlterations]
END (N>K) IF PopulationSize[p]
Tally PopulationSize[p]-, GeneDiversity[p]
IF (population is extinct): IIGene Diversity =Heterozygosity expected under Hardy
Decrement NumberExtantPopulations[pf, Weinberg equilibrium
IF was not extinct in
(population prior ObservedHeterozygosity[p]
11=1- mean coefficient
year): inbreeding
Set YearExtinct[p] = CurrentYear; NumberAlleles[p]
IF (population has not been LethalFrequency[p]
recolonized): END (year) LOOP
// First extinction END (population) LOOP
Set TimeToExtinction[p] = Calculate and report within-population means of

CurrentYear, above summary statistics;


Increment Call program for displaying graphical displays of
trends in:
NumberOfExtinctions[p];
ELSE: PopulationSize
// Re-extinction of population GeneDiversity
Set TimeToReextinction[p] = Mean inbreeding coefficient (1 -
-
CurrentYear
ObservedHeterozygosity)
YearOfRecolonization[p]; Probability of population persistence to year
END (recolonized) IF/ELSE Probability of extinction in that time interval
END (was not extinct) IF Read inDoAnotherScenario?
ELSE: IF (DoAnotherScenario? is FALSE):
// Not extinct BREAK from scenario LOOP

ECOLOGICALBULLETINS48, 2000 195

This content downloaded from 137.219.254.202 on Tue, 17 Mar 2015 05:12:02 UTC
All use subject to JSTOR Terms and Conditions
END IF Read in Litter size distribution (either as
END (scenario) LOOP MeanLitterSize[p] and SDLitterSize[p] or as the fully
END PROGRAMVORTEX() specified distribution o?ProbLitterSize[p][n]);
FOR (each age, x, up to FemaleBreedingAge ):
BEGIN FUNCTION Read inFemaleMortality[p][x];
READ_SPECIES_PARAMETERS(): Read inFemaleMortalityEV[p][x];
// Get input parameters from keyboard or input file, de END (age)LOOP
scribing
simulation parameters, inbreeding effects, and ba FOR (each age, x, up toMaleBreedingAge ):
sic species life history. Read inMaleMortality[p][x];
Read in Input/Output file names; Read inMaleMortalityEV[p][x];
Read inNumberOflterations; END (age)LOOP
Read inNumberOfYears; FOR (each type of catastrophe, c):
Read inExtinctionDefinition; IF (NumberPopulations > 1):
II Extinction can be defined as no animals of one sex, or as Read in GlobalOrLocal[p][c];
the population size falling below a specified minimum. END IF
Read inNumberOfPopulations; Read in CatastropheFrequency[p][c];
Read in InbreedingGeneticLoad; Read in CatastropheBreedSeverity[p][c];
Read inProportionLoadDueToLethals; Read in CatastropheSurvivalSeverity[p][c];
Read inEVCorwhtionBetweenRepmdux^onAndSurvival?; END (catastrophe) LOOP
IF (NumberOfPopulations > 1):
CALC_DETERMINISTIC_GROWTH(?);
Read inEVConcordanceAmongPoulationsr, // Calculate deterministic population growth rate, genera
END IF tion time, and stable age distribution from mean birth and
Read inNumberTypesOfCatastrophes; death rates. Effects of any catastrophes
are
averaged
across
Read inMonogamous/Polygynous/Hermaphroditic?; years
Read inFemaleBreedingAge; Read inProportionMalesInBreedingPool[p];
Read inMaleBreedingAge, II SeeNote 4.
Read inMaximumAgc, IF (initial numbers of animals are to be distributed
Read in SexRatio at birth; according to the stable age distribution):
Read inMaximumLitterSize; Determine initial numbers of animals in each age
Read inDensityDependentBreeding? sex class;
IIThe pseudocode formodeling density dependent breed // The stable age distribution would rarely assign whole
ing is not given below. numbers to each
age-sex class.
Integral numbers are
END FUNCTIONREAD_SPECIES_PARAMETERS()assigned thatmost closely match the desired distribution.
ELSE (does not start at stable age distribution):
BEGIN FUNCTION FOR (each sex):
READ_MIGRATION_PARAMETERS(): FOR (each age up toMaximumAge):
// Get
input population
structure and migration patterns. Read in initial number of animals;
Read inMigrationAges; END LOOP
Read inMigrationSexes; END LOOP
Read inMigrationSurvival; END (stable age distribution) IF/ELSE
Read inMigrationDensity; Read in Carryincapacity [p] (K);
FOR (each population,pSource): Il K may be specified as a function of year or other
param
FOR(each other population,pDestination): eters. See Note 3.
Read inMigrationProb\pSource] [pDestination]; Read inKEVfpJ;
END LOOP Read inHarvest[p]?;
END LOOP IF (HarvestfpJ?= Yes):
END FUNCTION Read inFirstYearHarvest[p], LastYearHarvest[p],
READ_MIGRATION_PARAMETERS() Harvestlnterval[p];
FOR (each age, x, up to FemaleBreedingAge):
BEGIN FUNCTION II For harvest, all adults are treated in the same
age cat

READ_POPULATION_PARAMETERS(for popula egory.


tion p): Read inNumberFemales7bBeHarvested[p][x];
Read inProportionFemalesBreeding[p]; END LOOP
Read in BreedEV[p]; FOR (each age, x, up toMaleBreedingAge):
II Environmental variation is specified as a standard Read inNumberMalesToBeHarvested[p][x];
deviation. END LOOP

196 ECOLOGICALBULLETINS48, 2000

This content downloaded from 137.219.254.202 on Tue, 17 Mar 2015 05:12:02 UTC
All use subject to JSTOR Terms and Conditions
END IF Add StableAgeClassSize[p][x] to
Read in Supplement[p]?; SumStableAgeClassSize[p];
IF (Supplement^]? =Yes): END LOOP
Read inFirstYearSupplementation[p], // Repeat age distribution calculations for males, but use
female-based Mx and Lambda.
LastYearSupplementation[p],
SupplementationInterval[p]; FOR (each age, x):
FOR (each age, x, up toFemaleBreedingAge): Set male survival, P[x] = 1 -MaleMortality[p][x];
Read inNumberFemalesToBeSupplemented[p][x]; FOR (each type of catastrophe, c):
END LOOP IIAdjust P[x] for catastrophes.
*
FOR (each age, x, up toMaleBreedingAge): Multiply P[x] by CatastropheFrequency[p][c]
Read inNumberMalesToBeSuppkmented[p][x]; + (1 -
CatastropheSurvivalSeverity[p][c]
END LOOP CatastopheFrequency[p][c]) ;
END IF END (catastrophe) LOOP
END FUNCTION Multiply cumulative survivorship, L[x], by P[x];
READ_POPULATION_PARAMETERS() END LOOP
FOR (each age, x):
BEGIN FUNCTION IIDetermine stable age distribution.
*
CALC_DETERMINISTIC_GROWTH(for popula Set StabkAgeClassSize[p][x] = SexRatio L[x] I
A
tion/?): (Lambda x);
// Use standard life table analysis; solve the Euler equation Add StableAgeClassSize[p][x] to
to find the deterministic growth rate.
* - SumStableAgeClassSize[p];
Set fecundity,M =MeanLitterSize[p] (1 SexRatio); END LOOP
II SexRatio is proportion males at birth. FOR (each age, x, and sex, s):
FOR (each type of catastrophe, c): Divide StableAgeClassSize[p][s][x] by
IIAdjust AT for catastrophes. SumStabkAgeClassSize[p];
*
Multiply M by CatastropheFrequency[p][c] END LOOP
+ (1 - END FUNCTION
CatastropheBreedSeverity[p][c]
CatastopheFrequency[p][c]) ; CALC_DETERMINISTIC_GROWTH()
END (catastrophe) LOOP
FOR (each age, x): BEGIN FUNCTIONGLOBAL_EV_RANDS():
Set female survival,P[x] = 1- FemaleMortality[p][x]; FOR (each type of catastrophe):
FOR (each type of catastrophe, c): Set GlobalCatastropheRand = RAND();
IIAdjust P[x] for catastrophes. // Select random number to determine if global catastro
* occur. See Note
Multiply P[x] by CatastropheFrequency[p][c] phe 5.
- END (catastrophe) LOOP
CatastropheSurvivalSeverity[p][c]+ (1
CatastopheFrequency[p][c]) ; Set GlobalBreedEVRand= RAND();
END (catastrophe) LOOP // Select random number for specifying EV in breeding for
Multiply cumulative survivorship, L[x], by P[x]; that year.
IF (x >= FemaleBreedingAge): Set GlobalBreedEVNRand= NRAND();
Add L[x] *Mto SumLxMx; // Select random normal deviate for specifying EV in
* *
Add x L[x] Af to SumAgeLxMx; breeding for year.Whether EVRand or EVNRand will be
END IF used depends on themagnitude of EV. SeeNote 6.
END (age)LOOP Set GlobalBreedEVNRand to same sign as
Set RO = SumLxMx; GlobalBreedEVRand;
Set GenerationTime[p] = SumAgeLxMx I SumLxMx; IF (EVCorrelationBetweenReproductionAndSurvival? =
II estimate No):
Preliminary
Set Lambda = R0A (\lGenerationTime); Set GlobalMortEVRand= RAND();
II Preliminary estimate // Select random 0-1 number for specifying EV mortality
Solve Euler iterative to for that year.
equation by approximation,
yield precise Lambda; Set GlobalMortEVNRand= NRAND();
Set r[p] = \og(Lambda); // Select random normal deviate for specifying EV inmor
Set GenerationTime[p] = log(RO) I r[p]; tality for that year.Whether EVRand or EVNRand w'?l be
FOR (each age, x): used depends on themagnitude of EV.
IIDetermine stable age distribution. Set GlobalMortEVNRand to same sign as
*
Set StableAgeClassSize[p][x] = (1 - SexRatio) L[x] I GlobalMortEVRand;
A Set GlobalKEVNRand= NRAND();
(Lambda x);

ECOLOGICALBULLETINS48, 2000 197

This content downloaded from 137.219.254.202 on Tue, 17 Mar 2015 05:12:02 UTC
All use subject to JSTOR Terms and Conditions
// Select random normal deviate for specifying EV inK for END FUNCTION CATASTROPHES()
year.
ELSE (EV in breeding is correlatedwith EV inmortality): BEGIN FUNCTION BREED(for populationp):
Set GlobalMortEVRand = GlobalBreedEVRand; II Find breeders for the year ...

Set GlobalMortEVNRand = GlobalBreedEVNRand; FOR (each living animal in the population):


Set GlobalKEVNRand = GlobalBreedEVNRand; IF (sex = female AND age >= FemaleBreedingAge):
END (EV correlation) IF/ELSE Add female to breeding pool;
END FUNCTIONGLOBAL_EV_RANDS() END IF
IF (not hermaphroditic):
BEGIN FUNCTION LOCAL_EV_RANDS(): IF (sex =male AND age >=MaleBreedingAge):
Set LocalBreedEVRand = RAND(); IF (RANDO<
// Select random number for specifying EV in breeding for ProportionMalesInBreedingPool[p]):
year. Add male to breeding pool;
Set LocalBreedEVNRand =NRAND(); END IF
// Select a random normal deviate for specifying EV in END IF
breeding. END IF
Set LocalBreedEVNRand to same sign as END (animal) LOOP
LocalBreedEVRand; IF (nomales selected for breeding pool, but adult males
IF (EVCorrelationBetweenReproductionAndSurvival? = do exist):
FALSE): Add one male at random to breeding pool;
Set LocalMortEVRand = RAND(); END IF
// Select random number for specifying EV inmortality. IF (monogamous):
Set LocalMortEVNRand= NRAND(); FOR (eachmale in breeding pool, m):
// Select random normal deviate for specifying EV inmor SetMaleUsed[m] = FALSE;
tality. // Flag to indicate male is available for pairing
Set LocalMortEVNRand to same sign as END LOOP
LocalMortEVRand; END IF
Set LocalKEVNRand= NRAND(); IF (hermaphroditic):
// Select random normal deviate for specifying EV inK. IF (only one breeding female AND
ELSE (EV in breeding is correlatedwith EV inmortality) : =
ProportionSelfing[p] 0):
Set LocalMortEVRand = LocalBreedEVRand; EXITBREEDO;
Set LocalMortEVNRand= LocalBreedEVNRand; END IF
Set LocalKEVNRand = LocalBreedEVNRand; END IF
END (EV correlation) IF/ELSE FOR (each female, Dam, in breeding pool):
END FUNCTION LOCAL_EV_RANDS() Let BreedRand= RAND();
GETBREEDRATEO;
BEGIN FUNCTION CATASTROPHES(for popula // BreedRate is probability of breeding for the female, given
tion p): by the
user either as a constant,
ProportionFemalesBreeding,
FOR (each type of catastrophe, c): or as a function of
population
size and other parameters.
IF (Catastrophe is local in effect): See Note 3.
IF (RAND() < CatastropheFrequency[p][c]): IF (BreedRate = 0):
II See Note 5. CONTINUE LOOP with next breeding female
Set CatastropheFlag[c] =TRUE; END IF
// has occurred. // Find a mate ...
Catastrophe
ELSE: IF (hermaphroditic):
Set CatastropheFlag[c] = FALSE; IF (RANDO<ProportionSelfing[p]):
END (catastrophe) IF/ELSE Let Sire =Dam
ELSE: ELSE
IF (GlobalCatastropheRand < Choose a Sire at random from breeding pool;
: WHILE (Sire isDam):
CatastropheFrequency[p][c])
Set CatastropheFlag[c] = TRUE; Choose a new Sire;
ELSE: ENDWHILE
Set CatastropheFlag[c] = FALSE; END (selfing)IF/ELSE
END (catastrophe) IF/ELSE ELSE (not hermaphroditic):
END (Local/Global catastrophe) IF/ELSE Choose a Sire at random from themale breeding
END (catastrophe) LOOP pool;

198 ECOLOGICALBULLETINS48, 2000

This content downloaded from 137.219.254.202 on Tue, 17 Mar 2015 05:12:02 UTC
All use subject to JSTOR Terms and Conditions
IF (monogamous): END IF/ELSE
WHILE (MaleUsed[Sire]): // Does offspring live?Offspring mortality isplaced here in
Choose a new Sire; the code, rather than in theMORTALITY() function, for
ENDWHILE better
speed and lower memory requirements.
SetMaleUsed[Sire] =TRUE; FOR (each non-neutral locus):
// Flag Sire as unavailable for futureDams IF (homozygous AND al?ele is a lethal):
END IF Offspring dies;
END IF/ELSE END IF
// Find the litter size for that pairing ... END LOOP
IF (MaximumLitterSize > 0): IF (not yet dead):
Set CumulativeProbLitterSize[0] = 1 -BreedRate; GETDEATHRATEO;
FOR each possible litter size, n: Set SurvivalRate = 1 -
DeathRatc,
Set CumulativeProbLitterSize[n] = IF (Inbreeding > 0):
= *
CumulativeProbLitterSize[n -1] Set SurvivalRate
+ * *exp(-0.50
ProbLitterSize[p][n] BreedRate; LethalEquivalents Inbreeding);
END LOOP ENDIF
FOR (each litter size, n, in decreasing order): IF (RANDO > SurvivalRate):
IF (BreedRand> CumulativeProbLitterSize Offspring dies;
fn-lj): ENDIF
Set LitterSize = n; ENDIF
BREAK from Litter Size LOOP IF (not dead):
END IF Calculate kinship to every living animal;
END LOOP // See Ballou (1983) for themethod of calculating inbreed
ELSE: ing and kinship coefficients.
//MaximumLitterSize = 0 is a code for ENDIF
using normal distri
bution of litter sizes. END (offspring) LOOP
Set LitterSize =MeanLitterSize[p] + END (breeding females) LOOP
*
SDLitterSize[p] NRAND(); END FUNCTION BREED()
Set LitterSize =max(0, LitterSize);
*
Set LitterSize =min (2 MeanLitterSize[p], BEGIN FUNCTIONGETBREEDRATE():
LitterSize ); Obtain BreedRate by evaluating fecundity function for
II Truncates symmetrically
to avoid
creating
bias. population and individual parameters;
Set = less than // Most often, the fecundity function will simply return
IntegerLitter Largest integer
LitterSize; ProportionFemalesBreeding entered by the user. VORTEX
= LitterSize - a func
Set Remainder the option, however, of
IntegerLitter; provides making breeding
IF (RANDO < Remainder): tion of PopulationSize, GeneDiversity, Inbreeding, and other
IIRound-off litter size probabilistically. variables. See Note 3.
Set LitterSize = IntegerLitter + 1; AD]USTRAIE(BreedRate, LocalBreedEV[p],
ELSE: LocalBreedEVRand, LocalBreedEVNRand) ;
Set LitterSize = IIAdjust rate for local EV.
IntegerLitter;
END IF/ELSE AD]USTRKTE(BreedRate, GlobalBreedEV[p],
END IF/ELSE GlobalBreedEVRand, GlobalBreedEVNRand);
// Create the
offspring
... IIAdjust rate for global EV
Set Inbreeding = Kinship between Sire and Dam; FOR (each type of catastrophe, c):
FOR (Offspring from 1 to LitterSize): IF (CatastropheFlag[c] =TRUE):
Assign ID, age (= 0), population, alive (=TRUE); Multiply BreedRate by
FOR (each of six loci): CatastropheBreedSeverity[p][c],
// First locus is neutral, others can have lethals. ENDIF
Pick at random an al?ele from Dam; END LOOP
Pick at random an al?ele from Sire; END FUNCTIONGETBREEDRATE()
END LOOP
IF(not hermaphroditic AND RAND() < BEGIN FUNCTION MORTALITY(for populationp):
SexRatio): FOR (each living animal in the population):
Assign
sex as male; IF (age > 0):
ELSE: // Infant mortality occurs within the BREED () function,
sex as female; not here.
Assign

ECOLOGICALBULLETINS48, 2000 199

This content downloaded from 137.219.254.202 on Tue, 17 Mar 2015 05:12:02 UTC
All use subject to JSTOR Terms and Conditions
IF (atmaximum age): Set LowerLimit = Rate - (1 -Rate);
Animal dies; ELSE:
*
ELSE: Set UpperLimit = 2 Rate;
GETDEATHRATEO; Set LowerLimit = 0;
IF (RANDO <DeathRate): END IF/ELSE
Animal dies; Add EV EVNRand to Rate;
ENDIF Let Rate =
max(LowerLimit, Rate);
END IF/ELSE Let Rate =mm(UpperLimit, Rate);
END (age > 0) IF END IF/ELSE
END (animal) LOOP END FUNCTIONADJUSTRATE();
END FUNCTIONMORTALITY()
BEGIN FUNCTIONMIGRATE():
BEGIN FUNCTIONGETDEATHRATEO: FOR (each living animal):
Obtain DeathRate by evaluating mortality function for IF (not in age range thatmigrates):
population and individual parameters; CONTINUE LOOP with next animal;
//Most often, themortality function will simply return the ENDIF
mortality
rate entered
by the user for the age and sex of the IF (not a sex thatmigrates):
current animal. VORTEX
provides the option, however, CONTINUE LOOP with next animal;
of making mortality a function of PopulationSize, ENDIF
and other variables. SetMigrationRand =
GeneDiversity, Inbreeding, RAND();
AD]USTRATE(DeathRate, Set to of current
LocalMortEV[p] pSource population animal;
LocalMortEVRand, LocalMortEVNRand); IF MigrationRand
( >
CumulativeMigrationProb
IIAdjust rate for local EV. [pSource][NumberPopulations] ):
AD]USTRATE(DeathRate, GlobalMortEV[p], CONTINUE LOOP with next animal;
GlobalMortEVRand, GlobalMortEVNRand); // Does not migrate
11Adjust rate for global EV. ENDIF
FOR (each type of catastrophe, c): Obtain MigrationDensity by evaluating function, or
IF (CatastropheFlag[c] = TRUE): using specified
constant parameter;
Let DeathRate = 1 - // See Note 3.
*
(CatastropheSurvivalSeverity[p][c] IF (PopulationSize[pSource] I CarryingCapacity
- <
(1 DeathRate)); [pSource] MigrationDensity ):
ENDIF CONTINUE LOOP with next animal;
END LOOP ENDIF
END FUNCTIONGETDEATHRATEO Obtain MigrationSurvival by evaluating function, or
constant
using specified parameter;
BEGIN FUNCTION ADJUSTRATE(i^^, EV, EVRand, // See Note 3.
EVNRand); // Find to which the animal ...
population migrates
Determine binomial parameter n formodeling EV; FOR
(up
to 10
attempts to enter another
// SeeNote 6. population):
l?(n<26): // The limit of 10 attempts is imposed to prevent an infi
II Find the adjusted Rate from binomial EV nite
loop
from
occurring when all
populations
are at carry
FOR (each BinomialOutcome 0 through n): ing capacity.
Add BinomialOutcome I n to BinomialProportion; IF (RAND() >MigrationSurvival):
Calculate BinomialProbability for Animal dies;
BinomialProportion; BREAK from LOOP, CONTINUE with
Add BinomialProbability to CumulativeBinomial; next animal;
IF (EVRand< CumulativeBinomial): ENDIF
Set Rate = BinomialProportion; FOR (each population,pDestination):
BREAK from LOOP IF MigrationRand
( <
CumulativeMigrationProb
ENDIF [pSource][pDestination]):
END LOOP BREAK from LOOP;
ELSE: // Animal will try tomigrate topDestination
//Use Normal distribution for EV, and truncate symmetri ENDIF
cally
to avoid bias. END LOOP
IFC&^>0.5): IF (PopulationpDestination at carrying capacity):
Set UpperLimit= 1; IF (tried9 timesbefore to find an open population) :

200 ECOLOGICALBULLETINS48, 2000

This content downloaded from 137.219.254.202 on Tue, 17 Mar 2015 05:12:02 UTC
All use subject to JSTOR Terms and Conditions
Animal dies; END IF/ELSE
// Never found an
open population
into which to
migrate.
END LOOP
BREAK from LOOP, CONTINUE with Adjust tallies of population size;
next animal; END FUNCTIONHARVEST()
ENDIF
IF (CumulativeMigrationProb[pDestination] BEGIN FUNCTION SUPPLEMENT(for population/*):
= FOR (each age, x, up toMaleBreedingAge):
[NumberPopulations] 0):
Animal dies; WHILE (number males created <
// Cannot from :
migrate away pDestination. NumberMalesToBeSupplemented[p][x])
BREAK from LOOP, CONTINUE with Create a male,
assigning ID, age, sex, al?eles,
next animal; population;
ENDIF Set kinships to all other animals = 0;
SetMigrationRand =
RAND(); Set Inbreeding = 0;
Set
pSource
=
pDestination;
ENDWHILE
IIMoves on from population pDestination, old pDestination END LOOP
becomes current
pSource.
FOR (each age, x, up to FemaleBreedingAge):
WHILE (MigrationRand
> WHILE (number females created <
CumulativeMigrationProb[pSource] NumberFemales ToBeSupplemented[p][x]) :
: Create a female, ID, sex, al?eles,
[NumberPopulations]) assigning age,
SetMigrationRand= RAND(); population;
// Must migrate somewhere, so draw a new random Set kinships to all other animals = 0;
number. Set Inbreeding = 0;
ENDWHILE ENDWHILE
ENDIF END LOOP
END LOOP END FUNCTION SUPPLEMENT)
animal's to
Change population pDestination;
Adjust tallies of population sizes; BEGIN FUNCTION CALC_GENETIC_METRICS(for
// Increment size o? decrement size o? pSource.
pDestination, population/?):
END animal LOOP FOR (each living animal in the population):
END FUNCTIONMIGRATE() Increment NumberAlleleCopies[a] for each of the
two al?eles, a, at a neutral locus;
BEGIN FUNCTION HARVEST(for population/?): IF (al?ele 1 is same as al?ele 2):
FOR (each age, x): Increment
NumberHomozygotes;
IIHARVESTO lumps all animal above breeding age as a ENDIF
single
class. END LOOP
IF (NumberMales[p][x] <= FOR (each al?ele, a, of the neutral locus):
NumberMaks ToBeHarvested[p][x]) : IF (NumberAlleleCopies[a] > 0 ):
All males age x die; Increment NumberExtantAlleles;
*
ELSE Add 0.25 (NumberAIleleCopies[a]I
*
WHILE (number harvested < PopulationSize[p]) (NumberAlleleCopies[a]
NumberMales ToBeHarvested[p][x]) : IPopulationSize[p]) toExpectedHomozygosity[p];
Choose at random a
living
male in age class x\ ENDIF
Male dies; END LOOP
ENDWHILE Set GeneDiversity[p] = 1 - ExpectedHomozygosity[p];
END IF/ELSE Set ObservedHeterozygosity[p]= 1 - (NumberHomozygotes I
END LOOP PopulationSize[p]) ;
FOR (each age, x): FOR (each living animal in the population):
IF (NumberFemales[p][x] <= FOR (each non-neutral locus):
NumberFemales ToBeHarvested[p][x]) : IF (al?ele 1 at the locus is a lethal):
All females age x die; Increment NumberLethals;
ELSE ENDIF
WHILE (number harvested < IF (al?ele2 at the locus is a lethal):
from age class):
NumberFemalesToBeHarvested[p][x] Increment NumberLethals;
Choose at random a
living
female in age class xr, ENDIF
Female dies; END locus LOOP
ENDWHILE END animal LOOP

ECOLOGICALBULLETINS48, 2000 201

This content downloaded from 137.219.254.202 on Tue, 17 Mar 2015 05:12:02 UTC
All use subject to JSTOR Terms and Conditions
Set LethalFrequency[p] =NumberLethals I then calculated by solving the following equations for the
unknowns:
PopulationSizefp]; *
END FUNCTION CALC_GENETIC_METRICS() LittersPerMale =
ProportionFemalesProducingLitters
(NumberAdultFemaks I
Note 1 :Random integers from 0 to 64K are generated by NumberAdultMales) [Note: Adult sex ratio is deter
the algorithm given by Kirkpatrick and S toll (1981). The mined from stable age distribution.]
*
C code was modified from Maier (1991). Random real LittersPerMale = ProportionMalesInBreedingPool Lit
numbers between 0 and 1 are produced by first generating tersPerMalelnBreedingPool
a random integer between 0 and 64K, and then dividing =
ProportionMalesBreeding ProportionMalesInBreeding
that integer by 64K. Random numbers from a normal dis Pool* (1 - exp(-LittersPerMaleInBreedingPool))
tribution, with mean = 0 and SD = 1 are generated by the This last equation adjusts for the fact that in any given
polar algorithm supplied by Latour (1986). Binomially year some males in the breeding pool will not happen to be
distributed numbers are generated by first calculating the successful breeders (the zero class of the Poisson distribu
cumulative distribution for the discrete out tion).
probability
comes of the desired distribution, then a ran
generating
dom real number, and then
assessing
which binomial out Note 5: The occurrence of probabilistic events is deter
come covers the portion of the distribution mined a random number The event is
encompassing by generator.
the random real number. deemed to occur if a random number between 0 and 1 is
less than the probability of occurrence for that event.
Note 2: VORTEX asks for the effects of inbreeding to be
entered as a number of "lethal equivalents" per diploid ani Note 6: Environmental variation (EV) in breeding and in
mal, with further specification of what proportion of this each mortality rate ismodeled as a binomial distribution
genetic load isdue to recessive lethal al?eles vs other genetic
or as a normal distribution, on whether the
depending
effects (such as overdominance). Recessive lethal al?eles are
magnitude of EV is large.The user specifies amean and
modeled such that the death of animals homozygous for standard deviation for each rate.The binomial distribution
lethal al?eleswill reduce the frequency of the lethals and that has a standard deviation closest to the desired EV is

thereby reduce the average effects of future inbreeding.


determined by solving the equation for the binomial vari
*
The proportion of inbreeding depression not due to lethal ance, V-p (1 -p) I n, for the parameter n when
given the
al?eles ismodeled as an impact on fitness that follows a mean, /?, and variance, V - SLP-. The parameter
n is then

(Morton et al. 1956), and is rounded to the nearest whole number. If n < 26, the bino
negative exponential equation
not reduced during generations of inbreeding. mial distribution with parameters /? and n is used for EV.
Because of the to the dis
rounding step necessary produce
Note 3: For rates which can be specified as functions of crete binomial distribution, this distribution will often
age, sex, inbreeding, population size, gene diversity, year, have a slighdy different variance than that entered by the
the rate to be used is determined user. \in > 25, the normal distribution with and
and population, by evalu mean/?
function user. If the user enters a variance Kwill be used to model EV. In such cases, the
ating the specified by the
fixed constant for the rate, as is usually the case, then the normal distribution very closely approximates the bino
function simply
returns that constant. However, the user mial distribution.
can
specify
a mathematical formula that defines a demo The binomial distribution is restricted to the interval 0
graphic
rate as
being density-dependent,
or a function of to 1, and it fits well the distribution of demographic rates
other For across years observed in some natural
population parameters. example, fecundity populations (e.g.,
could be specified to decline in older age classes, adult Lacy 1993). The PVA program INMAT (Mills and
mortality could be specified to increasewith inbreeding, or Smouse 1994) uses the related beta distribution for this
habitat (carrying capacity) could be specified to decrease purpose, and it too is restricted to the
biologically
mean
over time. The
algorithms
for
parsing
and
evaluating
user
ingful 0 to 1 interval. In contrast, the normal distribution
defined rate functions (e.g., the first step of functions extends infinitely in both directions, although the tails be
GETBREEDRATEO and GETDEATHRATEO) are not yond 0 and 1 are typically very small in those cases for
given
in the
pseudo-code.
which VORTEX uses a normal distribution tomodel EV
For example, if/? = 0.5 and SD = 0.1 (so that the binomial
=
Note 4: The proportion of males in the breeding pool can parameter n 25, the limiting case for VORTEX to use
be entered direcdy, or indirectly in the form of the propor the normal approximation),
then the area of the normal
tion of males that breed or as the
average number of litters distribution outside of the 0-1 range is < 0.000001. When
per breeding male. If the proportion in the breeding pool is modelling EV as a normal distribution, the distribution
assume that the distribu must be truncated at 0 and 1.To avoid creating any bias in
given indirectly, VORTEX will
tion of male success follows a Poisson distri the mean rate as a result of this truncation,
reproductive demographic
bution. The proportion of males in the breeding pool is VORTEX always truncates the distribution symmetrically.

202 ECOLOGICALBULLETINS48, 2000

This content downloaded from 137.219.254.202 on Tue, 17 Mar 2015 05:12:02 UTC
All use subject to JSTOR Terms and Conditions
if the mean is p = truncates S. and Stoll, E. 1981. A very fast shift-register se
For
example, 0.3, VORTEX Kirkpatrick,
-
the distribution at 0.0 and 0.6. This truncation will cause quence random number generator. J. Comp. Phys. 40:
517.
the SD of the distribution to be very slightly less than that
user. Lacy, R. C. 1993. VORTEX: A computer simulation model for
entered by the - Res. 20: 45-65.
population viability analysis. Wildl.
Some PVA models use continuous distributions such -
Latour, A. 1986. Polar normal distribution. Byte, August 1986:
as the normal or normal to represent EV even when
log 131-132.
EV is In such cases, the necessary truncations can a
large. Lindenmayer, D. B., Lacy, R. C. and Pope, M. L. 2000. Testing
cause EV to be substantially less than intended by the simulation model for population
-
Ecol.
viability analysis.
user. Moreover, if the truncation is not then 10: 580-597.
symmetric, Appl.
can -
the mean rate
by the model Maier, W. L. 1991. A fast pseudo random number generator.
demographic generated
be biased from the input Dr. Dobb s Journal, 1991: 152-157.
strongly away parameter. May
Miller, P. S. and Lacy, R. C. 1999. VORTEX Ver. 8 users manual.
-
A stochastic simulation of the simulation process. IUCN/
SSC Conservation Breeding Specialist Group, Apple Valley,
References Minnesota.
Mills, L. S. and Smouse, P. E. 1994. Demographic consequences
Ballou, J. D.
1983. Calculating inbreeding coefficients from ped
of inbreeding in remnant
- populations. -Am. Nat. 144:412?
In: Schonewald-Cox, C. M. et al. (eds), Genetics
igrees. 431.
and conservation: a reference for wild animal and
managing N. E., Crow, J. F. and M?ller, H. J. 1956. An estimate of
Morton,
Menlo Park, Cali
plant populations. Benjamin/Cummings, the mutational inman from data on consanguineous
fornia, pp. 509-520. damage
-
Proc. Nat. Acad. Sei. USA 42: 855-863.
H. R. 1993. Risk marriages.
Burgman, M. A., Ferson, S. and Ak?akaya, -
- Pielou, E. C. 1977. Mathematical ecology. Wiley.
assessment in conservation and Hall.
biology. Chapman
Starfield, A. M. and Bleloch, A. L. 1986. Building models for
Caswell, H. 1989. Matrix population models: construction, anal -
- conservation and wildlife management. MacMillan.
ysis and interpretation. Sinauer.
in theo
Caughley, G. and Gunn, A. 1996. Conservation biology
-
ry and practice. Blackwell.

ECOLOGICALBULLETINS48, 2000 203

This content downloaded from 137.219.254.202 on Tue, 17 Mar 2015 05:12:02 UTC
All use subject to JSTOR Terms and Conditions

Das könnte Ihnen auch gefallen