Beruflich Dokumente
Kultur Dokumente
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
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
"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
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
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
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
No
Create initial individualsK Iteration > ni ?
i
Set year, t= 1 Increment iteration
Yes
No
Determine annual t> ny?
modifiers for EV
No populations
Harvest of 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.
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.
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
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);
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 ...
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
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) :
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
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
(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.
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.
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