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.
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
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
Relationship between the quantitative and qualitative response
plot(ADJ, -A.inverse, pch=2, xlab="Complementary feedback", ylab="Quantitative response")
m <- lm(as.numeric(-A.inverse)~as.numeric(ADJ))
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)
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
Danish shallow lakes, Jeppesen 1998 adjoint of qualitatively specified community matrix
The reproduction of this figure is the same as previously
The reproduction of this figure is the same as previously
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