# [R] Elasticity in Leslie Matrix

Chris Stubben stubben at lanl.gov
Mon Oct 29 17:24:48 CET 2007

```Sorry, I didn't think carefully about your question on my first reply, so

Chapter 9 in Morris and Doak (2002) cover vital rate elasticities and
sensitivities (see Box 9.1 for Matlab code
http://www.sinauer.com/PVA/vitalsens.m).   Simon, thanks for posting your
code, I will add a function called vitalsens to the next release of the
popbio package and output both sensitivities and elasiticities.

Here's the example for the emperor goose vital rates in chapter 9.

vl<-list(  Ss0=0.1357,  Ss1=0.8926,  Sf2=0.6388,  Sf3= 0.8943)

el<-expression(
0,  0,  Sf2*Ss1,Sf3*Ss1,
Ss0,0,  0,      0,
0,  Ss1,0,      0,
0,  0,  Ss1,    Ss1)

## and the matching elasticities in table 9.1

elas.var(el, vl)

\$Ss0
 0.0797

\$Ss1
 0.92

\$Sf2
 0.00569

\$Sf3
 0.074

Also, the expression el should be formatted so this command returns the
projection matrix.

matrix(sapply(el, eval, vl), nrow=4, byrow=TRUE)

Thanks,

Chris

Simon Blomberg-4 wrote:
>
> After a short exchange with the original questioner, I wrote the following
> function to calculate the elasticities of lower level variables in
> population transition matrices (Leslie matrices etc.) Perhaps it will be
> of use to others. There is no error-checking, so use with care. Users
> should consult Caswell (2001) for reference.
>
> Cheers,
>
> Simon.
>
> # example values to construct leslie matrix
>
> vl <- list(f1=1, f2=4, s0=.6, s=.4, v=.9, sigma=.5)
>
> # Expressions for each matrix element
> F1 <- expression(sigma*s0*f1)
> F2 <- expression(sigma*s0*f2)
> S <- expression(s)
> V <- expression(v)
> el <- c(F1, F2, S, V)
>
> elas.var <- function (elements, varlist) {
>   # elements should be a vector of expressions corresponding to the
> elements
>   # of the leslie matrix, in terms of the variables in varlist
>
>   require(demogR)
>   res <- vector("list", length(varlist))
>   deriv.funcs <- sapply(elements, deriv, namevec=names(varlist),
> function.arg=TRUE)
>   devs <- lapply(deriv.funcs, function (x) do.call(x, varlist))
>   leslie.mat <-  matrix(as.numeric(devs), nrow=sqrt(length(elements)),
> byrow=TRUE)
>   eig <- eigen.analysis(leslie.mat)
>
>   for (i in 1:length(varlist)) {
>     derivs <- matrix( as.numeric(lapply(devs, function (x)
> x at gradient[i])), nrow=sqrt(length(elements)), byrow=TRUE)
>     res[[i]] <- varlist[[i]]/eig\$lambda1*sum(derivs*eig\$sensitivities)
>     names(res)[i] <- names(varlist)[i]
>   }
>   res
> }
>
> # example output
>
>> elas.var(el, vl)
> \$f1
>  0.06671376
>
> \$f2
>  0.2346064
>
> \$s0
>  0.3013201
>
> \$s
>  0.2346064
>
> \$v
>  0.4640735
>
> \$sigma
>  0.3013201
>
>
> Simon Blomberg, BSc (Hons), PhD, MAppStat.
> Lecturer and Consultant Statistician
> Faculty of Biological and Chemical Sciences
> The University of Queensland
> St. Lucia Queensland 4072
> Australia
> T: +61 7 3365 2506
> email: S.Blomberg1_at_uq.edu.au
>
> Policies:
> 1.  I will NOT analyse your data for you.
>
> The combination of some data and an aching desire for
> be extracted from a given body of data. - John Tukey.
>
>
>
>
>
>
>
>
>
>
> 	[[alternative HTML version deleted]]
>
> ______________________________________________
> R-help at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help