Dear R-users,
I would like to calculate elasticities and sensitivities of each parameters
involved in the following transition matrix:
A <- matrix(c(
sigma*s0*f1, sigma*s0*f2,
s, v
), nrow=2, byrow=TRUE,dimnames=list(stage,stage))
The command "eigen.analysis" avaliable in package "popbio"
provides
sensibility matrix and elasticity matrix (same dimension than A). I would
like to know if there is a way to calculate separetely the elasticity of
sigma, s0, f1, f2, s and v ?
Thanks and regards,
privalan
--
View this message in context:
http://www.nabble.com/Elasticity-in-Leslie-Matrix-tf4670533.html#a13342271
Sent from the R help mailing list archive at Nabble.com.
> I would like to calculate elasticities and sensitivities of each parameters > involved in the following transition matrix: > > A <- matrix(c( > sigma*s0*f1, sigma*s0*f2, > s, v > ), nrow=2, byrow=TRUE,dimnames=list(stage,stage)) > > The command "eigen.analysis" avaliable in package "popbio" provides > sensibility matrix and elasticity matrix (same dimension than A). I would > like to know if there is a way to calculate separetely the elasticity of > sigma, s0, f1, f2, s and v ? >If you want the eigenvalue second derivatives, check the secder and fullsecder functions in the demogR package (also elassens for partial derivatives of the eigenvalue elasticities). A description of that package is also found in the recent special issue of Ecology in R in Journal of Statistical Software. Chris
On Mon, 2007-10-22 at 06:24 -0700, privalan wrote:> Dear R-users, > > I would like to calculate elasticities and sensitivities of each parameters > involved in the following transition matrix: > > A <- matrix(c( > sigma*s0*f1, sigma*s0*f2, > s, v > ), nrow=2, byrow=TRUE,dimnames=list(stage,stage)) > > > The command "eigen.analysis" avaliable in package "popbio" provides > sensibility matrix and elasticity matrix (same dimension than A). I would > like to know if there is a way to calculate separetely the elasticity of > sigma, s0, f1, f2, s and v ?You should first calculate the matrix element sensitivities, then calculate the derivatives of the elements of your matrix with respect to the parameter of interest. Then for each element in the matrix, the sensitivity of the parameter is just the product of the derivative and the appropriate element sensitivity, by the chain rule. Then add up all the sensitivities, multiply by your parameter and divide by lambda. ie plot(1:10, 1:10, type="n") text(5,6, expression(e[s[0]] == over(s[0], lambda)~sum(~over(paste(partialdiff,~lambda),paste(partialdiff,~a[ij])) %.% over(paste(partialdiff, ~a[ij]), paste(partialdiff, ~s[0])), ij)), cex=2) Be aware that these elasticities will in general not sum to unity, and cannot be interpreted as "contributions" to lambda. See Caswell (2001), page 232. Cheers, Simon.> > Thanks and regards, > > privalan-- 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 Room 320 Goddard Building (8) T: +61 7 3365 2506 email: S.Blomberg1_at_uq.edu.au Policies: 1. I will NOT analyse your data for you. 2. Your deadline is your problem. The combination of some data and an aching desire for an answer does not ensure that a reasonable answer can be extracted from a given body of data. - John Tukey.
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@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
[1] 0.06671376
$f2
[1] 0.2346064
$s0
[1] 0.3013201
$s
[1] 0.2346064
$v
[1] 0.4640735
$sigma
[1] 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.
2. Your deadline is your problem.
The combination of some data and an aching desire for
an answer does not ensure that a reasonable answer can
be extracted from a given body of data. - John Tukey.
[[alternative HTML version deleted]]