diff --git a/Manifest.toml b/Manifest.toml index e43be206d..e48015ca6 100644 --- a/Manifest.toml +++ b/Manifest.toml @@ -79,10 +79,10 @@ deps = ["Base64"] uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" [[Missings]] -deps = ["Dates", "InteractiveUtils", "SparseArrays", "Test"] -git-tree-sha1 = "d1d2585677f2bd93a97cfeb8faa7a0de0f982042" +deps = ["SparseArrays", "Test"] +git-tree-sha1 = "f0719736664b4358aa9ec173077d4285775f8007" uuid = "e1d29d7a-bbdc-5cf2-9ac0-f12de2c33e28" -version = "0.4.0" +version = "0.4.1" [[Mmap]] uuid = "a63ad114-7e13-5084-954f-fe012c677804" diff --git a/Project.toml b/Project.toml index dea7a45d0..644ec5d63 100644 --- a/Project.toml +++ b/Project.toml @@ -11,6 +11,7 @@ Distributions = "31c24e10-a181-5473-b8eb-7969acd0382f" LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" Requires = "ae029012-a4dd-5104-9daa-d747884805df" +Statistics = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" StatsBase = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" diff --git a/docs/src/properties/resilience.md b/docs/src/properties/resilience.md index 564726cb2..9e69e3199 100644 --- a/docs/src/properties/resilience.md +++ b/docs/src/properties/resilience.md @@ -40,13 +40,10 @@ with ## Available functions ```@docs -s_in -s_out -s_mean +s σ_in σ_out symmetry heterogeneity -βeff resilience ``` diff --git a/src/EcologicalNetworks.jl b/src/EcologicalNetworks.jl index a530ecf5b..4d7263425 100644 --- a/src/EcologicalNetworks.jl +++ b/src/EcologicalNetworks.jl @@ -110,7 +110,7 @@ export AJS, EAJS # Overlap include(joinpath(".", "community/resilience.jl")) -export βeff, resilience +export resilience export symmetry, heterogeneity export s export σ_in, σ_out diff --git a/src/community/resilience.jl b/src/community/resilience.jl index b572424fa..627b5e1e7 100644 --- a/src/community/resilience.jl +++ b/src/community/resilience.jl @@ -14,10 +14,10 @@ density of interactions. If dims is provided, the incoming (`dims=1`) or outgoing (`dims=2`) is computed. """ function s(N::AbstractUnipartiteNetwork; dims::Union{Nothing,Integer}=nothing) - dims == 1 && return sum(N, dims=2) - dims == 2 && return sum(N, dims=1)' + dims == 1 && return sum(N.A, dims=2) + dims == 2 && return sum(N.A, dims=1)' if dims == nothing - return sum(N) / size(N)[1] + return sum(N.A) / size(N)[1] end end #= @@ -43,7 +43,7 @@ s_out(N::AbstractUnipartiteNetwork) = sum(N.A, dims=1)' Computes the standard deviation of the ingoing weighted degree of an unipartite network. """ -σ_in(N::AbstractUnipartiteNetwork) = std(s_in(N), corrected=false) +σ_in(N::AbstractUnipartiteNetwork) = std(s(N, dims=1), corrected=false) """ σ_out(N::AbstractUnipartiteNetwork) @@ -51,7 +51,7 @@ network. Computes the standard deviation of the outgoing weighted degree of an unipartite network. """ -σ_out(N::AbstractUnipartiteNetwork) = std(s_out(N), corrected=false) +σ_out(N::AbstractUnipartiteNetwork) = std(s(N, dims=2), corrected=false) """ symmetry(N::AbstractUnipartiteNetwork) @@ -68,7 +68,7 @@ to be prey would have a negative symmetry. > Nature 530(7590), 307-312. doi:10.1038/nature16948 """ -symmetry(N::AbstractUnipartiteNetwork) = (mean(s_in(N) .* s_out(N)) - mean(s_in(N)) * mean(s_out(N))) / (σ_in(N) * σ_out(N)) +symmetry(N::AbstractUnipartiteNetwork) = (mean(s(N, dims=1) .* s(N, dims=2)) - mean(s(N, dims=1)) * mean(s(N, dims=2))) / (σ_in(N) * σ_out(N)) """ heterogeneity(N::AbstractUnipartiteNetwork) @@ -82,25 +82,7 @@ have the same (weighted) in- and outdegrees. > Nature 530(7590), 307-312. doi:10.1038/nature16948 """ -heterogeneity(N::AbstractUnipartiteNetwork) = (σ_in(N) * σ_out(N)) / s_mean(N) - -""" - βeff(N::AbstractUnipartiteNetwork) - -A resilience parameters described by Gao et al. (2016). It is a global parameters -describing the dynamics of an unipartite network as an effective 1D equation of -the form - -f(xeff) = F(xeff) + βeff G(xeff, xeff) - -i.e. describing a second-order term representing the effect of the network on the -dynamics of the 'effective state' xeff of the system. - -> Goa, J., Barzael, B. and Barabási 2016. Universal resilience patterns in complex networks. -> Nature 530(7590), 307-312. doi:10.1038/nature16948 - -""" -βeff(N::AbstractUnipartiteNetwork) = dot(s_in(N), s_out(N)) / sum(N.A) +heterogeneity(N::AbstractUnipartiteNetwork) = (σ_in(N) * σ_out(N)) / s(N) """ resilience(N::AbstractUnipartiteNetwork) @@ -118,4 +100,4 @@ dynamics of the 'effective state' xeff of the system. > Nature 530(7590), 307-312. doi:10.1038/nature16948 """ -resilience(N::AbstractUnipartiteNetwork) = βeff(N) +resilience(N::AbstractUnipartiteNetwork) = dot(s(N, dims=1), s(N, dims=2)) / sum(N) diff --git a/test/community/resilience.jl b/test/community/resilience.jl index 4018b40b9..861c746d9 100644 --- a/test/community/resilience.jl +++ b/test/community/resilience.jl @@ -4,11 +4,11 @@ module TestResilience A = rand([0, 1, 0.5], 10, 10) N = UnipartiteQuantitativeNetwork(A) - @assert s_mean(N) ≈ sum(A) / 10 - @assert s_in(N) ≈ sum(A, dims=2) - @assert s_out(N) ≈ sum(A, dims=1)' + @assert s(N) ≈ sum(A) / 10 + @assert s(N, dims=1) ≈ sum(A, dims=2) + @assert s(N, dims=2) ≈ sum(A, dims=1)' - @assert βeff(N) ≈ s_mean(N) + symmetry(N) * heterogeneity(N) + @assert resilience(N) ≈ s(N) + symmetry(N) * heterogeneity(N) # species only interact with themselves Nid = UnipartiteNetwork([true false false false;