12 Life Table Response Experiments

12.1 Background

A Life Table Response Experiment (LTRE), in matrix population modelling, is a technique used to analyse how differences in demographic parameters between two or more populations or “treatments” contribute to the observed difference in their population growth rate (\(\lambda\)). It answers the question: why do these populations have different growth rates? Which of the differences in survival, growth or fertility account for most of the difference in \(\lambda\)?

The method compares matrix models of the populations in question and decomposes the difference in growth rate between the models into contributions from the individual matrix elements. Each contribution is (roughly) the difference in that element multiplied by how sensitive \(\lambda\) is to that element.

LTRE is a retrospective analysis (Caswell’s terminology): it looks back at differences that have already happened, and explains an observed difference in \(\lambda\). Sensitivity and elasticity analysis, and in silico experiments like those in “Matrix population modelling”, are prospective: they ask what would happen to \(\lambda\) if we changed a vital rate in the future. The two kinds of question need different tools, and we come back to this distinction at the end of the chapter.

The background reading is the chapter Growth of Age-Structured and Stage-Structured Populations in Neal. Sensitivity was introduced in the lecture; we compute it below.

12.2 Learning outcomes

Learning outcomes:

  • Explain the purpose of an LTRE, and the difference between a retrospective analysis (LTRE) and a prospective one (sensitivity, elasticity, in silico experiments).
  • Calculate the sensitivity of \(\lambda\) to each matrix element, and the LTRE contribution of each element as (difference in element) × (sensitivity at the midpoint matrix).
  • Check that the contributions add up (approximately) to the observed difference in \(\lambda\), and explain why the match is not exact.
  • Interpret LTRE output biologically, including the sign of each contribution.

12.3 Set up

For the core LTRE analysis you need popbio (for the LTRE function) and popdemo (for the eigs function used to compare growth rates). If you have not installed them already, do so now.

install.packages(c("popbio", "popdemo"))
library(popbio)
library(popdemo)

12.4 A worked example

In this example, we consider a two-stage matrix model to analyse, say, squirrel populations in two different geographic locations. The life cycle has juveniles (J) and adults (A). Each year, a juvenile can survive and stay a juvenile, or survive and mature into an adult; an adult can survive (and stay adult) and also produces juveniles (the fertility: juveniles counted at the next census per adult).

The reference population, from Location A, lives in an area with favourable environmental conditions. The treatment population, from Location B, experiences worse conditions in spring. This particularly affects juveniles, which are much less likely to survive and mature, and adults produce fewer young (mothers in poor condition produce fewer young). Adult survival, on the other hand, is a little higher at Location B.

Matrix element Meaning Reference (Location A) Treatment (Location B)
\(a_{11}\) (top left) Juvenile survives and stays juvenile 0.1 0.1
\(a_{21}\) (bottom left) Juvenile survives and matures to adult 0.5 0.2
\(a_{12}\) (top right) Fertility: juveniles produced per adult 2.3 1.3
\(a_{22}\) (bottom right) Adult survives 0.6 0.7

The two matrices can be created in R as follows. Compare the values in the matrices with the values in the life cycle diagrams below.

A_ref <- matrix(c(0.1,2.3,
                  0.5,0.6), nrow = 2, ncol = 2, byrow = TRUE)

A_treat <- matrix(c(0.1,1.3,
                    0.2,0.7), nrow = 2, ncol = 2, byrow = TRUE)
Life cycle diagrams for the reference population (Location A, left) and the treatment population (Location B, right). J = juvenile, A = adult. Arrows show survival and maturation probabilities, and the fertility (arrow from A to J).

Figure 12.1: Life cycle diagrams for the reference population (Location A, left) and the treatment population (Location B, right). J = juvenile, A = adult. Arrows show survival and maturation probabilities, and the fertility (arrow from A to J).

12.4.1 Comparing matrices

Before we dig into the formal LTRE, it is useful to compare the two matrices, A_ref and A_treat, to see how they are different from each other.

We can check what overall difference there is between the matrices in a couple of ways.

Firstly, we can examine the differences in the individual transition rates between the matrices by subtracting one from the other.

A_ref - A_treat
##      [,1] [,2]
## [1,]  0.0  1.0
## [2,]  0.3 -0.1

Next, we can ask what impact these differences have on the population growth rate (lambda). Note that putting the command in parentheses tells R to both create the new object (e.g. lambda_A_ref) and print the result to the screen.

(lambda_A_ref <- popdemo::eigs(A_ref, what = "lambda"))
## [1] 1.451136
(lambda_A_treat <- popdemo::eigs(A_treat, what = "lambda"))
## [1] 0.991608

The reference population is growing (\(\lambda > 1\)), whereas \(\lambda\) for the treatment population is just below 1, so the Location B population is slowly declining.

We could express this as a difference, or as a proportional difference.

The difference in growth rates between the matrices is 0.46.

(lambdaDiff <- lambda_A_ref - lambda_A_treat)
## [1] 0.4595278

This is a 32% reduction, compared to the reference matrix.

(lambdaDiff/lambda_A_ref) * 100
## [1] 31.66677

So far, so good. We can see that \(\lambda\) is lower at Location B, but we don’t know exactly why. There are 3 changes in the matrix. Which of these changes is most instrumental in driving the change in the population growth rate?

12.4.2 Sensitivity: how much does \(\lambda\) change when one element changes?

To answer this, we need to know how strongly \(\lambda\) responds to each matrix element. This is the sensitivity of \(\lambda\) to element \(a_{ij}\), written \(s_{ij}\): the change in \(\lambda\) for a small absolute change in \(a_{ij}\) (the slope of \(\lambda\) against \(a_{ij}\)). Elasticity, which you met in “Matrix population modelling”, is the proportional version of the same idea.

Sensitivities can be calculated from two eigenvectors of the matrix: the stable stage distribution \(\mathbf{w}\) (the right eigenvector) and the reproductive values \(\mathbf{v}\) (the left eigenvector, which is the right eigenvector of the transposed matrix). The formula is

\[ s_{ij} = \frac{v_i \, w_j}{\sum_k v_k w_k}. \]

So \(\lambda\) is most sensitive to transitions into stages with high reproductive value (\(v_i\)) from stages that are common in the stable stage distribution (\(w_j\)). In base R:

sensitivity <- function(M) {
  # Right eigenvector: stable stage distribution w
  eig_right <- eigen(M)
  w <- Re(eig_right$vectors[, which.max(Re(eig_right$values))])
  # Left eigenvector: reproductive values v (eigenvector of the transposed matrix)
  eig_left <- eigen(t(M))
  v <- Re(eig_left$vectors[, which.max(Re(eig_left$values))])
  # s_ij = v_i * w_j / sum(v * w)
  outer(v, w) / sum(v * w)
}

sensitivity(A_ref)
##           [,1]      [,2]
## [1,] 0.3864808 0.2270383
## [2,] 1.0443762 0.6135192

(The popbio package has a function sensitivity() that does the same thing; here you can see what it does.)

12.4.3 Contributions from individual matrix elements

The LTRE splits the observed difference in \(\lambda\) into one contribution per matrix element. The contribution of element \(a_{ij}\) is

\[ c_{ij} = \left(a_{ij}^{\mathrm{treat}} - a_{ij}^{\mathrm{ref}}\right) \times s_{ij}\left(\mathbf{A}_{\mathrm{mid}}\right), \qquad \mathbf{A}_{\mathrm{mid}} = \frac{\mathbf{A}_{\mathrm{ref}} + \mathbf{A}_{\mathrm{treat}}}{2}, \]

that is, how much the element differs, multiplied by how much \(\lambda\) responds to that element. The sensitivity is calculated from the matrix halfway between the two populations (the midpoint matrix), because the sensitivities of the two populations are not the same, and the midpoint is a fair compromise. A large contribution can come from a large difference in an element, from a high sensitivity, or from both.

We can calculate the contributions by hand:

A_mid <- (A_ref + A_treat) / 2
(contributions <- (A_treat - A_ref) * sensitivity(A_mid))
##            [,1]        [,2]
## [1,]  0.0000000 -0.20832964
## [2,] -0.3214229  0.06636876

The LTRE function in the popbio package does exactly this calculation. Note the order of the arguments: treatment first, then reference.

popbio::LTRE(A_treat, A_ref)
##            [,1]        [,2]
## [1,]  0.0000000 -0.20832964
## [2,] -0.3214229  0.06636876

The contributions should add up to the observed difference in \(\lambda\) (treatment minus reference):

sum(popbio::LTRE(A_treat, A_ref))
## [1] -0.4633838
lambda_A_treat - lambda_A_ref
## [1] -0.4595278

The two numbers are very close, but not identical (-0.463 vs -0.460). The LTRE treats \(\lambda\) as if it changed in a straight line with each element, with a slope equal to the sensitivity at the midpoint matrix. In reality the sensitivities change as the elements change, so this linear approximation is only approximately right. It is very good when the differences between the matrices are small, and gets worse when they are large.

12.4.4 Interpreting the contributions

Contributions are in the same units as \(\lambda\). A negative contribution means that difference in the element lowers \(\lambda\) in the treatment population relative to the reference; a positive contribution means it raises \(\lambda\).

Here, the juvenile stasis element contributes nothing, because it is the same (0.1) in both populations. The other three differences all contribute:

  • The lower probability of juveniles maturing into adults (0.5 → 0.2, bottom left) makes the largest contribution (-0.321). The difference is only 0.3, but \(\lambda\) is very sensitive to this element.
  • The lower fertility (2.3 → 1.3, top right) contributes -0.208. The difference in the element is much larger (1.0), but \(\lambda\) is much less sensitive to it.
  • The slightly higher adult survival at Location B (0.6 → 0.7, bottom right) makes a small positive contribution (0.066), which partly offsets the other two.

So the main reason the Location B population has a lower growth rate (and is declining) is that fewer juveniles survive and mature into adults; the reduced fertility is the second most important reason.

12.5 Retrospective vs prospective analyses

It is tempting to read an LTRE as a management recommendation (“juvenile maturation made the largest contribution, so managers should improve juvenile maturation”). That is not what an LTRE tells you. Following Caswell, it helps to separate two kinds of question:

  • Retrospective (LTRE): Why do these observed populations differ in \(\lambda\)? The LTRE takes differences in vital rates that have already happened and shares out the observed difference in \(\lambda\) among them. A contribution is large if the element did differ a lot, if \(\lambda\) is sensitive to it, or both.
  • Prospective (sensitivity, elasticity, in silico experiments): What would happen to \(\lambda\) if we changed a vital rate? These analyses do not depend on how much the rates have varied in the past. They are the tools for exploring management options, together with knowledge of which rates can actually be changed, and by how much.

The answers can differ. A vital rate can make a large LTRE contribution simply because it happened to vary a lot between places (for example because of weather), even if managers cannot change it. And a vital rate with a high sensitivity or elasticity can make no LTRE contribution at all, if it did not differ between the populations: in our example \(\lambda\) has a sensitivity of 0.336 to juvenile stasis at the midpoint matrix, but juvenile stasis contributes nothing because it is 0.1 in both populations.

The two approaches complement each other. LTRE is useful for understanding what has caused observed differences between populations, years or experimental treatments (and so for generating hypotheses about the causes), and it can handle several vital rates differing at the same time. To ask what management actions would do, use prospective tools.

12.6 Your task

  • Before running any more code, look at the table of matrix elements and the sensitivities. Predict the sign of each LTRE contribution, and which one will be largest. Then compare your prediction with the output above.
  • Check for yourself that the contributions sum approximately to \(\lambda_{\mathrm{treat}} - \lambda_{\mathrm{ref}}\).
  • Modify one element in A_treat (for example, set the treatment fertility to 1.8 instead of 1.3, or the treatment maturation probability to 0.4 instead of 0.2). Predict which LTRE contribution will change most, and in which direction. Re-run the contributions (by hand and with popbio::LTRE) and check your prediction. Explain the change using “difference in element × sensitivity”.
  • Explain, in two or three sentences, why the LTRE result does not on its own tell a manager which vital rate to target.

12.7 Takeaways

  • LTRE is retrospective: it decomposes an observed difference in \(\lambda\) into contributions from specific matrix elements.
  • Each contribution is (difference in the element) × (sensitivity of \(\lambda\) to that element, at the midpoint matrix), and the contributions sum approximately to the observed difference in \(\lambda\).
  • Sensitivity and elasticity analyses are prospective: they ask what would happen if a vital rate changed, and are the right tools for exploring management options.