RELEVANCE OF COMMUNITY STRUCTURE IN ASSESSING INDETERMINACY OF ECOLOGICAL PREDICTIONS

Abstract

The community matrix is potentially a powerful tool for community ecology. While it details direct interactions between community members, it can also be used to quantify all indirect effects that occur in a community, and thereby to make predictions regarding population response to experimental treatments or natural disturbances. These predictions are essentially hypotheses of system behavior that can be rigorously evaluated. Use of the community matrix, however, has been hindered by indeterminacy and ambiguity in response predictions. In this study, we reveal a theoretical source of the problem that arises as a consequence of community structure. Using a qualitative analysis of the community matrix, we detail the complementary feedback cycles that contribute to the response of a population following a sustained or press perturbation. Complementary feedback is the sum of all direct and indirect effects that can contribute to a response. We develop a ‘‘weighted-predictions matrix’’ that assigns a probability scale to sign determinacy of predicted responses. This matrix is formed by the quotient of the net sum of complementary feedback cycles and the absolute number of complementary feedback cycles. A qualitative analysis of system structure provides a theoretical benchmark for under- standing a spectrum of behavior in biological systems, and for framing and prioritizing management interventions for whole communities. This advance clarifies much of the uncertainty and ambiguity found in predicting the behavior of large and complex systems. We validate these tools by analyzing published studies of community response.

# Reproducing Fig.1.

Community matrix of plankton community (Stone 1990, plankton community model)

A <- matrix( c(-1, 0.6, 0,0,0, -0.6, -1, 0, 0.1, 0.6, 0,0,-1, 0.2, 0, 0,0,-0.2, -1, 0.5, 0.6, -0.6, 0.2, -0.5, -1), byrow=T, nrow=5)
A
##      [,1] [,2] [,3] [,4] [,5]
## [1,] -1.0  0.6  0.0  0.0  0.0
## [2,] -0.6 -1.0  0.0  0.1  0.6
## [3,]  0.0  0.0 -1.0  0.2  0.0
## [4,]  0.0  0.0 -0.2 -1.0  0.5
## [5,]  0.6 -0.6  0.2 -0.5 -1.0

Inverse community matrix (shows the direct and indirect interaction of effect)

A.inverse <- round(solve(A),2)
A.inverse
##       [,1]  [,2]  [,3]  [,4]  [,5]
## [1,] -0.89 -0.40 -0.05  0.06 -0.21
## [2,]  0.19 -0.67 -0.09  0.09 -0.36
## [3,] -0.05  0.01 -0.98 -0.16 -0.07
## [4,] -0.25  0.06  0.09 -0.80 -0.36
## [5,] -0.53  0.13 -0.22  0.34 -0.75

Qualitatively specified community matrix (contains only 1, 0, -1 showing only the direction of the interaction)

A0 <- matrix( c(-1,1,0,0,0,-1,-1,0,1,1,0,0,-1,1,0,0,0,-1,-1,1,1,-1,1,-1,-1), byrow=T, nrow=5 )
A0
##      [,1] [,2] [,3] [,4] [,5]
## [1,]   -1    1    0    0    0
## [2,]   -1   -1    0    1    1
## [3,]    0    0   -1    1    0
## [4,]    0    0   -1   -1    1
## [5,]    1   -1    1   -1   -1

# Reproducing Fig.2.

Adjoint matrix of the negative community matrix ( inverse(A) = adjoint(A)/det(A) )

library(RConics)
ADJ <- adjoint(-A0)

Absolute feedback matrix (permanent of the matrix)

library(LoopAnalyst)
## Loading required package: nlme
TM <- make.T(A0)

Weighted prediction matrix (adjoint matrix elements divided by the matrix permanent)

W <- round(ADJ/TM, 2)
W
##      [,1] [,2] [,3] [,4] [,5]
## [1,] 0.71  0.5 0.50 0.33    1
## [2,] 0.14  0.5 0.50 0.33    1
## [3,] 1.00  0.0 0.50 0.50    1
## [4,] 1.00  0.0 0.00 0.50    1
## [5,] 1.00  0.0 0.67 0.00    1

# Reproducing Fig.3.

Relationship between the quantitative and qualitative response

plot(ADJ, -A.inverse, pch=2, xlab="Complementary feedback", ylab="Quantitative response")
r2 <- summary(m)\$r.squared
coef(m)
##     (Intercept) as.numeric(ADJ)
##         -0.1572          0.1960
abline( m )
mylabel <-bquote(italic(R)^2 == .(format(r2, digits = 3)))
text(0.5,0.8, mylabel)

# Reproducing Fig.4.

Old-field food web (Schmitz, 1997)

A2 <- matrix( c(-1.13, -1.72, -0.55, -1.25, -4.44,0,
0.541, -2.41, 0,0,-0.0058, -0.230,
0.124, 0, -0.51, 0, 0, -0.364,
0.117, -0.0144, -0.0204, -1.15, -0.0024, -0.12,
0.369, -0.0198, -0.0319, -0.011, -4.31, -0.055,
0, 0.00781, 0.0109, 0.0003, 0.0002, -0.0373), byrow=T, nrow=6)
A2
##        [,1]     [,2]    [,3]    [,4]    [,5]    [,6]
## [1,] -1.130 -1.72000 -0.5500 -1.2500 -4.4400  0.0000
## [2,]  0.541 -2.41000  0.0000  0.0000 -0.0058 -0.2300
## [3,]  0.124  0.00000 -0.5100  0.0000  0.0000 -0.3640
## [4,]  0.117 -0.01440 -0.0204 -1.1500 -0.0024 -0.1200
## [5,]  0.369 -0.01980 -0.0319 -0.0110 -4.3100 -0.0550
## [6,]  0.000  0.00781  0.0109  0.0003  0.0002 -0.0373
A2[A2<0] <- -1
A2[A2>0] <- 1
A2
##      [,1] [,2] [,3] [,4] [,5] [,6]
## [1,]   -1   -1   -1   -1   -1    0
## [2,]    1   -1    0    0   -1   -1
## [3,]    1    0   -1    0    0   -1
## [4,]    1   -1   -1   -1   -1   -1
## [5,]    1   -1   -1   -1   -1   -1
## [6,]    0    1    1    1    1   -1
ADJ2 <- round(adjoint(-A2),2)
ADJ2
##      [,1] [,2] [,3] [,4] [,5] [,6]
## [1,]    0    0    0    0    0    0
## [2,]    0    0    0    3   -3    0
## [3,]    0    0    0    0    0    0
## [4,]    0    0    0    0    0    0
## [5,]    0    0    0   -3    3    0
## [6,]    0    0    0    0    0    0
TM2 <- make.T(A2)
TM2
##      [,1] [,2] [,3] [,4] [,5] [,6]
## [1,]   30   42   60   26   26   26
## [2,]   36   50   50   31   31   36
## [3,]   32   36   64   28   28   32
## [4,]   50   50   64   42   42   50
## [5,]   36   50   50   31   31   36
## [6,]   26   42   60   26   26   30
round(abs(ADJ2)/TM2,2)
##      [,1] [,2] [,3] [,4] [,5] [,6]
## [1,]    0    0    0  0.0  0.0    0
## [2,]    0    0    0  0.1  0.1    0
## [3,]    0    0    0  0.0  0.0    0
## [4,]    0    0    0  0.0  0.0    0
## [5,]    0    0    0  0.1  0.1    0
## [6,]    0    0    0  0.0  0.0    0

# Reproducing Fig.5.

Danish shallow lakes, Jeppesen 1998 adjoint of qualitatively specified community matrix

The reproduction of this figure is the same as previously

# Reproducing Fig.6.

The reproduction of this figure is the same as previously

# Reproducing Fig.7.

Lake Saint George deep pelagia, Puccia and Levins, 1995

Adj.C <- matrix(c(5,3,2,1,1,
-3,3,2,1,1,
2,-2,4,2,2,
-1,1,-2,3,3,
1,-1,2,-3,5), byrow=T, nrow=5)
Adj.C
##      [,1] [,2] [,3] [,4] [,5]
## [1,]    5    3    2    1    1
## [2,]   -3    3    2    1    1
## [3,]    2   -2    4    2    2
## [4,]   -1    1   -2    3    3
## [5,]    1   -1    2   -3    5
A.Cmodel <- adjoint(Adj.C)
A.Cmodel
##      [,1] [,2] [,3] [,4] [,5]
## [1,]  512 -512    0    0    0
## [2,]  512  512 -512    0    0
## [3,]    0  512  512 -512    0
## [4,]    0    0  512  512 -512
## [5,]    0    0    0  512  512
A.Cmodel[A.Cmodel>0] <- 1
A.Cmodel[A.Cmodel<0] <- -1
A.Cmodel
##      [,1] [,2] [,3] [,4] [,5]
## [1,]    1   -1    0    0    0
## [2,]    1    1   -1    0    0
## [3,]    0    1    1   -1    0
## [4,]    0    0    1    1   -1
## [5,]    0    0    0    1    1
TC <- make.T(A.Cmodel)
TC
##      [,1] [,2] [,3] [,4] [,5]
## [1,]    5    3    2    1    1
## [2,]    3    3    2    1    1
## [3,]    2    2    4    2    2
## [4,]    1    1    2    3    3
## [5,]    1    1    2    3    5
round(abs(Adj.C)/TC,2)
##      [,1] [,2] [,3] [,4] [,5]
## [1,]    1    1    1    1    1
## [2,]    1    1    1    1    1
## [3,]    1    1    1    1    1
## [4,]    1    1    1    1    1
## [5,]    1    1    1    1    1