From b6216569d7cd806c141457ff032fa557143ccd7f Mon Sep 17 00:00:00 2001 From: "Documenter.jl" Date: Wed, 20 Nov 2024 21:32:04 +0000 Subject: [PATCH] build based on 7bfb8b9 --- dev/.documenter-siteinfo.json | 2 +- .../counts_and_probabilities_api/index.html | 48 +++++------ dev/api/cross_map_api/88f785a0.png | Bin 0 -> 164578 bytes dev/api/cross_map_api/cfd7051a.png | Bin 165162 -> 0 bytes dev/api/cross_map_api/index.html | 18 ++-- .../index.html | 12 +-- .../information_multivariate_api/index.html | 40 ++++----- .../index.html | 4 +- dev/associations/index.html | 78 +++++++++--------- dev/causal_graphs/index.html | 6 +- .../examples_associations/437dc7e3.png | Bin 0 -> 168903 bytes .../examples_associations/52cc6dc0.png | Bin 168848 -> 0 bytes .../examples_associations/59534e45.png | Bin 0 -> 172571 bytes .../examples_associations/66955cd3.png | Bin 120420 -> 0 bytes .../examples_associations/9daf09b7.png | Bin 166857 -> 0 bytes .../examples_associations/a2c07a5d.png | Bin 0 -> 119570 bytes .../examples_associations/e0e8398b.png | Bin 165825 -> 0 bytes .../examples_associations/f8a5d486.png | Bin 0 -> 166606 bytes dev/examples/examples_associations/index.html | 48 ++++++----- dev/examples/examples_independence/index.html | 63 +++++++++++++- dev/examples/examples_infer_graphs/index.html | 2 +- dev/independence/index.html | 12 +-- dev/index.html | 2 +- dev/objects.inv | Bin 4642 -> 4798 bytes dev/references/index.html | 2 +- dev/search_index.js | 2 +- 26 files changed, 206 insertions(+), 133 deletions(-) create mode 100644 dev/api/cross_map_api/88f785a0.png delete mode 100644 dev/api/cross_map_api/cfd7051a.png create mode 100644 dev/examples/examples_associations/437dc7e3.png delete mode 100644 dev/examples/examples_associations/52cc6dc0.png create mode 100644 dev/examples/examples_associations/59534e45.png delete mode 100644 dev/examples/examples_associations/66955cd3.png delete mode 100644 dev/examples/examples_associations/9daf09b7.png create mode 100644 dev/examples/examples_associations/a2c07a5d.png delete mode 100644 dev/examples/examples_associations/e0e8398b.png create mode 100644 dev/examples/examples_associations/f8a5d486.png diff --git a/dev/.documenter-siteinfo.json b/dev/.documenter-siteinfo.json index a41eeae2..66c2f55a 100644 --- a/dev/.documenter-siteinfo.json +++ b/dev/.documenter-siteinfo.json @@ -1 +1 @@ -{"documenter":{"julia_version":"1.11.1","generation_timestamp":"2024-11-16T21:22:40","documenter_version":"1.8.0"}} \ No newline at end of file +{"documenter":{"julia_version":"1.11.1","generation_timestamp":"2024-11-20T21:31:56","documenter_version":"1.8.0"}} \ No newline at end of file diff --git a/dev/api/counts_and_probabilities_api/index.html b/dev/api/counts_and_probabilities_api/index.html index 5b2ca5f6..4ae9661b 100644 --- a/dev/api/counts_and_probabilities_api/index.html +++ b/dev/api/counts_and_probabilities_api/index.html @@ -19,7 +19,7 @@ y = rand(1:3, n) z = rand([(1, 2), (2, 1)], n) -counts(UniqueElements(), x, y, z)

See also: CodifyPoints, CodifyVariables, UniqueElements, OutcomeSpace, probabilities.

source
ComplexityMeasures.ProbabilitiesType
Probabilities <: Array{<:AbstractFloat, N}
+counts(UniqueElements(), x, y, z)

See also: CodifyPoints, CodifyVariables, UniqueElements, OutcomeSpace, probabilities.

source
ComplexityMeasures.ProbabilitiesType
Probabilities <: Array{<:AbstractFloat, N}
 Probabilities(probs::Array [, outcomes [, dimlabels]]) → p
 Probabilities(counts::Counts [, outcomes [, dimlabels]]) → p

Probabilities stores an N-dimensional array of probabilities, while ensuring that the array sums to 1 (normalized probability mass). In most cases the array is a standard vector. p itself can be manipulated and iterated over, just like its stored array.

The probabilities correspond to outcomes that describe the axes of the array. If p isa Probabilities, then p.outcomes[i] is an an abstract vector containing the outcomes along the i-th dimension. The outcomes have the same ordering as the probabilities, so that p[i][j] is the probability for outcome p.outcomes[i][j]. The dimensions of the array are named, and can be accessed by p.dimlabels, where p.dimlabels[i] is the label of the i-th dimension. Both outcomes and dimlabels are assigned automatically if not given. If the input is a set of Counts, and outcomes and dimlabels are not given, then the labels and outcomes are inherited from the counts.

Examples

julia> probs = [0.2, 0.2, 0.2, 0.2]; Probabilities(probs) # will be normalized to sum to 1
  Probabilities{Float64,1} over 4 outcomes
@@ -49,8 +49,8 @@
 y = rand(1:3, n)
 z = rand([(1, 2), (2, 1)], n)
 
-probabilities(UniqueElements(), x, y, z)

See also: CodifyPoints, CodifyVariables, UniqueElements, OutcomeSpace.

source

The utility function marginal is also useful.

Associations.marginalFunction
marginal(p::Probabilities; dims = 1:ndims(p))
-marginal(c::Counts; dims = 1:ndims(p))

Given a set of counts c (a contingency table), or a multivariate probability mass function p, return the marginal counts/probabilities along the given dims.

source

Example: estimating Counts and Probabilities

Estimating multivariate counts (contingency matrices) and PMFs is simple. If the data are pre-discretized, then we can use UniqueElements to simply count the number of occurrences.

using Associations
+probabilities(UniqueElements(), x, y, z)

See also: CodifyPoints, CodifyVariables, UniqueElements, OutcomeSpace.

source

The utility function marginal is also useful.

Associations.marginalFunction
marginal(p::Probabilities; dims = 1:ndims(p))
+marginal(c::Counts; dims = 1:ndims(p))

Given a set of counts c (a contingency table), or a multivariate probability mass function p, return the marginal counts/probabilities along the given dims.

source

Example: estimating Counts and Probabilities

Estimating multivariate counts (contingency matrices) and PMFs is simple. If the data are pre-discretized, then we can use UniqueElements to simply count the number of occurrences.

using Associations
 n = 50 # the number of samples must be the same for each input variable
 x = rand(["dog", "cat", "snake"], n)
 y = rand(1:4, n)
@@ -58,29 +58,29 @@
 discretization = CodifyVariables(UniqueElements())
 counts(discretization, x, y, z)
 3×4×3 Counts{Int64,3}
 [:, :, 1]
-       1  2  3  4
- 1     1  3  0  3
- 2     1  0  1  3
- 3     1  1  2  1
+          1  4  3  2
+ "snake"  5  0  1  1
+ "dog"    1  0  1  2
+ "cat"    1  4  1  1
 [and 2 more slices...]

Probabilities are computed analogously, except counts are normalized to sum to 1.

discretization = CodifyVariables(UniqueElements())
 probabilities(discretization, x, y, z)
 3×4×3 Probabilities{Float64,3}
 [:, :, 1]
-       1     2     3     4
- 1     0.02  0.06  0.0   0.06
- 2     0.02  0.0   0.02  0.06
- 3     0.02  0.02  0.04  0.02
+          1     4     3     2
+ "snake"  0.1   0.0   0.02  0.02
+ "dog"    0.02  0.0   0.02  0.04
+ "cat"    0.02  0.08  0.02  0.02
 [and 2 more slices...]

For numerical data, we can estimate both counts and probabilities using CodifyVariables with any count-based OutcomeSpace.

using Associations
 x, y = rand(100), rand(100)
 discretization = CodifyVariables(BubbleSortSwaps(m = 4))
 probabilities(discretization, x, y)
 7×7 Probabilities{Float64,2}
-       3                     10
- 6     0.010309278350515462  0.0                      0.0
- 5     0.0515463917525773    0.020618556701030924     0.020618556701030924
- 2     0.06185567010309277   0.020618556701030924     0.010309278350515462
- 4     0.0824742268041237    0.010309278350515462     0.0
- 3     0.04123711340206185   0.030927835051546386  …  0.0
- 1     0.030927835051546386  0.030927835051546386     0.0
- 0     0.0                   0.010309278350515462     0.0

For more fine-grained control, we can use CodifyPoints with one or several Encodings.

using Associations
+       4                     15
+ 1     0.010309278350515464  0.010309278350515464     0.010309278350515464
+ 4     0.020618556701030927  0.030927835051546393     0.041237113402061855
+ 3     0.05154639175257732   0.020618556701030927     0.041237113402061855
+ 0     0.010309278350515464  0.0                      0.0
+ 5     0.0                   0.041237113402061855  …  0.020618556701030927
+ 2     0.09278350515463918   0.020618556701030927     0.030927835051546393
+ 6     0.010309278350515464  0.0                      0.0

For more fine-grained control, we can use CodifyPoints with one or several Encodings.

using Associations
 x, y = StateSpaceSet(rand(1000, 2)), StateSpaceSet(rand(1000, 3))
 
  # min/max of the `rand` call is 0 and 1
@@ -93,8 +93,8 @@
 
 # now estimate probabilities
 probabilities(discretization, x, y)
 4×12 Probabilities{Float64,2}
-       6      4      5      92      12      8      1      7
- 1     0.027  0.02   0.018  0.025     0.025   0.022  0.016  0.02   0.023
- 2     0.017  0.016  0.019  0.031     0.021   0.027  0.019  0.021  0.024
- 4     0.019  0.018  0.016  0.025     0.017   0.025  0.016  0.017  0.026
- 3     0.028  0.018  0.02   0.016     0.022   0.026  0.021  0.026  0.013
+ 10 4 6 85 11 3 1 7 + 4 0.023 0.022 0.027 0.026 0.02 0.02 0.02 0.016 0.02 + 2 0.02 0.021 0.017 0.021 0.015 0.01 0.03 0.022 0.021 + 3 0.023 0.012 0.022 0.02 0.019 0.012 0.018 0.024 0.027 + 1 0.02 0.018 0.026 0.021 0.021 0.029 0.019 0.032 0.018
diff --git a/dev/api/cross_map_api/88f785a0.png b/dev/api/cross_map_api/88f785a0.png new file mode 100644 index 0000000000000000000000000000000000000000..5061e214ec675b8d278475af57f385494880494e GIT binary patch literal 164578 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 literal 0 HcmV?d00001 diff --git a/dev/api/cross_map_api/cfd7051a.png b/dev/api/cross_map_api/cfd7051a.png deleted file mode 100644 index 43b5a6b0543a0c31774dcceb163dee0fbcde5aab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 165162 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
@UTsS&=^vY+fR=7$%b>2teBYQMsYG$LG?MQK} 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 diff --git a/dev/api/cross_map_api/index.html b/dev/api/cross_map_api/index.html index 19019402..de24699f 100644 --- a/dev/api/cross_map_api/index.html +++ b/dev/api/cross_map_api/index.html @@ -1,12 +1,12 @@ -Cross-map API · Associations.jl

Cross-map API

Estimators

Associations.CrossmapEstimatorType
CrossmapEstimator{M<:CrossmapMeasure, LIBSIZES, RNG}

The abstract supertype for all cross-map estimators.

Concrete subtypes

Description

Because the type of the library may differ between estimators, and because RNGs from different packages may be used, subtypes must implement the LIBSIZES and RNG type parameters.

For efficiency purposes, subtypes may contain mutable containers that can be re-used for ensemble analysis (see Ensemble).

Libraries

A cross-map estimator uses the concept of "libraries". A library is essentially just a reference to a set of points, and usually, a library refers to indices of points, not the actual points themselves.

For example, for timeseries, RandomVectors(libsizes = 50:25:100) produces three separate libraries, where the first contains 50 randomly selected time indices, the second contains 75 randomly selected time indices, and the third contains 100 randomly selected time indices. This of course assumes that all quantities involved can be indexed using the same time indices, meaning that the concept of "library" only makes sense after relevant quantities have been jointly embedded, so that they can be jointly indexed. For non-instantaneous prediction, the maximum possible library size shrinks with the magnitude of the index/time-offset for the prediction.

For spatial analyses (not yet implemented), indices could be more complex and involve multi-indices.

source
Associations.RandomVectorsType
RandomVectors <: CrossmapEstimator
+Cross-map API · Associations.jl

Cross-map API

Estimators

Associations.CrossmapEstimatorType
CrossmapEstimator{M<:CrossmapMeasure, LIBSIZES, RNG}

The abstract supertype for all cross-map estimators.

Concrete subtypes

Description

Because the type of the library may differ between estimators, and because RNGs from different packages may be used, subtypes must implement the LIBSIZES and RNG type parameters.

For efficiency purposes, subtypes may contain mutable containers that can be re-used for ensemble analysis (see Ensemble).

Libraries

A cross-map estimator uses the concept of "libraries". A library is essentially just a reference to a set of points, and usually, a library refers to indices of points, not the actual points themselves.

For example, for timeseries, RandomVectors(libsizes = 50:25:100) produces three separate libraries, where the first contains 50 randomly selected time indices, the second contains 75 randomly selected time indices, and the third contains 100 randomly selected time indices. This of course assumes that all quantities involved can be indexed using the same time indices, meaning that the concept of "library" only makes sense after relevant quantities have been jointly embedded, so that they can be jointly indexed. For non-instantaneous prediction, the maximum possible library size shrinks with the magnitude of the index/time-offset for the prediction.

For spatial analyses (not yet implemented), indices could be more complex and involve multi-indices.

source
Associations.RandomVectorsType
RandomVectors <: CrossmapEstimator
 RandomVectors(definition::CrossmapMeasure; libsizes, replace = false, 
-    rng = Random.default_rng())

Cross map once over N = length(libsizes) different "point libraries", where point indices are selected randomly (not considering time ordering).

This is method 3 from Luo et al. (2015). See CrossmapEstimator for an in-depth explanation of what "library" means in this context.

Description

The cardinality of the point libraries are given by libsizes. One set of random point indices is selected per L ∈ libsizes, and the i-th library has cardinality k = libsizes[i].

Point indices within each library are randomly selected, independently of other libraries. A user-specified rng may be specified for reproducibility. The replace argument controls whether sampling is done with or without replacement. If the time series you're cross mapping between have length M, and Lᵢ < M for any Lᵢ ∈ libsizes, then you must set replace = true.

Returns

The return type when used with association depends on the type of libsizes.

  • If libsizes is an Int (a single library), then a single cross-map estimate is returned.
  • If libsizes is an AbstractVector{Int} (multiple libraries), then a vector of cross-map estimates is returned –- one per library.

See also: CrossmapEstimator.

source
Associations.RandomSegmentType
RandomSegment <: CrossmapEstimator
-RandomSegment(definition::CrossmapMeasure; libsizes::Int, rng = Random.default_rng())

Cross map once over N = length(libsizes) different "point libraries", where point indices are selected as time-contiguous segments with random starting points.

This is method 2 from Luo et al. (2015). See CrossmapEstimator for an in-depth explanation of what "library" means in this context.

Description

The cardinality of the point index segments are given by libsizes. One segment with a randomly selected starting point is picked per L ∈ libsizes, and the i-th point index segment has cardinality k = libsizes[i].

The starting point for each library is selected independently of other libraries. A user-specified rng may be specified for reproducibility. If the time series you're cross mapping between have length M, and Lᵢ < M for any Lᵢ ∈ libsizes, then an error will be thrown.

A user-specified rng may be specified for reproducibility.

Returns

The return type when used with association depends on the type of libsizes.

  • If libsizes is an Int (a single library), then a single cross-map estimate is returned.
  • If libsizes is an AbstractVector{Int} (multiple libraries), then a vector of cross-map estimates is returned –- one per library.

See also: CrossmapEstimator.

source
Associations.ExpandingSegmentType
ExpandingSegment <: CrossmapEstimator
-ExpandingSegment(definition::CrossmapMeasure; libsizes, rng = Random.default_rng())

Cross map once over N = length(libsizes) different "point libraries", where point indices are selected as time-contiguous segments/windows.

This is the method from (Sugihara et al., 2012). See CrossmapEstimator for an in-depth explanation of what "library" means in this context.

Description

Point index segments are selected as first available data point index, up to the Lth data point index. This results in one library of contiguous time indices per L ∈ libsizes.

If used in an ensemble setting, the estimator is applied to time indices Lmin:step:Lmax of the joint embedding.

Returns

The return type when used with association depends on the type of libsizes.

  • If libsizes is an Int (a single library), then a single cross-map estimate is returned.
  • If libsizes is an AbstractVector{Int} (multiple libraries), then a vector of cross-map estimates is returned –- one per library.
source

Advanced utility methods

For most use cases, it is sufficient to provide a CrossmapEstimator to association to compute a cross map measure. However, in some cases it can be useful to have more fine-grained controls. We offer a few utility functions for this purpose.

These functions are used in the examples below, where we reproduce Figures 3C and 3D of Sugihara et al. (2012) and reproduce figures from McCracken and Weigel (2014).

Associations.predictFunction
predict(measure::CrossmapEstimator, t::AbstractVector, s::AbstractVector) → t̂ₛ, t̄, ρ
-predict(measure::CrossmapEstimator, t̄::AbstractVector, S̄::AbstractStateSpaceSet) → t̂ₛ

Perform point-wise cross mappings between source embeddings and target time series according to the algorithm specified by the given cross-map measure (e.g. ConvergentCrossMapping or PairwiseAsymmetricInference).

  • First method: Jointly embeds the target t and source s time series (according to measure) to obtain time-index aligned target timeseries and source embedding (which is now a StateSpaceSet). Then calls predict(measure, t̄, S̄) (the first method), and returns both the predictions t̂ₛ, observations and their correspondence ρ according to measure.
  • Second method: Returns a vector of predictions t̂ₛ (t̂ₛ := "predictions of based on source embedding "), where t̂ₛ[i] is the prediction for t̄[i]. It assumes pre-embedded data which have been correctly time-aligned using a joint embedding, i.e. such that t̄[i] and S̄[i] correspond to the same time index.

Description

For each i ∈ {1, 2, …, N} where N = length(t) == length(s), we make the prediction t̂[i] (an estimate of t[i]) based on a linear combination of D + 1 other points in t, where the selection of points and weights for the linear combination are determined by the D+1 nearest neighbors of the point S̄[i]. The details of point selection and weights depend on measure.

Note: Some CrossmapMeasures may define more general mapping procedures. If so, the algorithm is described in their docstring.

source
Associations.crossmapFunction
crossmap(measure::CrossmapEstimator, t::AbstractVector, s::AbstractVector) → ρ::Real
+    rng = Random.default_rng())

Cross map once over N = length(libsizes) different "point libraries", where point indices are selected randomly (not considering time ordering).

This is method 3 from Luo et al. (2015). See CrossmapEstimator for an in-depth explanation of what "library" means in this context.

Description

The cardinality of the point libraries are given by libsizes. One set of random point indices is selected per L ∈ libsizes, and the i-th library has cardinality k = libsizes[i].

Point indices within each library are randomly selected, independently of other libraries. A user-specified rng may be specified for reproducibility. The replace argument controls whether sampling is done with or without replacement. If the time series you're cross mapping between have length M, and Lᵢ < M for any Lᵢ ∈ libsizes, then you must set replace = true.

Returns

The return type when used with association depends on the type of libsizes.

  • If libsizes is an Int (a single library), then a single cross-map estimate is returned.
  • If libsizes is an AbstractVector{Int} (multiple libraries), then a vector of cross-map estimates is returned –- one per library.

See also: CrossmapEstimator.

source
Associations.RandomSegmentType
RandomSegment <: CrossmapEstimator
+RandomSegment(definition::CrossmapMeasure; libsizes::Int, rng = Random.default_rng())

Cross map once over N = length(libsizes) different "point libraries", where point indices are selected as time-contiguous segments with random starting points.

This is method 2 from Luo et al. (2015). See CrossmapEstimator for an in-depth explanation of what "library" means in this context.

Description

The cardinality of the point index segments are given by libsizes. One segment with a randomly selected starting point is picked per L ∈ libsizes, and the i-th point index segment has cardinality k = libsizes[i].

The starting point for each library is selected independently of other libraries. A user-specified rng may be specified for reproducibility. If the time series you're cross mapping between have length M, and Lᵢ < M for any Lᵢ ∈ libsizes, then an error will be thrown.

A user-specified rng may be specified for reproducibility.

Returns

The return type when used with association depends on the type of libsizes.

  • If libsizes is an Int (a single library), then a single cross-map estimate is returned.
  • If libsizes is an AbstractVector{Int} (multiple libraries), then a vector of cross-map estimates is returned –- one per library.

See also: CrossmapEstimator.

source
Associations.ExpandingSegmentType
ExpandingSegment <: CrossmapEstimator
+ExpandingSegment(definition::CrossmapMeasure; libsizes, rng = Random.default_rng())

Cross map once over N = length(libsizes) different "point libraries", where point indices are selected as time-contiguous segments/windows.

This is the method from (Sugihara et al., 2012). See CrossmapEstimator for an in-depth explanation of what "library" means in this context.

Description

Point index segments are selected as first available data point index, up to the Lth data point index. This results in one library of contiguous time indices per L ∈ libsizes.

If used in an ensemble setting, the estimator is applied to time indices Lmin:step:Lmax of the joint embedding.

Returns

The return type when used with association depends on the type of libsizes.

  • If libsizes is an Int (a single library), then a single cross-map estimate is returned.
  • If libsizes is an AbstractVector{Int} (multiple libraries), then a vector of cross-map estimates is returned –- one per library.
source

Advanced utility methods

For most use cases, it is sufficient to provide a CrossmapEstimator to association to compute a cross map measure. However, in some cases it can be useful to have more fine-grained controls. We offer a few utility functions for this purpose.

These functions are used in the examples below, where we reproduce Figures 3C and 3D of Sugihara et al. (2012) and reproduce figures from McCracken and Weigel (2014).

Associations.predictFunction
predict(measure::CrossmapEstimator, t::AbstractVector, s::AbstractVector) → t̂ₛ, t̄, ρ
+predict(measure::CrossmapEstimator, t̄::AbstractVector, S̄::AbstractStateSpaceSet) → t̂ₛ

Perform point-wise cross mappings between source embeddings and target time series according to the algorithm specified by the given cross-map measure (e.g. ConvergentCrossMapping or PairwiseAsymmetricInference).

  • First method: Jointly embeds the target t and source s time series (according to measure) to obtain time-index aligned target timeseries and source embedding (which is now a StateSpaceSet). Then calls predict(measure, t̄, S̄) (the first method), and returns both the predictions t̂ₛ, observations and their correspondence ρ according to measure.
  • Second method: Returns a vector of predictions t̂ₛ (t̂ₛ := "predictions of based on source embedding "), where t̂ₛ[i] is the prediction for t̄[i]. It assumes pre-embedded data which have been correctly time-aligned using a joint embedding, i.e. such that t̄[i] and S̄[i] correspond to the same time index.

Description

For each i ∈ {1, 2, …, N} where N = length(t) == length(s), we make the prediction t̂[i] (an estimate of t[i]) based on a linear combination of D + 1 other points in t, where the selection of points and weights for the linear combination are determined by the D+1 nearest neighbors of the point S̄[i]. The details of point selection and weights depend on measure.

Note: Some CrossmapMeasures may define more general mapping procedures. If so, the algorithm is described in their docstring.

source
Associations.crossmapFunction
crossmap(measure::CrossmapEstimator, t::AbstractVector, s::AbstractVector) → ρ::Real
 crossmap(measure::CrossmapEstimator, est, t::AbstractVector, s::AbstractVector) → ρ::Vector
-crossmap(measure::CrossmapEstimator, t̄::AbstractVector, S̄::AbstractStateSpaceSet) → ρ

Compute the cross map estimates between between raw time series t and s (and return the real-valued cross-map statistic ρ). If a CrossmapEstimator est is provided, cross mapping is done on random subsamples of the data, where subsampling is dictated by est (a vector of values for ρ is returned).

Alternatively, cross-map between time-aligned time series and source embedding that have been constructed by jointly (pre-embedding) some input data.

This is just a wrapper around predict that simply returns the correspondence measure between the source and the target.

source

Example: reproducing Sugihara et al. (2012)

Run blocks consecutively

If copying these examples and running them locally, make sure the relevant packages (given in the first block) are loaded first.

Figure 3A

Let's reproduce figure 3A too, focusing only on ConvergentCrossMapping this time. In this figure, they compute the cross mapping for libraries of increasing size, always starting at time index 1. This approach - which we here call the ExpandingSegment estimator - is one of many ways of estimating the correspondence between observed and predicted value.

For this example, they use a bidirectional system with asymmetrical coupling strength.

using Associations
+crossmap(measure::CrossmapEstimator, t̄::AbstractVector, S̄::AbstractStateSpaceSet) → ρ

Compute the cross map estimates between between raw time series t and s (and return the real-valued cross-map statistic ρ). If a CrossmapEstimator est is provided, cross mapping is done on random subsamples of the data, where subsampling is dictated by est (a vector of values for ρ is returned).

Alternatively, cross-map between time-aligned time series and source embedding that have been constructed by jointly (pre-embedding) some input data.

This is just a wrapper around predict that simply returns the correspondence measure between the source and the target.

source

Example: reproducing Sugihara et al. (2012)

Run blocks consecutively

If copying these examples and running them locally, make sure the relevant packages (given in the first block) are loaded first.

Figure 3A

Let's reproduce figure 3A too, focusing only on ConvergentCrossMapping this time. In this figure, they compute the cross mapping for libraries of increasing size, always starting at time index 1. This approach - which we here call the ExpandingSegment estimator - is one of many ways of estimating the correspondence between observed and predicted value.

For this example, they use a bidirectional system with asymmetrical coupling strength.

using Associations
 using Statistics
 using LabelledArrays
 using StaticArrays
@@ -90,7 +90,7 @@
     end
 end
 
-reproduce_figure_3A_ensemble(ConvergentCrossMapping(d = 3, τ = -1))

With the RandomVectors estimator, the mean of our ensemble ρs seem to look pretty much identical to Figure 3A in Sugihara et al. The RandomSegment estimator also performs pretty well, but since subsampled segments are contiguous, there are probably some autocorrelation effects at play.

We can avoid the autocorrelation issue by tuning the w parameter of the ConvergentCrossMapping measure, which is the Theiler window. Setting the Theiler window to w > 0, we can exclude neighbors of a query point p that are close to p in time, and thus deal with autocorrelation issues that way (the default w = 0 excludes only the point itself). Let's re-do the analysis with w = 5, just for fun.

reproduce_figure_3A_ensemble(ConvergentCrossMapping(d = 3, τ = -1, w = 5))

There wasn't really that much of a difference, since for the logistic map, the autocorrelation function flips sign for every lag increase. However, for examples from other systems, tuning w may be important.

Figure 3B

What about figure 3B? Here they generate time series of length 400 for a range of values for both coupling parameters, and plot the dominant direction $\Delta = \rho(\hat{x} | y) - \rho(\hat{y} | x)$.

In the paper, they use a 1000 different parameterizations for the logistic map parameters, but don't state what is summarized in the plot. For simplicity, we'll therefore just stick to rx = ry = 3.7, as in the examples above, and just loop over the coupling strengths in either direction.

function reproduce_figure_3B()
+reproduce_figure_3A_ensemble(ConvergentCrossMapping(d = 3, τ = -1))

With the RandomVectors estimator, the mean of our ensemble ρs seem to look pretty much identical to Figure 3A in Sugihara et al. The RandomSegment estimator also performs pretty well, but since subsampled segments are contiguous, there are probably some autocorrelation effects at play.

We can avoid the autocorrelation issue by tuning the w parameter of the ConvergentCrossMapping measure, which is the Theiler window. Setting the Theiler window to w > 0, we can exclude neighbors of a query point p that are close to p in time, and thus deal with autocorrelation issues that way (the default w = 0 excludes only the point itself). Let's re-do the analysis with w = 5, just for fun.

reproduce_figure_3A_ensemble(ConvergentCrossMapping(d = 3, τ = -1, w = 5))

There wasn't really that much of a difference, since for the logistic map, the autocorrelation function flips sign for every lag increase. However, for examples from other systems, tuning w may be important.

Figure 3B

What about figure 3B? Here they generate time series of length 400 for a range of values for both coupling parameters, and plot the dominant direction $\Delta = \rho(\hat{x} | y) - \rho(\hat{y} | x)$.

In the paper, they use a 1000 different parameterizations for the logistic map parameters, but don't state what is summarized in the plot. For simplicity, we'll therefore just stick to rx = ry = 3.7, as in the examples above, and just loop over the coupling strengths in either direction.

function reproduce_figure_3B()
     βxys = 0.0:0.02:0.4
     βyxs = 0.0:0.02:0.4
     ρx̂ys = zeros(length(βxys), length(βyxs))
@@ -123,7 +123,7 @@
     end
 end
 
-reproduce_figure_3B()
Example block output

Figures 3C and 3D

Let's reproduce figures 3C and 3D in Sugihara et al. (2012), which introduced the ConvergentCrossMapping measure. Equations and parameters can be found in their supplementary material. Simulatenously, we also compute the PairwiseAsymmetricInference measure from McCracken and Weigel (2014), which is a related method, but uses a slightly different embedding.

using Associations
+reproduce_figure_3B()
Example block output

Figures 3C and 3D

Let's reproduce figures 3C and 3D in Sugihara et al. (2012), which introduced the ConvergentCrossMapping measure. Equations and parameters can be found in their supplementary material. Simulatenously, we also compute the PairwiseAsymmetricInference measure from McCracken and Weigel (2014), which is a related method, but uses a slightly different embedding.

using Associations
 using Statistics
 using LabelledArrays
 using StaticArrays
@@ -261,4 +261,4 @@
     end
 end
 
-reproduce_figure_8_mccraken()
Example block output

We haven't used as many parameter combinations as McCracken and Weigel (2014) did, but we get a figure that looks roughly similar to theirs.

As expected, $\Delta < 0$ for all parameter combinations, implying that $X$ "PAI drives" $Y$.

+reproduce_figure_8_mccraken()Example block output

We haven't used as many parameter combinations as McCracken and Weigel (2014) did, but we get a figure that looks roughly similar to theirs.

As expected, $\Delta < 0$ for all parameter combinations, implying that $X$ "PAI drives" $Y$.

diff --git a/dev/api/discretization_counts_probs_api/index.html b/dev/api/discretization_counts_probs_api/index.html index 2b727beb..80faccc1 100644 --- a/dev/api/discretization_counts_probs_api/index.html +++ b/dev/api/discretization_counts_probs_api/index.html @@ -1,9 +1,9 @@ -Discretization API · Associations.jl

Discretization API

Encoding multiple input datasets

A fundamental operation when computing multivariate information measures from data is discretization. When discretizing, what happens is that we "encode" input data into an intermediate representation indexed by the positive integers. This intermediate representation is called an "encoding". This is useful in several ways:

The following functions and types are used by Associations.jl to perform discretization of input data.

Associations.CodifyVariablesType
CodifyVariables <: Discretization
+Discretization API · Associations.jl

Discretization API

Encoding multiple input datasets

A fundamental operation when computing multivariate information measures from data is discretization. When discretizing, what happens is that we "encode" input data into an intermediate representation indexed by the positive integers. This intermediate representation is called an "encoding". This is useful in several ways:

The following functions and types are used by Associations.jl to perform discretization of input data.

Associations.CodifyVariablesType
CodifyVariables <: Discretization
 CodifyVariables(outcome_space::OutcomeSpace)

The CodifyVariables discretization scheme quantises input data in a column-wise manner using the given outcome_space.

Compatible outcome spaces

Description

The main difference between CodifyVariables and [CodifyPoints] is that the former uses OutcomeSpaces for discretization. This usually means that some transformation is applied to the data before discretizing. For example, some outcome constructs a delay embedding from the input (and thus encodes sequential information) before encoding the data.

Specifically, given x::AbstractStateSpaceSet..., where the i-th dataset x[i] is assumed to represent a single series of measurements, CodifyVariables encodes x[i] by codify-ing into a series of integers using an appropriate OutcomeSpace. This is typically done by first sequentially transforming the data and then running sliding window (the width of the window is controlled by outcome_space) across the data, and then encoding the values within each window to an integer.

Examples

using Associations
 x, y = rand(100), rand(100)
 d = CodifyVariables(OrdinalPatterns(m=2))
-cx, cy = codify(d, x, y)
source
Associations.CodifyPointsType
CodifyPoints{N}
 CodifyPoints(encodings::NTuple{N, Encoding})

CodifyPoints points is a Discretization scheme that encodes input data points without applying any sequential transformation to the input (as opposed to CodifyVariables, which may apply some transformation before encoding).

Usage

  • Use with codify to encode/discretize input variable on a point-by-point basis.

Compatible encodings

Description

Given x::AbstractStateSpaceSet..., where the i-th dataset is assumed to represent a single series of measurements, CodifyPoints encodes each point pₖ ∈ x[i] using some Encoding(s), without applying any (sequential) transformation to the x[i] first. This behaviour is different to CodifyVariables, which does apply a transformation to x[i] before encoding.

If length(x) == N (i.e. there are N input dataset), then encodings must be a tuple of N Encoding. Alternatively, if encodings is a single Encoding, then that same encoding is applied to every x[i].

Examples

using Associations
 
 # The same encoding on two input datasets
@@ -16,7 +16,7 @@
 z = StateSpaceSet(rand(100, 2))
 encoding_bin = RectangularBinEncoding(RectangularBinning(3), z)
 d = CodifyPoints(encoding_ord, encoding_ord, encoding_bin)
-cx, cy, cz = codify(d, x, y, z)
source
ComplexityMeasures.codifyFunction
codify(o::OutcomeSpace, x::Vector) → s::Vector{Int}

Codify x according to the outcome space o.

Description

The reason this function exists is that we don't always want to encode the entire input x at once. Sometimes, it is desirable to first apply some transformation to x first, then apply Encodings in a point-wise manner in the transformed space. (the OutcomeSpace dictates this transformation). This is useful for encoding timeseries data.

The length of the returned s depends on the OutcomeSpace. Some outcome spaces preserve the input data length (e.g. UniqueElements), while some outcome spaces (e.g. OrdinalPatterns) do e.g. delay embeddings before encoding, so that length(s) < length(x).

source
codify(encoding::CodifyPoints{N}, x::Vararg{<:AbstractStateSpaceSet, N})

Codify each timeseries xᵢ ∈ x according to the given encoding.

Examples

x = StateSpaceSet(rand(10000, 2))
+cx, cy, cz = codify(d, x, y, z)
source
ComplexityMeasures.codifyFunction
codify(o::OutcomeSpace, x::Vector) → s::Vector{Int}

Codify x according to the outcome space o.

Description

The reason this function exists is that we don't always want to encode the entire input x at once. Sometimes, it is desirable to first apply some transformation to x first, then apply Encodings in a point-wise manner in the transformed space. (the OutcomeSpace dictates this transformation). This is useful for encoding timeseries data.

The length of the returned s depends on the OutcomeSpace. Some outcome spaces preserve the input data length (e.g. UniqueElements), while some outcome spaces (e.g. OrdinalPatterns) do e.g. delay embeddings before encoding, so that length(s) < length(x).

source
codify(encoding::CodifyPoints{N}, x::Vararg{<:AbstractStateSpaceSet, N})

Codify each timeseries xᵢ ∈ x according to the given encoding.

Examples

x = StateSpaceSet(rand(10000, 2))
 y = StateSpaceSet(rand(10000, 3))
 z = StateSpaceSet(rand(10000, 2))
 
@@ -34,7 +34,7 @@
 codify(CodifyPoints(ex, ey), x, y)
 
 # Codify three input datasets gives a 3-tuple of Vector{Int}
-codify(CodifyPoints(ex, ey, ez), x, y, z)
source
codify(d::CodifyVariables, x::Vararg{<:AbstractStateSpaceSet, N})
+codify(CodifyPoints(ex, ey, ez), x, y, z)
source
codify(d::CodifyVariables, x::Vararg{<:AbstractStateSpaceSet, N})
 codify(d::CodifyPoints, x::Vararg{<:AbstractStateSpaceSet, N})

Codify each timeseries xᵢ ∈ x according to the given encoding/discretization d.

Compatible discretizations

Examples

using Associations
 
 # Sliding window encoding
@@ -45,7 +45,7 @@
 
 # Point-by-point encoding
 x, y = StateSpaceSet(rand(100, 3)), StateSpaceSet(rand(100, 3))
-cx, cy = codify(CodifyPoints(OrdinalPatternEncoding(3)), x, y)
source

In summary, the two main ways of discretizing data in Associations are as follows.

  • The CodifyPoints discretization scheme encodes input data on a point-by-point basis by applying some Encoding to each point.
  • The CodifyVariables discretization scheme encodes input data on a column-by-column basis by applying a sliding window to each column, and encoding the data within the sliding window according to some OutcomeSpace (Internally, this uses codify).
Note

Encoding, OutcomeSpace and codify are all from ComplexityMeasures.jl. In this package, they are used to discretize multiple input variables instead of just one input variable.

Encoding per point/row

In some cases, it may be desireable to encode data on a row-wise basis. This typically happens when working with pre-embedded time series or StateSpaceSets (respecting the fact that time ordering is already taken care of by the embedding procedure). If we want to apply something like OrdinalPatternEncoding to such data, then we must encode each point individually, such that vectors like [1.2, 2.4, 4.5] or ["howdy", "partner"] gets mapped to an integer. The CodifyPoints discretization intstruction ensures input data are encoded on a point-by-point basis.

A point-by-point discretization using CodifyPoints is formally done by applying some Encoding to each input data point. You can pick between the following encodings, or combine them in arbitrary ways using CombinationEncoding.

ComplexityMeasures.EncodingType
Encoding

The supertype for all encoding schemes. Encodings always encode elements of input data into the positive integers. The encoding API is defined by the functions encode and decode. Some probability estimators utilize encodings internally.

Current available encodings are:

source

In summary, the two main ways of discretizing data in Associations are as follows.

  • The CodifyPoints discretization scheme encodes input data on a point-by-point basis by applying some Encoding to each point.
  • The CodifyVariables discretization scheme encodes input data on a column-by-column basis by applying a sliding window to each column, and encoding the data within the sliding window according to some OutcomeSpace (Internally, this uses codify).
Note

Encoding, OutcomeSpace and codify are all from ComplexityMeasures.jl. In this package, they are used to discretize multiple input variables instead of just one input variable.

Encoding per point/row

In some cases, it may be desireable to encode data on a row-wise basis. This typically happens when working with pre-embedded time series or StateSpaceSets (respecting the fact that time ordering is already taken care of by the embedding procedure). If we want to apply something like OrdinalPatternEncoding to such data, then we must encode each point individually, such that vectors like [1.2, 2.4, 4.5] or ["howdy", "partner"] gets mapped to an integer. The CodifyPoints discretization intstruction ensures input data are encoded on a point-by-point basis.

A point-by-point discretization using CodifyPoints is formally done by applying some Encoding to each input data point. You can pick between the following encodings, or combine them in arbitrary ways using CombinationEncoding.

ComplexityMeasures.EncodingType
Encoding

The supertype for all encoding schemes. Encodings always encode elements of input data into the positive integers. The encoding API is defined by the functions encode and decode. Some probability estimators utilize encodings internally.

Current available encodings are:

source
ComplexityMeasures.GaussianCDFEncodingType
GaussianCDFEncoding <: Encoding
 GaussianCDFEncoding{m}(; μ, σ, c::Int = 3)

An encoding scheme that encodes a scalar or vector χ into one of the integers sᵢ ∈ [1, 2, …, c] based on the normal cumulative distribution function (NCDF), and decodes the sᵢ into subintervals of [0, 1] (with some loss of information).

Initializing a GaussianCDFEncoding

The size of the input to be encoded must be known beforehand. One must therefore set m = length(χ), where χ is the input (m = 1 for scalars, m ≥ 2 for vectors). To do so, one must explicitly give m as a type parameter: e.g. encoding = GaussianCDFEncoding{3}(; μ = 0.0, σ = 0.1) to encode 3-element vectors, or encoding = GaussianCDFEncoding{1}(; μ = 0.0, σ = 0.1) to encode scalars.

Description

Encoding/decoding scalars

GaussianCDFEncoding first maps an input scalar $χ$ to a new real number $y_ \in [0, 1]$ by using the normal cumulative distribution function (CDF) with the given mean μ and standard deviation σ, according to the map

\[x \to y : y = \dfrac{1}{ \sigma \sqrt{2 \pi}} \int_{-\infty}^{x} e^{(-(x - \mu)^2)/(2 \sigma^2)} dx.\]

Next, the interval [0, 1] is equidistantly binned and enumerated $1, 2, \ldots, c$, and $y$ is linearly mapped to one of these integers using the linear map $y \to z : z = \text{floor}(y(c-1)) + 1$.

Because of the floor operation, some information is lost, so when used with decode, each decoded sᵢ is mapped to a subinterval of [0, 1]. This subinterval is returned as a length-1 Vector{SVector}.

Notice that the decoding step does not yield an element of any outcome space of the estimators that use GaussianCDFEncoding internally, such as Dispersion. That is because these estimators additionally delay embed the encoded data.

Encoding/decoding vectors

If GaussianCDFEncoding is used with a vector χ, then each element of χ is encoded separately, resulting in a length(χ) sequence of integers which may be treated as a CartesianIndex. The encoded symbol s ∈ [1, 2, …, c] is then just the linear index corresponding to this cartesian index (similar to how CombinationEncoding works).

When decoded, the integer symbol s is converted back into its CartesianIndex representation, which is just a sequence of integers that refer to subdivisions of the [0, 1] interval. The relevant subintervals are then returned as a length-χ Vector{SVector}.

Examples

julia> using ComplexityMeasures, Statistics
 
@@ -247,4 +247,4 @@
  6  2
  3  4
  2  5
- 4  4
+ 4 4
diff --git a/dev/api/information_multivariate_api/index.html b/dev/api/information_multivariate_api/index.html index 0a561b36..d23b4f13 100644 --- a/dev/api/information_multivariate_api/index.html +++ b/dev/api/information_multivariate_api/index.html @@ -1,21 +1,21 @@ -Multivariate information API · Associations.jl

Multivariate information API

Associations.MultivariateInformationMeasureEstimatorType
source

Estimators

Generic estimators

We provide a set of generic estimators that can be used to calculate potentially several types of information measures.

Associations.JointProbabilitiesType
JointProbabilities <: InformationMeasureEstimator
+Multivariate information API · Associations.jl

Multivariate information API

Associations.MultivariateInformationMeasureEstimatorType
source

Estimators

Generic estimators

We provide a set of generic estimators that can be used to calculate potentially several types of information measures.

Associations.JointProbabilitiesType
JointProbabilities <: InformationMeasureEstimator
 JointProbabilities(
     definition::MultivariateInformationMeasure,
     discretization::Discretization
-)

JointProbabilities is a generic estimator for multivariate discrete information measures.

Usage

  • Use with association to compute an information measure from input data.

Description

It first encodes the input data according to the given discretization, then constructs probs, a multidimensional Probabilities instance. Finally, probs are forwarded to a PlugIn estimator, which computes the measure according to definition.

Compatible encoding schemes

  • CodifyVariables (encode each variable/column of the input data independently by applying an encoding in a sliding window over each input variable).
  • CodifyPoints (encode each point/column of the input data)

Works for any OutcomeSpace that implements codify.

Joint probabilities vs decomposition methods

Using JointProbabilities to compute an information measure, e.g. conditional mutual estimation, is typically slower than other dedicated estimation procedures like EntropyDecomposition. The reason is that measures such as CMIShannon can be formulated as a sum of four entropies, which can be estimated individually and summed afterwards. This decomposition is fast because because we avoid explicitly estimating the entire joint pmf, which demands many extra calculation steps, However, the decomposition is biased, because it fails to fully take into consideration the joint relationships between the variables. Pick your estimator according to your needs.

See also: Counts, Probabilities, ProbabilitiesEstimator, OutcomeSpace, DiscreteInfoEstimator.

source
Associations.EntropyDecompositionType
EntropyDecomposition(definition::MultivariateInformationMeasure, 
+)

JointProbabilities is a generic estimator for multivariate discrete information measures.

Usage

  • Use with association to compute an information measure from input data.

Description

It first encodes the input data according to the given discretization, then constructs probs, a multidimensional Probabilities instance. Finally, probs are forwarded to a PlugIn estimator, which computes the measure according to definition.

Compatible encoding schemes

  • CodifyVariables (encode each variable/column of the input data independently by applying an encoding in a sliding window over each input variable).
  • CodifyPoints (encode each point/column of the input data)

Works for any OutcomeSpace that implements codify.

Joint probabilities vs decomposition methods

Using JointProbabilities to compute an information measure, e.g. conditional mutual estimation, is typically slower than other dedicated estimation procedures like EntropyDecomposition. The reason is that measures such as CMIShannon can be formulated as a sum of four entropies, which can be estimated individually and summed afterwards. This decomposition is fast because because we avoid explicitly estimating the entire joint pmf, which demands many extra calculation steps, However, the decomposition is biased, because it fails to fully take into consideration the joint relationships between the variables. Pick your estimator according to your needs.

See also: Counts, Probabilities, ProbabilitiesEstimator, OutcomeSpace, DiscreteInfoEstimator.

source
Associations.EntropyDecompositionType
EntropyDecomposition(definition::MultivariateInformationMeasure, 
     est::DifferentialInfoEstimator)
 EntropyDecomposition(definition::MultivariateInformationMeasure,
     est::DiscreteInfoEstimator,
     discretization::CodifyVariables{<:OutcomeSpace},
-    pest::ProbabilitiesEstimator = RelativeAmount())

Estimate the multivariate information measure specified by definition by rewriting its formula into some combination of entropy terms.

If calling the second method (discrete variant), then discretization is always done per variable/column and each column is encoded into integers using codify.

Usage

Description

The entropy terms are estimated using est, and then combined to form the final estimate of definition. No bias correction is applied. If est is a DifferentialInfoEstimator, then discretization and pest are ignored. If est is a DiscreteInfoEstimator, then discretization and a probabilities estimator pest must also be provided (default to RelativeAmount, which uses naive plug-in probabilities).

Compatible differential information estimators

If using the first signature, any compatible DifferentialInfoEstimator can be used.

Compatible outcome spaces for discrete estimation

If using the second signature, the outcome spaces can be used for discretisation. Note that not all outcome spaces will work with all measures.

EstimatorPrinciple
UniqueElementsCount of unique elements
ValueBinningBinning (histogram)
OrdinalPatternsOrdinal patterns
DispersionDispersion patterns
BubbleSortSwapsSorting complexity
CosineSimilarityBinningCosine similarities histogram

Bias

Estimating the definition by decomposition into a combination of entropy terms, which are estimated independently, will in general be more biased than when using a dedicated estimator. One reason is that this decomposition may miss out on crucial information in the joint space. To remedy this, dedicated information measure estimators typically derive the marginal estimates by first considering the joint space, and then does some clever trick to eliminate the bias that is introduced through a naive decomposition. Unless specified below, no bias correction is applied for EntropyDecomposition.

Handling of overlapping parameters

If there are overlapping parameters between the measure to be estimated, and the lower-level decomposed measures, then the top-level measure parameter takes precedence. For example, if we want to estimate CMIShannon(base = 2) through a decomposition of entropies using the Kraskov(Shannon(base = ℯ)) Shannon entropy estimator, then base = 2 is used.

Info

Not all measures have the property that they can be decomposed into more fundamental information theoretic quantities. For example, MITsallisMartin can be decomposed into a combination of marginal entropies, while MIRenyiSarbu cannot. An error will be thrown if decomposition is not possible.

Discrete entropy decomposition

The second signature is for discrete estimation using DiscreteInfoEstimators, for example PlugIn. The given discretization scheme (typically an OutcomeSpace) controls how the joint/marginals are discretized, and the probabilities estimator pest controls how probabilities are estimated from counts.

Bias

Like for DifferentialInfoEstimator, using a dedicated estimator for the measure in question will be more reliable than using a decomposition estimate. Here's how different discretizations are applied:

  • ValueBinning. Bin visitation frequencies are counted in the joint space XY, then marginal visitations are obtained from the joint bin visits. This behaviour is the same for both FixedRectangularBinning and RectangularBinning (which adapts the grid to the data). When using FixedRectangularBinning, the range along the first dimension is used as a template for all other dimensions. This is a bit slower than naively binning each marginal, but lessens bias.
  • OrdinalPatterns. Each timeseries is separately codify-ed according to its ordinal pattern (no bias correction).
  • Dispersion. Each timeseries is separately codify-ed according to its dispersion pattern (no bias correction).

Examples

See also: MutualInformationEstimator, MultivariateInformationMeasure.

source
Associations.MIDecompositionType
MIDecomposition(definition::MultivariateInformationMeasure, 
-    est::MutualInformationEstimator)

Estimate the MultivariateInformationMeasure specified by definition by by decomposing, the measure, if possible, into a combination of mutual information terms. These terms are individually estimated using the given MutualInformationEstimator est, and finally combined to form the final value of the measure.

Usage

Examples

See also: MultivariateInformationMeasureEstimator.

source
Associations.CMIDecompositionType
CMIDecomposition(definition::MultivariateInformationMeasure, 
-    est::ConditionalMutualInformationEstimator)

Estimate some multivariate information measure specified by definition, by decomposing it into a combination of conditional mutual information terms.

Usage

Description

Each of the conditional mutual information terms are estimated using est, which can be any ConditionalMutualInformationEstimator. Finally, these estimates are combined according to the relevant decomposition formula.

This estimator is similar to EntropyDecomposition, but definition is expressed as conditional mutual information terms instead of entropy terms.

Examples

See also: ConditionalMutualInformationEstimator, MultivariateInformationMeasureEstimator, MultivariateInformationMeasure.

source

Mutual information estimators

Associations.KraskovStögbauerGrassberger1Type
KSG1 <: MutualInformationEstimator
+    pest::ProbabilitiesEstimator = RelativeAmount())

Estimate the multivariate information measure specified by definition by rewriting its formula into some combination of entropy terms.

If calling the second method (discrete variant), then discretization is always done per variable/column and each column is encoded into integers using codify.

Usage

Description

The entropy terms are estimated using est, and then combined to form the final estimate of definition. No bias correction is applied. If est is a DifferentialInfoEstimator, then discretization and pest are ignored. If est is a DiscreteInfoEstimator, then discretization and a probabilities estimator pest must also be provided (default to RelativeAmount, which uses naive plug-in probabilities).

Compatible differential information estimators

If using the first signature, any compatible DifferentialInfoEstimator can be used.

Compatible outcome spaces for discrete estimation

If using the second signature, the outcome spaces can be used for discretisation. Note that not all outcome spaces will work with all measures.

EstimatorPrinciple
UniqueElementsCount of unique elements
ValueBinningBinning (histogram)
OrdinalPatternsOrdinal patterns
DispersionDispersion patterns
BubbleSortSwapsSorting complexity
CosineSimilarityBinningCosine similarities histogram

Bias

Estimating the definition by decomposition into a combination of entropy terms, which are estimated independently, will in general be more biased than when using a dedicated estimator. One reason is that this decomposition may miss out on crucial information in the joint space. To remedy this, dedicated information measure estimators typically derive the marginal estimates by first considering the joint space, and then does some clever trick to eliminate the bias that is introduced through a naive decomposition. Unless specified below, no bias correction is applied for EntropyDecomposition.

Handling of overlapping parameters

If there are overlapping parameters between the measure to be estimated, and the lower-level decomposed measures, then the top-level measure parameter takes precedence. For example, if we want to estimate CMIShannon(base = 2) through a decomposition of entropies using the Kraskov(Shannon(base = ℯ)) Shannon entropy estimator, then base = 2 is used.

Info

Not all measures have the property that they can be decomposed into more fundamental information theoretic quantities. For example, MITsallisMartin can be decomposed into a combination of marginal entropies, while MIRenyiSarbu cannot. An error will be thrown if decomposition is not possible.

Discrete entropy decomposition

The second signature is for discrete estimation using DiscreteInfoEstimators, for example PlugIn. The given discretization scheme (typically an OutcomeSpace) controls how the joint/marginals are discretized, and the probabilities estimator pest controls how probabilities are estimated from counts.

Bias

Like for DifferentialInfoEstimator, using a dedicated estimator for the measure in question will be more reliable than using a decomposition estimate. Here's how different discretizations are applied:

  • ValueBinning. Bin visitation frequencies are counted in the joint space XY, then marginal visitations are obtained from the joint bin visits. This behaviour is the same for both FixedRectangularBinning and RectangularBinning (which adapts the grid to the data). When using FixedRectangularBinning, the range along the first dimension is used as a template for all other dimensions. This is a bit slower than naively binning each marginal, but lessens bias.
  • OrdinalPatterns. Each timeseries is separately codify-ed according to its ordinal pattern (no bias correction).
  • Dispersion. Each timeseries is separately codify-ed according to its dispersion pattern (no bias correction).

Examples

See also: MutualInformationEstimator, MultivariateInformationMeasure.

source
Associations.MIDecompositionType
MIDecomposition(definition::MultivariateInformationMeasure, 
+    est::MutualInformationEstimator)

Estimate the MultivariateInformationMeasure specified by definition by by decomposing, the measure, if possible, into a combination of mutual information terms. These terms are individually estimated using the given MutualInformationEstimator est, and finally combined to form the final value of the measure.

Usage

Examples

See also: MultivariateInformationMeasureEstimator.

source
Associations.CMIDecompositionType
CMIDecomposition(definition::MultivariateInformationMeasure, 
+    est::ConditionalMutualInformationEstimator)

Estimate some multivariate information measure specified by definition, by decomposing it into a combination of conditional mutual information terms.

Usage

Description

Each of the conditional mutual information terms are estimated using est, which can be any ConditionalMutualInformationEstimator. Finally, these estimates are combined according to the relevant decomposition formula.

This estimator is similar to EntropyDecomposition, but definition is expressed as conditional mutual information terms instead of entropy terms.

Examples

See also: ConditionalMutualInformationEstimator, MultivariateInformationMeasureEstimator, MultivariateInformationMeasure.

source

Mutual information estimators

Associations.KraskovStögbauerGrassberger1Type
KSG1 <: MutualInformationEstimator
 KraskovStögbauerGrassberger1 <: MutualInformationEstimator
 KraskovStögbauerGrassberger1(; k::Int = 1, w = 0, metric_marginals = Chebyshev())

The KraskovStögbauerGrassberger1 mutual information estimator (you can use KSG1 for short) is the $I^{(1)}$ k-th nearest neighbor estimator from Kraskov et al. (2004).

Compatible definitions

Usage

  • Use with association to compute Shannon mutual information from input data.
  • Use with some IndependenceTest to test for independence between variables.

Keyword arguments

  • k::Int: The number of nearest neighbors to consider. Only information about the k-th nearest neighbor is actually used.
  • metric_marginals: The distance metric for the marginals for the marginals can be any metric from Distances.jl. It defaults to metric_marginals = Chebyshev(), which is the same as in Kraskov et al. (2004).
  • w::Int: The Theiler window, which determines if temporal neighbors are excluded during neighbor searches in the joint space. Defaults to 0, meaning that only the point itself is excluded.

Example

using Associations
 using Random; rng = MersenneTwister(1234)
 x = rand(rng, 10000); y = rand(rng, 10000)
-association(KSG1(; k = 10), x, y) # should be near 0 (and can be negative)
source
Associations.KraskovStögbauerGrassberger2Type
KSG2 <: MutualInformationEstimator
 KraskovStögbauerGrassberger2 <: MutualInformationEstimator
 KraskovStögbauerGrassberger2(; k::Int = 1, w = 0, metric_marginals = Chebyshev())

The KraskovStögbauerGrassberger2 mutual information estimator (you can use KSG2 for short) is the $I^{(2)}$ k-th nearest neighbor estimator from (Kraskov et al., 2004).

Compatible definitions

Usage

  • Use with association to compute Shannon mutual information from input data.
  • Use with some IndependenceTest to test for independence between variables.

Keyword arguments

  • k::Int: The number of nearest neighbors to consider. Only information about the k-th nearest neighbor is actually used.
  • metric_marginals: The distance metric for the marginals for the marginals can be any metric from Distances.jl. It defaults to metric_marginals = Chebyshev(), which is the same as in Kraskov et al. (2004).
  • w::Int: The Theiler window, which determines if temporal neighbors are excluded during neighbor searches in the joint space. Defaults to 0, meaning that only the point itself is excluded.

Description

Let the joint StateSpaceSet $X := \{\bf{X}_1, \bf{X_2}, \ldots, \bf{X}_m \}$ be defined by the concatenation of the marginal StateSpaceSets $\{ \bf{X}_k \}_{k=1}^m$, where each $\bf{X}_k$ is potentially multivariate. Let $\bf{x}_1, \bf{x}_2, \ldots, \bf{x}_N$ be the points in the joint space $X$.

The KraskovStögbauerGrassberger2 estimator first locates, for each $\bf{x}_i \in X$, the point $\bf{n}_i \in X$, the k-th nearest neighbor to $\bf{x}_i$, according to the maximum norm (Chebyshev metric). Let $\epsilon_i$ be the distance $d(\bf{x}_i, \bf{n}_i)$.

Consider $x_i^m \in \bf{X}_m$, the $i$-th point in the marginal space $\bf{X}_m$. For each $\bf{x}_i^m$, we determine $\theta_i^m$ := the number of points $\bf{x}_k^m \in \bf{X}_m$ that are a distance less than $\epsilon_i$ away from $\bf{x}_i^m$. That is, we use the distance from a query point $\bf{x}_i \in X$ (in the joint space) to count neighbors of $x_i^m \in \bf{X}_m$ (in the marginal space).

Shannon mutual information between the variables $\bf{X}_1, \bf{X_2}, \ldots, \bf{X}_m$ is then estimated as

\[\hat{I}_{KSG2}(\bf{X}) = \psi{(k)} - @@ -24,11 +24,11 @@ \dfrac{1}{N} \sum_{i = 1}^N \sum_{j = 1}^m \psi{(\theta_i^j + 1)}\]

Example

using Associations
 using Random; rng = MersenneTwister(1234)
 x = rand(rng, 10000); y = rand(rng, 10000)
-association(KSG2(; k = 10), x, y) # should be near 0 (and can be negative)
source
Associations.GaoKannanOhViswanathType
GaoKannanOhViswanath <: MutualInformationEstimator
 GaoKannanOhViswanath(definition = MIShannon(); k = 1, w = 0)

The GaoKannanOhViswanath (Shannon) estimator is designed for estimating Shannon mutual information between variables that may be either discrete, continuous or a mixture of both (Gao et al., 2017).

Compatible definitions

Keyword arguments

  • k::Int: The number of nearest neighbors to consider. Only information about the k-th nearest neighbor is actually used.
  • w::Int: The Theiler window, which determines if temporal neighbors are excluded during neighbor searches in the joint space. Defaults to 0, meaning that only the point itself is excluded.

Usage

  • Use with association to compute Shannon mutual information from input data.
  • Use with some IndependenceTest to test for independence between variables.

Description

The estimator starts by expressing mutual information in terms of the Radon-Nikodym derivative, and then estimates these derivatives using k-nearest neighbor distances from empirical samples.

The estimator avoids the common issue of having to add noise to data before analysis due to tied points, which may bias other estimators. Citing their paper, the estimator "strongly outperforms natural baselines of discretizing the mixed random variables (by quantization) or making it continuous by adding a small Gaussian noise."

Implementation note

In Gao et al. (2017), they claim (roughly speaking) that the estimator reduces to the KraskovStögbauerGrassberger1 estimator for continuous-valued data. However, KraskovStögbauerGrassberger1 uses the digamma function, while GaoKannanOhViswanath uses the logarithm instead, so the estimators are not exactly equivalent for continuous data.

Moreover, in their algorithm 1, it is clearly not the case that the method falls back on the KraskovStögbauerGrassberger1 approach. The KraskovStögbauerGrassberger1 estimator uses k-th neighbor distances in the joint space, while the GaoKannanOhViswanath algorithm selects the maximum k-th nearest distances among the two marginal spaces, which are in general not the same as the k-th neighbor distance in the joint space (unless both marginals are univariate). Therefore, our implementation here differs slightly from algorithm 1 in GaoKannanOhViswanath. We have modified it in a way that mimics KraskovStögbauerGrassberger1 for continous data. Note that because of using the log function instead of digamma, there will be slight differences between the methods. See the source code for more details.

Explicitly convert your discrete data to floats

Even though the GaoKannanOhViswanath estimator is designed to handle discrete data, our implementation demands that all input data are StateSpaceSets whose data points are floats. If you have discrete data, such as strings or symbols, encode them using integers and convert those integers to floats before passing them to association.

Examples

using Associations
 using Random; rng = MersenneTwister(1234)
 x = rand(rng, 10000); y = rand(rng, 10000)
-association(GaoKannanOhViswanath(; k = 10), x, y) # should be near 0 (and can be negative)
source
Associations.GaoOhViswanathType
GaoOhViswanath <: MutualInformationEstimator
+association(GaoKannanOhViswanath(; k = 10), x, y) # should be near 0 (and can be negative)
source
Associations.GaoOhViswanathType
GaoOhViswanath <: MutualInformationEstimator
 GaoOhViswanath(definition = MIShannon(); k = 1, w = 0)

The GaoOhViswanath is a mutual information estimator based on nearest neighbors, and is also called the bias-improved-KSG estimator, or BI-KSG, by (Gao et al., 2018).

Compatible definitions

Keyword arguments

  • k::Int: The number of nearest neighbors to consider. Only information about the k-th nearest neighbor is actually used.
  • w::Int: The Theiler window, which determines if temporal neighbors are excluded during neighbor searches in the joint space. Defaults to 0, meaning that only the point itself is excluded.

Usage

  • Use with association to compute Shannon mutual information from input data.
  • Use with some IndependenceTest to test for independence between variables.

Description

The estimator is given by

\[\begin{align*} \hat{H}_{GAO}(X, Y) &= \hat{H}_{KSG}(X) + \hat{H}_{KSG}(Y) - \hat{H}_{KZL}(X, Y) \\ @@ -43,7 +43,7 @@ \end{align*},\]

where $c_{d, 2} = \dfrac{\pi^{\frac{d}{2}}}{\Gamma{(\dfrac{d}{2} + 1)}}$ is the volume of a $d$-dimensional unit $\mathcal{l}_2$-ball.

Example

using Associations
 using Random; rng = MersenneTwister(1234)
 x = rand(rng, 10000); y = rand(rng, 10000)
-association(GaoOhViswanath(; k = 10), x, y) # should be near 0 (and can be negative)
source
Associations.GaussianMIType
GaussianMI <: MutualInformationEstimator
+association(GaoOhViswanath(; k = 10), x, y) # should be near 0 (and can be negative)
source
Associations.GaussianMIType
GaussianMI <: MutualInformationEstimator
 GaussianMI(; normalize::Bool = false)

GaussianMI is a parametric estimator for Shannon mutual information.

Compatible definitions

Usage

  • Use with association to compute Shannon mutual information from input data.
  • Use with some IndependenceTest to test for independence between variables.

Description

Given $d_x$-dimensional and $d_y$-dimensional input data X and Y, GaussianMI first constructs the $d_x + d_y$-dimensional joint StateSpaceSet XY. If normalize == true, then we follow the approach in Vejmelka & Palus (2008)(Vejmelka and Paluš, 2008) and transform each column in XY to have zero mean and unit standard deviation. If normalize == false, then the algorithm proceeds without normalization.

Next, the C_{XY}, the correlation matrix for the (normalized) joint data XY is computed. The mutual information estimate GaussianMI assumes the input variables are distributed according to normal distributions with zero means and unit standard deviations. Therefore, given $d_x$-dimensional and $d_y$-dimensional input data X and Y, GaussianMI first constructs the joint StateSpaceSet XY, then transforms each column in XY to have zero mean and unit standard deviation, and finally computes the \Sigma, the correlation matrix for XY.

The mutual information estimated (for normalize == false) is then estimated as

\[\hat{I}^S_{Gaussian}(X; Y) = \dfrac{1}{2} \dfrac{ \det(\Sigma_X) \det(\Sigma_Y)) }{\det(\Sigma))},\]

where we $\Sigma_X$ and $\Sigma_Y$ appear in $\Sigma$ as

\[\Sigma = \begin{bmatrix} \Sigma_{X} & \Sigma^{'}\\ @@ -51,27 +51,27 @@ \end{bmatrix}.\]

If normalize == true, then the mutual information is estimated as

\[\hat{I}^S_{Gaussian}(X; Y) = -\dfrac{1}{2} \sum_{i = 1}^{d_x + d_y} \sigma_i,\]

where $\sigma_i$ are the eigenvalues for $\Sigma$.

Example

using Associations
 using Random; rng = MersenneTwister(1234)
 x = rand(rng, 10000); y = rand(rng, 10000)
-association(GaussianMI(), x, y) # should be near 0 (and can be negative)
source

Conditional mutual information estimators

Associations.GaussianCMIType
GaussianCMI <: MutualInformationEstimator
-GaussianCMI(definition = CMIShannon(); normalize::Bool = false)

GaussianCMI is a parametric ConditionalMutualInformationEstimator (Vejmelka and Paluš, 2008).

Compatible definitions

Usage

Description

GaussianCMI estimates Shannon CMI through a sum of two mutual information terms that each are estimated using GaussianMI (the normalize keyword is the same as for GaussianMI):

\[\hat{I}_{Gaussian}(X; Y | Z) = \hat{I}_{Gaussian}(X; Y, Z) - \hat{I}_{Gaussian}(X; Z)\]

Examples

source
Associations.FPVPType
FPVP <: ConditionalMutualInformationEstimator
-FPVP(definition = CMIShannon(); k = 1, w = 0)

The Frenzel-Pompe-Vejmelka-Paluš (or FPVP for short) ConditionalMutualInformationEstimator is used to estimate the conditional mutual information using a k-th nearest neighbor approach that is analogous to that of the KraskovStögbauerGrassberger1 mutual information estimator from Frenzel and Pompe (2007) and Vejmelka and Paluš (2008).

k is the number of nearest neighbors. w is the Theiler window, which controls the number of temporal neighbors that are excluded during neighbor searches.

Compatible definitions

Usage

Examples

source
Associations.MesnerShaliziType
MesnerShalizi <: ConditionalMutualInformationEstimator
+association(GaussianMI(), x, y) # should be near 0 (and can be negative)
source

Conditional mutual information estimators

Associations.GaussianCMIType
GaussianCMI <: MutualInformationEstimator
+GaussianCMI(definition = CMIShannon(); normalize::Bool = false)

GaussianCMI is a parametric ConditionalMutualInformationEstimator (Vejmelka and Paluš, 2008).

Compatible definitions

Usage

Description

GaussianCMI estimates Shannon CMI through a sum of two mutual information terms that each are estimated using GaussianMI (the normalize keyword is the same as for GaussianMI):

\[\hat{I}_{Gaussian}(X; Y | Z) = \hat{I}_{Gaussian}(X; Y, Z) - \hat{I}_{Gaussian}(X; Z)\]

Examples

source
Associations.FPVPType
FPVP <: ConditionalMutualInformationEstimator
+FPVP(definition = CMIShannon(); k = 1, w = 0)

The Frenzel-Pompe-Vejmelka-Paluš (or FPVP for short) ConditionalMutualInformationEstimator is used to estimate the conditional mutual information using a k-th nearest neighbor approach that is analogous to that of the KraskovStögbauerGrassberger1 mutual information estimator from Frenzel and Pompe (2007) and Vejmelka and Paluš (2008).

k is the number of nearest neighbors. w is the Theiler window, which controls the number of temporal neighbors that are excluded during neighbor searches.

Compatible definitions

Usage

Examples

source
Associations.MesnerShaliziType
MesnerShalizi <: ConditionalMutualInformationEstimator
 MesnerShalizi(definition = CMIShannon(); k = 1, w = 0)

The MesnerShalizi ConditionalMutualInformationEstimator is designed for data that can be mixtures of discrete and continuous data (Mesner and Shalizi, 2020).

k is the number of nearest neighbors. w is the Theiler window, which controls the number of temporal neighbors that are excluded during neighbor searches.

Compatible definitions

Usage

Examples

using Associations
 using Random; rng = MersenneTwister(1234)
 x = rand(rng, 10000)
 y = rand(rng, 10000) .+ x
 z = rand(rng, 10000) .+ y
-association(MesnerShalizi(; k = 10), x, z, y) # should be near 0 (and can be negative)
source
Associations.RahimzamaniType
Rahimzamani <: ConditionalMutualInformationEstimator
+association(MesnerShalizi(; k = 10), x, z, y) # should be near 0 (and can be negative)
source
Associations.RahimzamaniType
Rahimzamani <: ConditionalMutualInformationEstimator
 Rahimzamani(k = 1, w = 0)

The Rahimzamani ConditionalMutualInformationEstimator is designed for data that can be mixtures of discrete and continuous data (Rahimzamani et al., 2018).

Compatible definitions

Usage

Description

This estimator is very similar to the GaoKannanOhViswanath mutual information estimator, but has been expanded to the conditional mutual information case.

k is the number of nearest neighbors. w is the Theiler window, which controls the number of temporal neighbors that are excluded during neighbor searches.

Examples

using Associations
 using Random; rng = MersenneTwister(1234)
 x = rand(rng, 10000)
 y = rand(rng, 10000) .+ x
 z = rand(rng, 10000) .+ y
-association(Rahimzamani(; k = 10), x, z, y) # should be near 0 (and can be negative)
source
Associations.PoczosSchneiderCMIType
PoczosSchneiderCMI <: ConditionalMutualInformationEstimator
+association(Rahimzamani(; k = 10), x, z, y) # should be near 0 (and can be negative)
source
Associations.PoczosSchneiderCMIType
PoczosSchneiderCMI <: ConditionalMutualInformationEstimator
 PoczosSchneiderCMI(definition = CMIRenyiPoczos(); k = 1, w = 0)

The PoczosSchneiderCMI ConditionalMutualInformationEstimator computes conditional mutual informations using a k-th nearest neighbor approach (Póczos and Schneider, 2012).

k is the number of nearest neighbors. w is the Theiler window, which controls the number of temporal neighbors that are excluded during neighbor searches.

Compatible definitions

Usage

Examples

using Associations
 using Random; rng = MersenneTwister(1234)
 x = rand(rng, 10000)
 y = rand(rng, 10000) .+ x
 z = rand(rng, 10000) .+ y
-association(PoczosSchneiderCMI(CMIRenyiPoczos(), k = 10), x, z, y) # should be near 0 (and can be negative)
source

Transfer entropy estimators

Associations.Zhu1Type
Zhu1 <: TransferEntropyEstimator
+association(PoczosSchneiderCMI(CMIRenyiPoczos(), k = 10), x, z, y) # should be near 0 (and can be negative)
source

Transfer entropy estimators

Associations.Zhu1Type
Zhu1 <: TransferEntropyEstimator
 Zhu1(k = 1, w = 0, base = MathConstants.e)

The Zhu1 transfer entropy estimator (Zhu et al., 2015) for normalized input data (as described in Zhu et al. (2015)) for both for pairwise and conditional transfer entropy.

Compatible definitions

Usage

Description

This estimator approximates probabilities within hyperrectangles surrounding each point xᵢ ∈ x using using k nearest neighbor searches. However, it also considers the number of neighbors falling on the borders of these hyperrectangles. This estimator is an extension to the entropy estimator in Singh et al. (2003).

w is the Theiler window, which determines if temporal neighbors are excluded during neighbor searches (defaults to 0, meaning that only the point itself is excluded when searching for neighbours).

Description

For a given points in the joint embedding space jᵢ, this estimator first computes the distance dᵢ from jᵢ to its k-th nearest neighbor. Then, for each point mₖ[i] in the k-th marginal space, it counts the number of points within radius dᵢ.

The Shannon transfer entropy is then computed as

\[TE_S(X \to Y) = \psi(k) + \dfrac{1}{N} \sum_{i}^n \left[ @@ -82,7 +82,7 @@ y = rand(rng, 10000) .+ x z = rand(rng, 10000) .+ y est = Zhu1(TEShannon(), k = 10) -association(est, x, z, y) # should be near 0 (and can be negative)

source
Associations.LindnerType
Lindner <: TransferEntropyEstimator
+association(est, x, z, y) # should be near 0 (and can be negative)
source
Associations.LindnerType
Lindner <: TransferEntropyEstimator
 Lindner(definition = Shannon(); k = 1, w = 0, base = 2)

The Lindner transfer entropy estimator (Lindner et al., 2011), which is also used in the Trentool MATLAB toolbox, and is based on nearest neighbor searches.

Compatible definitions

Usage

Keyword parameters

w is the Theiler window, which determines if temporal neighbors are excluded during neighbor searches (defaults to 0, meaning that only the point itself is excluded when searching for neighbours).

The estimator can be used both for pairwise and conditional transfer entropy estimation.

Description

For a given points in the joint embedding space jᵢ, this estimator first computes the distance dᵢ from jᵢ to its k-th nearest neighbor. Then, for each point mₖ[i] in the k-th marginal space, it counts the number of points within radius dᵢ.

The Shannon transfer entropy is then computed as

\[TE_S(X \to Y) = \psi(k) + \dfrac{1}{N} \sum_{i}^n \left[ @@ -93,13 +93,13 @@ y = rand(rng, 10000) .+ x z = rand(rng, 10000) .+ y est = Lindner(TEShannon(), k = 10) -association(est, x, z, y) # should be near 0 (and can be negative)

source
Associations.SymbolicTransferEntropyType
SymbolicTransferEntropy <: TransferEntropyEstimator
 SymbolicTransferEntropy(definition = TEShannon(); m = 3, τ = 1, 
-    lt = ComplexityMeasures.isless_rand

A convenience estimator for symbolic transfer entropy (Staniek and Lehnertz, 2008).

Compatible measures

Description

Symbolic transfer entropy consists of two simple steps. First, the input time series are encoded using codify with the CodifyVariables discretization and the OrdinalPatterns outcome space. This transforms the input time series into integer time series. Transfer entropy entropy is then estimated from the encoded time series by applying

Transfer entropy is then estimated as usual on the encoded timeseries with the embedding dictated by definition and the JointProbabilities estimator.

Examples

source
Associations.HilbertType
Hilbert(est;
+    lt = ComplexityMeasures.isless_rand

A convenience estimator for symbolic transfer entropy (Staniek and Lehnertz, 2008).

Compatible measures

Description

Symbolic transfer entropy consists of two simple steps. First, the input time series are encoded using codify with the CodifyVariables discretization and the OrdinalPatterns outcome space. This transforms the input time series into integer time series. Transfer entropy entropy is then estimated from the encoded time series by applying

Transfer entropy is then estimated as usual on the encoded timeseries with the embedding dictated by definition and the JointProbabilities estimator.

Examples

source
Associations.HilbertType
Hilbert(est;
     source::InstantaneousSignalProperty = Phase(),
     target::InstantaneousSignalProperty = Phase(),
     cond::InstantaneousSignalProperty = Phase())
-) <: TransferDifferentialEntropyEstimator

Compute transfer entropy on instantaneous phases/amplitudes of relevant signals, which are obtained by first applying the Hilbert transform to each signal, then extracting the phases/amplitudes of the resulting complex numbers (Paluš, 2014). Original time series are thus transformed to instantaneous phase/amplitude time series. Transfer entropy is then estimated using the provided est on those phases/amplitudes (use e.g. ValueBinning, or OrdinalPatterns).

Info

Details on estimation of the transfer entropy (conditional mutual information) following the phase/amplitude extraction step is not given in Palus (2014). Here, after instantaneous phases/amplitudes have been obtained, these are treated as regular time series, from which transfer entropy is then computed as usual.

See also: Phase, Amplitude.

source
Associations.PhaseType
Phase <: InstantaneousSignalProperty

Indicates that the instantaneous phases of a signal should be used.

source
Associations.AmplitudeType
Amplitude <: InstantaneousSignalProperty

Indicates that the instantaneous amplitudes of a signal should be used.

source

A small tutorial

Associations.jl extends the single-variate information API in ComplexityMeasures.jl to information measures of multiple variables.

Definitions

We define "information measure" as some functional of probability mass functions or probability densities. This definition may or may not agree with literature usage, depending on the context. We made this choice pragmatically based on user-friendlyness and coding-friendlyness, but still trying to maintain some level of meaningful terminology.

A note on naming: the same name for different things?

Upon doing a literature review on the possible variants of information theoretic measures, it become painstakingly obvious that authors use the same name for different concepts. For novices, and experienced practitioners too, this can be confusing. Our API clearly distinguishes between methods that are conceptually the same but named differently in the literature due to differing estimation strategies, from methods that actually have different definitions.

  • Multiple, equivalent definitions occur for example for the Shannon mutual information (MI; MIShannon), which has both a discrete and continuous version, and there there are multiple equivalent mathematical formulas for them: a direct sum/integral over a joint probability mass function (pmf), as a sum of three entropy terms, and as a Kullback-Leibler divergence between the joint pmf and the product of the marginal distributions. Since these definitions are all equivalent, we only need once type (MIShannon) to represent them.
  • But Shannon MI is not the only type of mutual information! For example, "Tsallis mutual information" has been proposed in different variants by various authors. Despite sharing the same name, these are actually nonequivalent definitions. We've thus assigned them entirely different measure names (e.g. MITsallisFuruichi and MITsallisMartin), with the author name at the end.

Basic estimation strategy

To estimate a multivariate information measure in practice, you must first specify the definition of the measure, which is then used as input to an estimator of that measure. This estimator is then given to association. Every information measure has at least one estimator: JointProbabilities. Many measures have several additional estimators, and an overview can be found in the docstring for MultivariateInformationMeasureEstimator.

Distances/divergences

There are many information measures in the literature that aim to quantify the distance/divergence between two probability mass functions (pmf) or densities. You can find those that we implement here.

As an example, let's quantify the KLDivergence between two probability mass functions estimated by symbolizing two input vectors x and y using OrdinalPatterns. Since the discrete KLDivergence can be expressed as a function of a joint pmf, we can use the JointProbabilities estimator.

using Associations
+) <: TransferDifferentialEntropyEstimator

Compute transfer entropy on instantaneous phases/amplitudes of relevant signals, which are obtained by first applying the Hilbert transform to each signal, then extracting the phases/amplitudes of the resulting complex numbers (Paluš, 2014). Original time series are thus transformed to instantaneous phase/amplitude time series. Transfer entropy is then estimated using the provided est on those phases/amplitudes (use e.g. ValueBinning, or OrdinalPatterns).

Info

Details on estimation of the transfer entropy (conditional mutual information) following the phase/amplitude extraction step is not given in Palus (2014). Here, after instantaneous phases/amplitudes have been obtained, these are treated as regular time series, from which transfer entropy is then computed as usual.

See also: Phase, Amplitude.

source
Associations.PhaseType
Phase <: InstantaneousSignalProperty

Indicates that the instantaneous phases of a signal should be used.

source
Associations.AmplitudeType
Amplitude <: InstantaneousSignalProperty

Indicates that the instantaneous amplitudes of a signal should be used.

source

A small tutorial

Associations.jl extends the single-variate information API in ComplexityMeasures.jl to information measures of multiple variables.

Definitions

We define "information measure" as some functional of probability mass functions or probability densities. This definition may or may not agree with literature usage, depending on the context. We made this choice pragmatically based on user-friendlyness and coding-friendlyness, but still trying to maintain some level of meaningful terminology.

A note on naming: the same name for different things?

Upon doing a literature review on the possible variants of information theoretic measures, it become painstakingly obvious that authors use the same name for different concepts. For novices, and experienced practitioners too, this can be confusing. Our API clearly distinguishes between methods that are conceptually the same but named differently in the literature due to differing estimation strategies, from methods that actually have different definitions.

  • Multiple, equivalent definitions occur for example for the Shannon mutual information (MI; MIShannon), which has both a discrete and continuous version, and there there are multiple equivalent mathematical formulas for them: a direct sum/integral over a joint probability mass function (pmf), as a sum of three entropy terms, and as a Kullback-Leibler divergence between the joint pmf and the product of the marginal distributions. Since these definitions are all equivalent, we only need once type (MIShannon) to represent them.
  • But Shannon MI is not the only type of mutual information! For example, "Tsallis mutual information" has been proposed in different variants by various authors. Despite sharing the same name, these are actually nonequivalent definitions. We've thus assigned them entirely different measure names (e.g. MITsallisFuruichi and MITsallisMartin), with the author name at the end.

Basic estimation strategy

To estimate a multivariate information measure in practice, you must first specify the definition of the measure, which is then used as input to an estimator of that measure. This estimator is then given to association. Every information measure has at least one estimator: JointProbabilities. Many measures have several additional estimators, and an overview can be found in the docstring for MultivariateInformationMeasureEstimator.

Distances/divergences

There are many information measures in the literature that aim to quantify the distance/divergence between two probability mass functions (pmf) or densities. You can find those that we implement here.

As an example, let's quantify the KLDivergence between two probability mass functions estimated by symbolizing two input vectors x and y using OrdinalPatterns. Since the discrete KLDivergence can be expressed as a function of a joint pmf, we can use the JointProbabilities estimator.

using Associations
 using Random; rng = MersenneTwister(1234)
 x, y = rand(rng, 1000), rand(rng, 1000)
 
@@ -160,4 +160,4 @@
 
 # Now estimate mutual information
 est = JointProbabilities(MIShannon(), discretization)
-association(est, x, y)
0.025991777755365167
+association(est, x, y)
0.025991777755365167
diff --git a/dev/api/information_single_variable_api/index.html b/dev/api/information_single_variable_api/index.html index f1b2b6e9..54992b01 100644 --- a/dev/api/information_single_variable_api/index.html +++ b/dev/api/information_single_variable_api/index.html @@ -24,7 +24,7 @@ h_sh = information(Kraskov(Shannon()), x) h_vc = information(Vasicek(Shannon()), x)

A normal distribution has a base-e Shannon differential entropy of 0.5*log(2π) + 0.5 nats.

est = Kraskov(k = 5, base = ℯ) # Base `ℯ` for nats.
 h = information(est, randn(2_000_000))
-abs(h - 0.5*log(2π) - 0.5) # ≈ 0.0001
source
information(est::MultivariateInformationMeasureEstimator, x...)

Estimate some MultivariateInformationMeasure on input data x..., using the given MultivariateInformationMeasureEstimator.

This is just a convenience wrapper around association(est, x...).

source

Single-variable information measures

Single-variable information measures

ComplexityMeasures.ShannonType
Shannon <: InformationMeasure
 Shannon(; base = 2)

The Shannon (Shannon, 1948) entropy, used with information to compute:

\[H(p) = - \sum_i p[i] \log(p[i])\]

with the $\log$ at the given base.

The maximum value of the Shannon entropy is $\log_{base}(L)$, which is the entropy of the uniform distribution with $L$ the total_outcomes.

source
ComplexityMeasures.RenyiType
Renyi <: InformationMeasure
 Renyi(q, base = 2)
 Renyi(; q = 1.0, base = 2)

The Rényi generalized order-q entropy (Rényi, 1961), used with information to compute an entropy with units given by base (typically 2 or MathConstants.e).

Description

Let $p$ be an array of probabilities (summing to 1). Then the Rényi generalized entropy is

\[H_q(p) = \frac{1}{1-q} \log \left(\sum_i p[i]^q\right)\]

and generalizes other known entropies, like e.g. the information entropy ($q = 1$, see Shannon (1948)), the maximum entropy ($q=0$, also known as Hartley entropy), or the correlation entropy ($q = 2$, also known as collision entropy).

The maximum value of the Rényi entropy is $\log_{base}(L)$, which is the entropy of the uniform distribution with $L$ the total_outcomes.

source
+\right],\]

where

\[\tilde{X}_{(i)} = \dfrac{1}{2m + 1} \sum_{j = i - m}^{i + m} X_{(j)}.\]

See also: information, AlizadehArghami, Ebrahimi, Vasicek, DifferentialInfoEstimator.

source
diff --git a/dev/associations/index.html b/dev/associations/index.html index 7575f66e..c9723cfa 100644 --- a/dev/associations/index.html +++ b/dev/associations/index.html @@ -1,56 +1,56 @@ Association measures · Associations.jl

Associations

Association API

The most basic components of Associations.jl are a collection of statistics that in some manner quantify the "association" between input datasets. Precisely what is meant by "association" depends on the measure, and precisely what is meant by "quantify" depends on the estimator of that measure. We formalize this notion below with the association function, which dispatches on AssociationMeasureEstimator and AssociationMeasure.

Associations.associationFunction
association(estimator::AssociationMeasureEstimator, x, y, [z, ...]) → r
-association(definition::AssociationMeasure, x, y, [z, ...]) → r

Estimate the (conditional) association between input variables x, y, z, … using the given estimator (an AssociationMeasureEstimator) or definition (an AssociationMeasure).

Info

The type of the return value r depends on the measure/estimator. The interpretation of the returned value also depends on the specific measure and estimator used.

Examples

The examples section of the online documentation has numerous using association.

source
Associations.AssociationMeasureType
AssociationMeasure

The supertype of all association measures.

Abstract implementations

Currently, the association measures are classified by abstract classes listed below. These abstract classes offer common functionality among association measures that are conceptually similar. This makes maintenance and framework extension easier than if each measure was implemented "in isolation".

Concrete implementations

Concrete subtypes are given as input to association. Many of these types require an AssociationMeasureEstimator to compute.

TypeAssociationMeasurePairwiseConditional
CorrelationPearsonCorrelation
CorrelationPartialCorrelation
CorrelationDistanceCorrelation
CorrelationChatterjeeCorrelation
CorrelationAzadkiaChatterjeeCoefficient
ClosenessSMeasure
ClosenessHMeasure
ClosenessMMeasure
Closeness (ranks)LMeasure
ClosenessJointDistanceDistribution
Cross-mappingPairwiseAsymmetricInference
Cross-mappingConvergentCrossMapping
Conditional recurrenceMCR
Conditional recurrenceRMCD
Shared informationMIShannon
Shared informationMIRenyiJizba
Shared informationMIRenyiSarbu
Shared informationMITsallisFuruichi
Shared informationPartialCorrelation
Shared informationCMIShannon
Shared informationCMIRenyiSarbu
Shared informationCMIRenyiJizba
Shared informationCMIRenyiPoczos
Shared informationCMITsallisPapapetrou
Information transferTEShannon
Information transferTERenyiJizba
Partial mutual informationPartialMutualInformation
Information measureJointEntropyShannon
Information measureJointEntropyRenyi
Information measureJointEntropyTsallis
Information measureConditionalEntropyShannon
Information measureConditionalEntropyTsallisAbe
Information measureConditionalEntropyTsallisFuruichi
DivergenceHellingerDistance
DivergenceKLDivergence
DivergenceRenyiDivergence
DivergenceVariationDistance
source
Associations.AssociationMeasureEstimatorType
AssociationMeasureEstimator

The supertype of all association measure estimators.

Concrete subtypes are given as input to association.

Abstract subtypes

Concrete implementations

AssociationMeasureEstimators
PearsonCorrelationNot required
DistanceCorrelationNot required
PartialCorrelationNot required
ChatterjeeCorrelationNot required
AzadkiaChatterjeeCoefficientNot required
SMeasureNot required
HMeasureNot required
MMeasureNot required
LMeasureNot required
JointDistanceDistributionNot required
PairwiseAsymmetricInferenceRandomVectors, RandomSegment
ConvergentCrossMappingRandomVectors, RandomSegment
MCRNot required
RMCDNot required
MIShannonJointProbabilities, EntropyDecomposition, KraskovStögbauerGrassberger1, KraskovStögbauerGrassberger2, GaoOhViswanath, GaoKannanOhViswanath, GaussianMI
MIRenyiJizbaJointProbabilities, EntropyDecomposition
MIRenyiSarbuJointProbabilities
MITsallisFuruichiJointProbabilities, EntropyDecomposition
MITsallisMartinJointProbabilities, EntropyDecomposition
CMIShannonJointProbabilities, EntropyDecomposition, MIDecomposition, GaussianCMI, FPVP, MesnerShalizi, Rahimzamani
CMIRenyiSarbuJointProbabilities
CMIRenyiJizbaJointProbabilities, EntropyDecomposition
CMIRenyiPoczosPoczosSchneiderCMI
CMITsallisPapapetrouJointProbabilities
TEShannonJointProbabilities, EntropyDecomposition, Zhu1, Lindner
TERenyiJizbaJointProbabilities
PartialMutualInformationJointProbabilities
JointEntropyShannonJointProbabilities
JointEntropyRenyiJointProbabilities
JointEntropyTsallisJointProbabilities
ConditionalEntropyShannonJointProbabilities
ConditionalEntropyTsallisAbeJointProbabilities
ConditionalEntropyTsallisFuruichiJointProbabilities
HellingerDistanceJointProbabilities
KLDivergenceJointProbabilities
RenyiDivergenceJointProbabilities
VariationDistanceJointProbabilities
source

Here are some examples of how to use association.

julia> using Associations
julia> x, y, z = rand(1000), rand(1000), rand(1000);
julia> association(LMeasure(), x, y)-0.028721492576914268
julia> association(DistanceCorrelation(), x, y)0.03277755494791034
julia> association(JointProbabilities(JointEntropyShannon(), CodifyVariables(Dispersion(c = 3, m = 2))), x, y)3.1202295420780524
julia> association(EntropyDecomposition(MIShannon(), PlugIn(Shannon()), CodifyVariables(OrdinalPatterns(m=3))), x, y)0.016949643131152214
julia> association(KSG2(MIShannon(base = 2)), x, y)0.04658552635176197
julia> association(JointProbabilities(PartialMutualInformation(), CodifyVariables(OrdinalPatterns(m=3))), x, y, z)0.24763356519325058
julia> association(FPVP(CMIShannon(base = 2)), x, y, z)-0.4908927962620927

Information measures

Associations.MultivariateInformationMeasureType
MultivariateInformationMeasure <: AssociationMeasure

The supertype for all multivariate information-based measure definitions.

Definition

Following Datseris and Haaga (2024), we define a multivariate information measure as any functional of a multidimensional probability mass functions (PMFs) or multidimensional probability density.

Implementations

JointEntropy definitions:

ConditionalEntropy definitions:

DivergenceOrDistance definitions:

MutualInformation definitions:

ConditionalMutualInformation definitions:

TransferEntropy definitions:

Other definitions:

source

Conditional entropies

Associations.ConditionalEntropyShannonType
ConditionalEntropyShannon <: ConditionalEntropy
-ConditionalEntropyShannon(; base = 2)

The Shannon conditional entropy measure.

Usage

  • Use with association to compute the Shannon conditional entropy between two variables.

Compatible estimators

Discrete definition

Sum formulation

The conditional entropy between discrete random variables $X$ and $Y$ with finite ranges $\mathcal{X}$ and $\mathcal{Y}$ is defined as

\[H^{S}(X | Y) = -\sum_{x \in \mathcal{X}, y \in \mathcal{Y}} p(x, y) \log(p(x | y)).\]

This is the definition used when calling association with a JointProbabilities estimator.

Two-entropies formulation

Equivalently, the following differenConditionalEntropy of entropies hold

\[H^S(X | Y) = H^S(X, Y) - H^S(Y),\]

where $H^S(\cdot)$ and $H^S(\cdot | \cdot)$ are the Shannon entropy and Shannon joint entropy, respectively. This is the definition used when calling association with a ProbabilitiesEstimator.

Differential definition

The differential conditional Shannon entropy is analogously defined as

\[H^S(X | Y) = h^S(X, Y) - h^S(Y),\]

where $h^S(\cdot)$ and $h^S(\cdot | \cdot)$ are the Shannon differential entropy and Shannon joint differential entropy, respectively. This is the definition used when calling association with a DifferentialInfoEstimator.

Estimation

source
Associations.ConditionalEntropyTsallisFuruichiType
ConditionalEntropyTsallisFuruichi <: ConditionalEntropy
+association(definition::AssociationMeasure, x, y, [z, ...]) → r

Estimate the (conditional) association between input variables x, y, z, … using the given estimator (an AssociationMeasureEstimator) or definition (an AssociationMeasure).

Info

The type of the return value r depends on the measure/estimator. The interpretation of the returned value also depends on the specific measure and estimator used.

Examples

The examples section of the online documentation has numerous using association.

source
Associations.AssociationMeasureType
AssociationMeasure

The supertype of all association measures.

Abstract implementations

Currently, the association measures are classified by abstract classes listed below. These abstract classes offer common functionality among association measures that are conceptually similar. This makes maintenance and framework extension easier than if each measure was implemented "in isolation".

Concrete implementations

Concrete subtypes are given as input to association. Many of these types require an AssociationMeasureEstimator to compute.

TypeAssociationMeasurePairwiseConditional
CorrelationPearsonCorrelation
CorrelationPartialCorrelation
CorrelationDistanceCorrelation
CorrelationChatterjeeCorrelation
CorrelationAzadkiaChatterjeeCoefficient
ClosenessSMeasure
ClosenessHMeasure
ClosenessMMeasure
Closeness (ranks)LMeasure
ClosenessJointDistanceDistribution
Cross-mappingPairwiseAsymmetricInference
Cross-mappingConvergentCrossMapping
Conditional recurrenceMCR
Conditional recurrenceRMCD
Shared informationMIShannon
Shared informationMIRenyiJizba
Shared informationMIRenyiSarbu
Shared informationMITsallisFuruichi
Shared informationPartialCorrelation
Shared informationCMIShannon
Shared informationCMIRenyiSarbu
Shared informationCMIRenyiJizba
Shared informationCMIRenyiPoczos
Shared informationCMITsallisPapapetrou
Shared informationShortExpansionConditionalMutualInformation
Information transferTEShannon
Information transferTERenyiJizba
Partial mutual informationPartialMutualInformation
Information measureJointEntropyShannon
Information measureJointEntropyRenyi
Information measureJointEntropyTsallis
Information measureConditionalEntropyShannon
Information measureConditionalEntropyTsallisAbe
Information measureConditionalEntropyTsallisFuruichi
DivergenceHellingerDistance
DivergenceKLDivergence
DivergenceRenyiDivergence
DivergenceVariationDistance
source
Associations.AssociationMeasureEstimatorType
AssociationMeasureEstimator

The supertype of all association measure estimators.

Concrete subtypes are given as input to association.

Abstract subtypes

Concrete implementations

AssociationMeasureEstimators
PearsonCorrelationNot required
DistanceCorrelationNot required
PartialCorrelationNot required
ChatterjeeCorrelationNot required
AzadkiaChatterjeeCoefficientNot required
SMeasureNot required
HMeasureNot required
MMeasureNot required
LMeasureNot required
JointDistanceDistributionNot required
PairwiseAsymmetricInferenceRandomVectors, RandomSegment
ConvergentCrossMappingRandomVectors, RandomSegment
MCRNot required
RMCDNot required
MIShannonJointProbabilities, EntropyDecomposition, KraskovStögbauerGrassberger1, KraskovStögbauerGrassberger2, GaoOhViswanath, GaoKannanOhViswanath, GaussianMI
MIRenyiJizbaJointProbabilities, EntropyDecomposition
MIRenyiSarbuJointProbabilities
MITsallisFuruichiJointProbabilities, EntropyDecomposition
MITsallisMartinJointProbabilities, EntropyDecomposition
CMIShannonJointProbabilities, EntropyDecomposition, MIDecomposition, GaussianCMI, FPVP, MesnerShalizi, Rahimzamani
CMIRenyiSarbuJointProbabilities
CMIRenyiJizbaJointProbabilities, EntropyDecomposition
CMIRenyiPoczosPoczosSchneiderCMI
CMITsallisPapapetrouJointProbabilities
TEShannonJointProbabilities, EntropyDecomposition, Zhu1, Lindner
TERenyiJizbaJointProbabilities
PartialMutualInformationJointProbabilities
ShortExpansionConditionalMutualInformationJointProbabilities
JointEntropyShannonJointProbabilities
JointEntropyRenyiJointProbabilities
JointEntropyTsallisJointProbabilities
ConditionalEntropyShannonJointProbabilities
ConditionalEntropyTsallisAbeJointProbabilities
ConditionalEntropyTsallisFuruichiJointProbabilities
HellingerDistanceJointProbabilities
KLDivergenceJointProbabilities
RenyiDivergenceJointProbabilities
VariationDistanceJointProbabilities
source

Here are some examples of how to use association.

julia> using Associations
julia> x, y, z = rand(1000), rand(1000), rand(1000);
julia> association(LMeasure(), x, y)-0.007427105820680123
julia> association(DistanceCorrelation(), x, y)0.05850168176552856
julia> association(JointProbabilities(JointEntropyShannon(), CodifyVariables(Dispersion(c = 3, m = 2))), x, y)3.106557009384795
julia> association(EntropyDecomposition(MIShannon(), PlugIn(Shannon()), CodifyVariables(OrdinalPatterns(m=3))), x, y)0.010725153502766815
julia> association(KSG2(MIShannon(base = 2)), x, y)0.10388619000287148
julia> association(JointProbabilities(PartialMutualInformation(), CodifyVariables(OrdinalPatterns(m=3))), x, y, z)0.23844643640346927
julia> association(FPVP(CMIShannon(base = 2)), x, y, z)-0.3106716067920897

Information measures

Associations.MultivariateInformationMeasureType
MultivariateInformationMeasure <: AssociationMeasure

The supertype for all multivariate information-based measure definitions.

Definition

Following Datseris and Haaga (2024), we define a multivariate information measure as any functional of a multidimensional probability mass functions (PMFs) or multidimensional probability density.

Implementations

JointEntropy definitions:

ConditionalEntropy definitions:

DivergenceOrDistance definitions:

MutualInformation definitions:

ConditionalMutualInformation definitions:

TransferEntropy definitions:

Other definitions:

source

Conditional entropies

Associations.ConditionalEntropyShannonType
ConditionalEntropyShannon <: ConditionalEntropy
+ConditionalEntropyShannon(; base = 2)

The Shannon conditional entropy measure.

Usage

  • Use with association to compute the Shannon conditional entropy between two variables.

Compatible estimators

Discrete definition

Sum formulation

The conditional entropy between discrete random variables $X$ and $Y$ with finite ranges $\mathcal{X}$ and $\mathcal{Y}$ is defined as

\[H^{S}(X | Y) = -\sum_{x \in \mathcal{X}, y \in \mathcal{Y}} p(x, y) \log(p(x | y)).\]

This is the definition used when calling association with a JointProbabilities estimator.

Two-entropies formulation

Equivalently, the following differenConditionalEntropy of entropies hold

\[H^S(X | Y) = H^S(X, Y) - H^S(Y),\]

where $H^S(\cdot)$ and $H^S(\cdot | \cdot)$ are the Shannon entropy and Shannon joint entropy, respectively. This is the definition used when calling association with a ProbabilitiesEstimator.

Differential definition

The differential conditional Shannon entropy is analogously defined as

\[H^S(X | Y) = h^S(X, Y) - h^S(Y),\]

where $h^S(\cdot)$ and $h^S(\cdot | \cdot)$ are the Shannon differential entropy and Shannon joint differential entropy, respectively. This is the definition used when calling association with a DifferentialInfoEstimator.

Estimation

source
Associations.ConditionalEntropyTsallisFuruichiType
ConditionalEntropyTsallisFuruichi <: ConditionalEntropy
 ConditionalEntropyTsallisFuruichi(; base = 2, q = 1.5)

Furuichi (2006)'s discrete Tsallis conditional entropy definition.

Usage

  • Use with association to compute the Tsallis-Furuichi conditional entropy between two variables.

Compatible estimators

Definition

Furuichi's Tsallis conditional entropy between discrete random variables $X$ and $Y$ with finite ranges $\mathcal{X}$ and $\mathcal{Y}$ is defined as

\[H_q^T(X | Y) = -\sum_{x \in \mathcal{X}, y \in \mathcal{Y}} p(x, y)^q \log_q(p(x | y)),\]

$\ln_q(x) = \frac{x^{1-q} - 1}{1 - q}$ and $q \neq 1$. For $q = 1$, $H_q^T(X | Y)$ reduces to the Shannon conditional entropy:

\[H_{q=1}^T(X | Y) = -\sum_{x \in \mathcal{X}, y \in \mathcal{Y}} = -p(x, y) \log(p(x | y))\]

If any of the entries of the marginal distribution for Y are zero, or the q-logarithm is undefined for a particular value, then the measure is undefined and NaN is returned.

Estimation

source
Associations.ConditionalEntropyTsallisAbeType
ConditionalEntropyTsallisAbe <: ConditionalEntropy
-ConditionalEntropyTsallisAbe(; base = 2, q = 1.5)

Abe and Rajagopal (2001)'s discrete Tsallis conditional entropy measure.

Usage

  • Use with association to compute the Tsallis-Abe conditional entropy between two variables.

Compatible estimators

Definition

Abe & Rajagopal's Tsallis conditional entropy between discrete random variables $X$ and $Y$ with finite ranges $\mathcal{X}$ and $\mathcal{Y}$ is defined as

\[H_q^{T_A}(X | Y) = \dfrac{H_q^T(X, Y) - H_q^T(Y)}{1 + (1-q)H_q^T(Y)},\]

where $H_q^T(\cdot)$ and $H_q^T(\cdot, \cdot)$ is the Tsallis entropy and the joint Tsallis entropy.

Estimation

source

Divergences and distances

Associations.DivergenceOrDistanceType
DivergenceOrDistance <: BivariateInformationMeasure

The supertype for bivariate information measures aiming to quantify some sort of divergence, distance or closeness between two probability distributions.

Some of these measures are proper metrics, while others are not, but they have in common that they aim to quantify how "far from each other" two probabilities distributions are.

Concrete implementations

source
Associations.HellingerDistanceType
HellingerDistance <: DivergenceOrDistance

The Hellinger distance.

Usage

  • Use with association to compute the compute the Hellinger distance between two pre-computed probability distributions, or from raw data using one of the estimators listed below.

Compatible estimators

Description

The Hellinger distance between two probability distributions $P_X = (p_x(\omega_1), \ldots, p_x(\omega_n))$ and $P_Y = (p_y(\omega_1), \ldots, p_y(\omega_m))$, both defined over the same OutcomeSpace $\Omega = \{\omega_1, \ldots, \omega_n \}$, is defined as

\[D_{H}(P_Y(\Omega) || P_Y(\Omega)) = -\dfrac{1}{\sqrt{2}} \sum_{\omega \in \Omega} (\sqrt{p_x(\omega)} - \sqrt{p_y(\omega)})^2\]

Estimation

source
Associations.KLDivergenceType
KLDivergence <: DivergenceOrDistance

The Kullback-Leibler (KL) divergence.

Usage

  • Use with association to compute the compute the KL-divergence between two pre-computed probability distributions, or from raw data using one of the estimators listed below.

Compatible estimators

Estimators

Description

The KL-divergence between two probability distributions $P_X = (p_x(\omega_1), \ldots, p_x(\omega_n))$ and $P_Y = (p_y(\omega_1), \ldots, p_y(\omega_m))$, both defined over the same OutcomeSpace $\Omega = \{\omega_1, \ldots, \omega_n \}$, is defined as

\[D_{KL}(P_Y(\Omega) || P_Y(\Omega)) = -\sum_{\omega \in \Omega} p_x(\omega) \log\dfrac{p_x(\omega)}{p_y(\omega)}\]

Implements

Note

Distances.jl also defines KLDivergence. Quality it if you're loading both packages, i.e. do association(Associations.KLDivergence(), x, y).

Estimation

source
Associations.RenyiDivergenceType
RenyiDivergence <: DivergenceOrDistance
+p(x, y) \log(p(x | y))\]

If any of the entries of the marginal distribution for Y are zero, or the q-logarithm is undefined for a particular value, then the measure is undefined and NaN is returned.

Estimation

source
Associations.ConditionalEntropyTsallisAbeType
ConditionalEntropyTsallisAbe <: ConditionalEntropy
+ConditionalEntropyTsallisAbe(; base = 2, q = 1.5)

Abe and Rajagopal (2001)'s discrete Tsallis conditional entropy measure.

Usage

  • Use with association to compute the Tsallis-Abe conditional entropy between two variables.

Compatible estimators

Definition

Abe & Rajagopal's Tsallis conditional entropy between discrete random variables $X$ and $Y$ with finite ranges $\mathcal{X}$ and $\mathcal{Y}$ is defined as

\[H_q^{T_A}(X | Y) = \dfrac{H_q^T(X, Y) - H_q^T(Y)}{1 + (1-q)H_q^T(Y)},\]

where $H_q^T(\cdot)$ and $H_q^T(\cdot, \cdot)$ is the Tsallis entropy and the joint Tsallis entropy.

Estimation

source

Divergences and distances

Associations.DivergenceOrDistanceType
DivergenceOrDistance <: BivariateInformationMeasure

The supertype for bivariate information measures aiming to quantify some sort of divergence, distance or closeness between two probability distributions.

Some of these measures are proper metrics, while others are not, but they have in common that they aim to quantify how "far from each other" two probabilities distributions are.

Concrete implementations

source
Associations.HellingerDistanceType
HellingerDistance <: DivergenceOrDistance

The Hellinger distance.

Usage

  • Use with association to compute the compute the Hellinger distance between two pre-computed probability distributions, or from raw data using one of the estimators listed below.

Compatible estimators

Description

The Hellinger distance between two probability distributions $P_X = (p_x(\omega_1), \ldots, p_x(\omega_n))$ and $P_Y = (p_y(\omega_1), \ldots, p_y(\omega_m))$, both defined over the same OutcomeSpace $\Omega = \{\omega_1, \ldots, \omega_n \}$, is defined as

\[D_{H}(P_Y(\Omega) || P_Y(\Omega)) = +\dfrac{1}{\sqrt{2}} \sum_{\omega \in \Omega} (\sqrt{p_x(\omega)} - \sqrt{p_y(\omega)})^2\]

Estimation

source
Associations.KLDivergenceType
KLDivergence <: DivergenceOrDistance

The Kullback-Leibler (KL) divergence.

Usage

  • Use with association to compute the compute the KL-divergence between two pre-computed probability distributions, or from raw data using one of the estimators listed below.

Compatible estimators

Estimators

Description

The KL-divergence between two probability distributions $P_X = (p_x(\omega_1), \ldots, p_x(\omega_n))$ and $P_Y = (p_y(\omega_1), \ldots, p_y(\omega_m))$, both defined over the same OutcomeSpace $\Omega = \{\omega_1, \ldots, \omega_n \}$, is defined as

\[D_{KL}(P_Y(\Omega) || P_Y(\Omega)) = +\sum_{\omega \in \Omega} p_x(\omega) \log\dfrac{p_x(\omega)}{p_y(\omega)}\]

Implements

Note

Distances.jl also defines KLDivergence. Quality it if you're loading both packages, i.e. do association(Associations.KLDivergence(), x, y).

Estimation

source
Associations.RenyiDivergenceType
RenyiDivergence <: DivergenceOrDistance
 RenyiDivergence(q; base = 2)

The Rényi divergence of positive order q.

Usage

  • Use with association to compute the compute the Rényi divergence between two pre-computed probability distributions, or from raw data using one of the estimators listed below.

Compatible estimators

Description

The Rényi divergence between two probability distributions $P_X = (p_x(\omega_1), \ldots, p_x(\omega_n))$ and $P_Y = (p_y(\omega_1), \ldots, p_y(\omega_m))$, both defined over the same OutcomeSpace $\Omega = \{\omega_1, \ldots, \omega_n \}$, is defined as van Erven and Harremos (2014).

\[D_{q}(P_Y(\Omega) || P_Y(\Omega)) = -\dfrac{1}{q - 1} \log \sum_{\omega \in \Omega}p_x(\omega)^{q}p_y(\omega)^{1-\alpha}\]

Implements

Note

Distances.jl also defines RenyiDivergence. Quality it if you're loading both packages, i.e. do association(Associations.RenyiDivergence(), x, y).

Estimation

source
Associations.VariationDistanceType
VariationDistance <: DivergenceOrDistance

The variation distance.

Usage

  • Use with association to compute the compute the variation distance between two pre-computed probability distributions, or from raw data using one of the estimators listed below.

Compatible estimators

Description

The variation distance between two probability distributions $P_X = (p_x(\omega_1), \ldots, p_x(\omega_n))$ and $P_Y = (p_y(\omega_1), \ldots, p_y(\omega_m))$, both defined over the same OutcomeSpace $\Omega = \{\omega_1, \ldots, \omega_n \}$, is defined as

\[D_{V}(P_Y(\Omega) || P_Y(\Omega)) = -\dfrac{1}{2} \sum_{\omega \in \Omega} | p_x(\omega) - p_y(\omega) |\]

Examples

source

Joint entropies

Associations.JointEntropyShannonType
JointEntropyShannon <: JointEntropy
-JointEntropyShannon(; base = 2)

The Shannon joint entropy measure (Cover, 1999).

Usage

  • Use with association to compute the Shannon joint entropy between two variables.

Compatible estimators

Definition

Given two two discrete random variables $X$ and $Y$ with ranges $\mathcal{X}$ and $\mathcal{X}$, Cover (1999) defines the Shannon joint entropy as

\[H^S(X, Y) = -\sum_{x\in \mathcal{X}, y \in \mathcal{Y}} p(x, y) \log p(x, y),\]

where we define $log(p(x, y)) := 0$ if $p(x, y) = 0$.

Estimation

source
Associations.JointEntropyTsallisType
JointEntropyTsallis <: JointEntropy
-JointEntropyTsallis(; base = 2, q = 1.5)

The Tsallis joint entropy definition from Furuichi (2006).

Usage

  • Use with association to compute the Furuichi-Tsallis joint entropy between two variables.

Compatible estimators

Definition

Given two two discrete random variables $X$ and $Y$ with ranges $\mathcal{X}$ and $\mathcal{X}$, Furuichi (2006) defines the Tsallis joint entropy as

\[H_q^T(X, Y) = -\sum_{x\in \mathcal{X}, y \in \mathcal{Y}} p(x, y)^q \log_q p(x, y),\]

where $log_q(x, q) = \dfrac{x^{1-q} - 1}{1-q}$ is the q-logarithm, and we define $log_q(x, q) := 0$ if $q = 0$.

Estimation

source
Associations.JointEntropyRenyiType
JointEntropyRenyi <: JointEntropy
-JointEntropyRenyi(; base = 2, q = 1.5)

The Rényi joint entropy measure (Golshani et al., 2009).

Usage

  • Use with association to compute the Golshani-Rényi joint entropy between two variables.

Compatible estimators

Definition

Given two two discrete random variables $X$ and $Y$ with ranges $\mathcal{X}$ and $\mathcal{X}$, Golshani et al. (2009) defines the Rényi joint entropy as

\[H_q^R(X, Y) = \dfrac{1}{1-\alpha} \log \sum_{i = 1}^N p_i^q,\]

where $q > 0$ and $q != 1$.

Estimation

source

Mutual informations

Associations.MIShannonType
MIShannon <: BivariateInformationMeasure
+\dfrac{1}{q - 1} \log \sum_{\omega \in \Omega}p_x(\omega)^{q}p_y(\omega)^{1-\alpha}\]

Implements

Note

Distances.jl also defines RenyiDivergence. Quality it if you're loading both packages, i.e. do association(Associations.RenyiDivergence(), x, y).

Estimation

source
Associations.VariationDistanceType
VariationDistance <: DivergenceOrDistance

The variation distance.

Usage

  • Use with association to compute the compute the variation distance between two pre-computed probability distributions, or from raw data using one of the estimators listed below.

Compatible estimators

Description

The variation distance between two probability distributions $P_X = (p_x(\omega_1), \ldots, p_x(\omega_n))$ and $P_Y = (p_y(\omega_1), \ldots, p_y(\omega_m))$, both defined over the same OutcomeSpace $\Omega = \{\omega_1, \ldots, \omega_n \}$, is defined as

\[D_{V}(P_Y(\Omega) || P_Y(\Omega)) = +\dfrac{1}{2} \sum_{\omega \in \Omega} | p_x(\omega) - p_y(\omega) |\]

Examples

source

Joint entropies

Associations.JointEntropyShannonType
JointEntropyShannon <: JointEntropy
+JointEntropyShannon(; base = 2)

The Shannon joint entropy measure (Cover, 1999).

Usage

  • Use with association to compute the Shannon joint entropy between two variables.

Compatible estimators

Definition

Given two two discrete random variables $X$ and $Y$ with ranges $\mathcal{X}$ and $\mathcal{X}$, Cover (1999) defines the Shannon joint entropy as

\[H^S(X, Y) = -\sum_{x\in \mathcal{X}, y \in \mathcal{Y}} p(x, y) \log p(x, y),\]

where we define $log(p(x, y)) := 0$ if $p(x, y) = 0$.

Estimation

source
Associations.JointEntropyTsallisType
JointEntropyTsallis <: JointEntropy
+JointEntropyTsallis(; base = 2, q = 1.5)

The Tsallis joint entropy definition from Furuichi (2006).

Usage

  • Use with association to compute the Furuichi-Tsallis joint entropy between two variables.

Compatible estimators

Definition

Given two two discrete random variables $X$ and $Y$ with ranges $\mathcal{X}$ and $\mathcal{X}$, Furuichi (2006) defines the Tsallis joint entropy as

\[H_q^T(X, Y) = -\sum_{x\in \mathcal{X}, y \in \mathcal{Y}} p(x, y)^q \log_q p(x, y),\]

where $log_q(x, q) = \dfrac{x^{1-q} - 1}{1-q}$ is the q-logarithm, and we define $log_q(x, q) := 0$ if $q = 0$.

Estimation

source
Associations.JointEntropyRenyiType
JointEntropyRenyi <: JointEntropy
+JointEntropyRenyi(; base = 2, q = 1.5)

The Rényi joint entropy measure (Golshani et al., 2009).

Usage

  • Use with association to compute the Golshani-Rényi joint entropy between two variables.

Compatible estimators

Definition

Given two two discrete random variables $X$ and $Y$ with ranges $\mathcal{X}$ and $\mathcal{X}$, Golshani et al. (2009) defines the Rényi joint entropy as

\[H_q^R(X, Y) = \dfrac{1}{1-\alpha} \log \sum_{i = 1}^N p_i^q,\]

where $q > 0$ and $q != 1$.

Estimation

source

Mutual informations

Associations.MIShannonType
MIShannon <: BivariateInformationMeasure
 MIShannon(; base = 2)

The Shannon mutual information $I_S(X; Y)$.

Usage

  • Use with association to compute the raw Shannon mutual information from input data using of of the estimators listed below.
  • Use with independence to perform a formal hypothesis test for pairwise dependence using the Shannon mutual information.

Compatible estimators

Discrete definition

There are many equivalent formulations of discrete Shannon mutual information, meaning that it can be estimated in several ways, either using JointProbabilities (double-sum formulation), EntropyDecomposition (three-entropies decomposition), or some dedicated estimator.

Double sum formulation

Assume we observe samples $\bar{\bf{X}}_{1:N_y} = \{\bar{\bf{X}}_1, \ldots, \bar{\bf{X}}_n \}$ and $\bar{\bf{Y}}_{1:N_x} = \{\bar{\bf{Y}}_1, \ldots, \bar{\bf{Y}}_n \}$ from two discrete random variables $X$ and $Y$ with finite supports $\mathcal{X} = \{ x_1, x_2, \ldots, x_{M_x} \}$ and $\mathcal{Y} = y_1, y_2, \ldots, x_{M_y}$. The double-sum estimate is obtained by replacing the double sum

\[\hat{I}_{DS}(X; Y) = - \sum_{x_i \in \mathcal{X}, y_i \in \mathcal{Y}} p(x_i, y_j) \log \left( \dfrac{p(x_i, y_i)}{p(x_i)p(y_j)} \right)\]

where $\hat{p}(x_i) = \frac{n(x_i)}{N_x}$, $\hat{p}(y_i) = \frac{n(y_j)}{N_y}$, and $\hat{p}(x_i, x_j) = \frac{n(x_i)}{N}$, and $N = N_x N_y$. This definition is used by association when called with a JointProbabilities estimator.

Three-entropies formulation

An equivalent formulation of discrete Shannon mutual information is

\[I^S(X; Y) = H^S(X) + H_q^S(Y) - H^S(X, Y),\]

where $H^S(\cdot)$ and $H^S(\cdot, \cdot)$ are the marginal and joint discrete Shannon entropies. This definition is used by association when called with a EntropyDecomposition estimator and a discretization.

Differential mutual information

One possible formulation of differential Shannon mutual information is

\[I^S(X; Y) = h^S(X) + h_q^S(Y) - h^S(X, Y),\]

where $h^S(\cdot)$ and $h^S(\cdot, \cdot)$ are the marginal and joint differential Shannon entropies. This definition is used by association when called with EntropyDecomposition estimator and a DifferentialInfoEstimator.

Estimation

source
Associations.MITsallisFuruichiType
MITsallisFuruichi <: BivariateInformationMeasure
-MITsallisFuruichi(; base = 2, q = 1.5)

The discrete Tsallis mutual information from Furuichi (2006)(Furuichi, 2006), which in that paper is called the mutual entropy.

Usage

  • Use with association to compute the raw Tsallis-Furuichi mutual information from input data using of of the estimators listed below.
  • Use with independence to perform a formal hypothesis test for pairwise dependence using the Tsallis-Furuichi mutual information.

Compatible estimators

Description

Furuichi's Tsallis mutual entropy between variables $X \in \mathbb{R}^{d_X}$ and $Y \in \mathbb{R}^{d_Y}$ is defined as

\[I_q^T(X; Y) = H_q^T(X) - H_q^T(X | Y) = H_q^T(X) + H_q^T(Y) - H_q^T(X, Y),\]

where $H^T(\cdot)$ and $H^T(\cdot, \cdot)$ are the marginal and joint Tsallis entropies, and q is the Tsallis-parameter.

Estimation

source
Associations.MITsallisMartinType
MITsallisMartin <: BivariateInformationMeasure
-MITsallisMartin(; base = 2, q = 1.5)

The discrete Tsallis mutual information from Martin et al. (2004).

Usage

  • Use with association to compute the raw Tsallis-Martin mutual information from input data using of of the estimators listed below.
  • Use with independence to perform a formal hypothesis test for pairwise dependence using the Tsallis-Martin mutual information.

Compatible estimators

Description

Martin et al.'s Tsallis mutual information between variables $X \in \mathbb{R}^{d_X}$ and $Y \in \mathbb{R}^{d_Y}$ is defined as

\[I_{\text{Martin}}^T(X, Y, q) := H_q^T(X) + H_q^T(Y) - (1 - q) H_q^T(X) H_q^T(Y) - H_q(X, Y),\]

where $H^S(\cdot)$ and $H^S(\cdot, \cdot)$ are the marginal and joint Shannon entropies, and q is the Tsallis-parameter.

Estimation

source
Associations.MIRenyiJizbaType
MIRenyiJizba <: <: BivariateInformationMeasure
-MIRenyiJizba(; q = 1.5, base = 2)

The Rényi mutual information $I_q^{R_{J}}(X; Y)$ defined in (Jizba et al., 2012).

Usage

  • Use with association to compute the raw Rényi-Jizba mutual information from input data using of of the estimators listed below.
  • Use with independence to perform a formal hypothesis test for pairwise dependence using the Rényi-Jizba mutual information.

Compatible estimators

Definition

\[I_q^{R_{J}}(X; Y) = H_q^{R}(X) + H_q^{R}(Y) - H_q^{R}(X, Y),\]

where $H_q^{R}(\cdot)$ is the Rényi entropy.

Estimation

source
Associations.MIRenyiSarbuType
MIRenyiSarbu <: BivariateInformationMeasure
+ \sum_{x_i \in \mathcal{X}, y_i \in \mathcal{Y}} p(x_i, y_j) \log \left( \dfrac{p(x_i, y_i)}{p(x_i)p(y_j)} \right)\]

where $\hat{p}(x_i) = \frac{n(x_i)}{N_x}$, $\hat{p}(y_i) = \frac{n(y_j)}{N_y}$, and $\hat{p}(x_i, x_j) = \frac{n(x_i)}{N}$, and $N = N_x N_y$. This definition is used by association when called with a JointProbabilities estimator.

Three-entropies formulation

An equivalent formulation of discrete Shannon mutual information is

\[I^S(X; Y) = H^S(X) + H_q^S(Y) - H^S(X, Y),\]

where $H^S(\cdot)$ and $H^S(\cdot, \cdot)$ are the marginal and joint discrete Shannon entropies. This definition is used by association when called with a EntropyDecomposition estimator and a discretization.

Differential mutual information

One possible formulation of differential Shannon mutual information is

\[I^S(X; Y) = h^S(X) + h_q^S(Y) - h^S(X, Y),\]

where $h^S(\cdot)$ and $h^S(\cdot, \cdot)$ are the marginal and joint differential Shannon entropies. This definition is used by association when called with EntropyDecomposition estimator and a DifferentialInfoEstimator.

Estimation

source
Associations.MITsallisFuruichiType
MITsallisFuruichi <: BivariateInformationMeasure
+MITsallisFuruichi(; base = 2, q = 1.5)

The discrete Tsallis mutual information from Furuichi (2006)(Furuichi, 2006), which in that paper is called the mutual entropy.

Usage

  • Use with association to compute the raw Tsallis-Furuichi mutual information from input data using of of the estimators listed below.
  • Use with independence to perform a formal hypothesis test for pairwise dependence using the Tsallis-Furuichi mutual information.

Compatible estimators

Description

Furuichi's Tsallis mutual entropy between variables $X \in \mathbb{R}^{d_X}$ and $Y \in \mathbb{R}^{d_Y}$ is defined as

\[I_q^T(X; Y) = H_q^T(X) - H_q^T(X | Y) = H_q^T(X) + H_q^T(Y) - H_q^T(X, Y),\]

where $H^T(\cdot)$ and $H^T(\cdot, \cdot)$ are the marginal and joint Tsallis entropies, and q is the Tsallis-parameter.

Estimation

source
Associations.MITsallisMartinType
MITsallisMartin <: BivariateInformationMeasure
+MITsallisMartin(; base = 2, q = 1.5)

The discrete Tsallis mutual information from Martin et al. (2004).

Usage

  • Use with association to compute the raw Tsallis-Martin mutual information from input data using of of the estimators listed below.
  • Use with independence to perform a formal hypothesis test for pairwise dependence using the Tsallis-Martin mutual information.

Compatible estimators

Description

Martin et al.'s Tsallis mutual information between variables $X \in \mathbb{R}^{d_X}$ and $Y \in \mathbb{R}^{d_Y}$ is defined as

\[I_{\text{Martin}}^T(X, Y, q) := H_q^T(X) + H_q^T(Y) - (1 - q) H_q^T(X) H_q^T(Y) - H_q(X, Y),\]

where $H^S(\cdot)$ and $H^S(\cdot, \cdot)$ are the marginal and joint Shannon entropies, and q is the Tsallis-parameter.

Estimation

source
Associations.MIRenyiJizbaType
MIRenyiJizba <: <: BivariateInformationMeasure
+MIRenyiJizba(; q = 1.5, base = 2)

The Rényi mutual information $I_q^{R_{J}}(X; Y)$ defined in (Jizba et al., 2012).

Usage

  • Use with association to compute the raw Rényi-Jizba mutual information from input data using of of the estimators listed below.
  • Use with independence to perform a formal hypothesis test for pairwise dependence using the Rényi-Jizba mutual information.

Compatible estimators

Definition

\[I_q^{R_{J}}(X; Y) = H_q^{R}(X) + H_q^{R}(Y) - H_q^{R}(X, Y),\]

where $H_q^{R}(\cdot)$ is the Rényi entropy.

Estimation

source
Associations.MIRenyiSarbuType
MIRenyiSarbu <: BivariateInformationMeasure
 MIRenyiSarbu(; base = 2, q = 1.5)

The discrete Rényi mutual information from Sarbu (2014).

Usage

  • Use with association to compute the raw Rényi-Sarbu mutual information from input data using of of the estimators listed below.
  • Use with independence to perform a formal hypothesis test for pairwise dependence using the Rényi-Sarbu mutual information.

Compatible estimators

Description

Sarbu (2014) defines discrete Rényi mutual information as the Rényi $\alpha$-divergence between the conditional joint probability mass function $p(x, y)$ and the product of the conditional marginals, $p(x) \cdot p(y)$:

\[I(X, Y)^R_q = \dfrac{1}{q-1} \log \left( \sum_{x \in X, y \in Y} \dfrac{p(x, y)^q}{\left( p(x)\cdot p(y) \right)^{q-1}} -\right)\]

Estimation

source

Conditional mutual informations

Conditional mutual informations

Associations.CMIShannonType
CMIShannon <: ConditionalMutualInformation
 CMIShannon(; base = 2)

The Shannon conditional mutual information (CMI) $I^S(X; Y | Z)$.

Usage

  • Use with association to compute the raw Shannon conditional mutual information using of of the estimators listed below.
  • Use with independence to perform a formal hypothesis test for pairwise conditional independence using the Shannon conditional mutual information.

Compatible estimators

Supported definitions

Consider random variables $X \in \mathbb{R}^{d_X}$ and $Y \in \mathbb{R}^{d_Y}$, given $Z \in \mathbb{R}^{d_Z}$. The Shannon conditional mutual information is defined as

\[\begin{align*} I(X; Y | Z) &= H^S(X, Z) + H^S(Y, z) - H^S(X, Y, Z) - H^S(Z) \\ &= I^S(X; Y, Z) + I^S(X; Y) -\end{align*},\]

where $I^S(\cdot; \cdot)$ is the Shannon mutual information MIShannon, and $H^S(\cdot)$ is the Shannon entropy.

Differential Shannon CMI is obtained by replacing the entropies by differential entropies.

Estimation

source
Associations.CMIRenyiSarbuType
CMIRenyiSarbu <: ConditionalMutualInformation
+\end{align*},\]

where $I^S(\cdot; \cdot)$ is the Shannon mutual information MIShannon, and $H^S(\cdot)$ is the Shannon entropy.

Differential Shannon CMI is obtained by replacing the entropies by differential entropies.

Estimation

source
Associations.CMIRenyiSarbuType
CMIRenyiSarbu <: ConditionalMutualInformation
 CMIRenyiSarbu(; base = 2, q = 1.5)

The Rényi conditional mutual information from Sarbu (2014).

Usage

  • Use with association to compute the raw Rényi-Sarbu conditional mutual information using of of the estimators listed below.
  • Use with independence to perform a formal hypothesis test for pairwise conditional independence using the Rényi-Sarbu conditional mutual information.

Compatible estimators

Discrete description

Assume we observe three discrete random variables $X$, $Y$ and $Z$. Sarbu (2014) defines discrete conditional Rényi mutual information as the conditional Rényi $\alpha$-divergence between the conditional joint probability mass function $p(x, y | z)$ and the product of the conditional marginals, $p(x |z) \cdot p(y|z)$:

\[I(X, Y; Z)^R_q = \dfrac{1}{q-1} \sum_{z \in Z} p(Z = z) \log \left( \sum_{x \in X}\sum_{y \in Y} \dfrac{p(x, y|z)^q}{\left( p(x|z)\cdot p(y|z) \right)^{q-1}} -\right)\]

source
Associations.CMIRenyiJizbaType
CMIRenyiJizba <: ConditionalMutualInformation
-CMIRenyiJizba(; base = 2, q = 1.5)

The Rényi conditional mutual information $I_q^{R_{J}}(X; Y | Z)$ defined in Jizba et al. (2012).

Usage

  • Use with association to compute the raw Rényi-Jizba conditional mutual information using of of the estimators listed below.
  • Use with independence to perform a formal hypothesis test for pairwise conditional independence using the Rényi-Jizba conditional mutual information.

Compatible estimators

Definition

\[I_q^{R_{J}}(X; Y | Z) = I_q^{R_{J}}(X; Y, Z) - I_q^{R_{J}}(X; Z),\]

where $I_q^{R_{J}}(X; Z)$ is the MIRenyiJizba mutual information.

Estimation

source
Associations.CMIRenyiJizbaType
CMIRenyiJizba <: ConditionalMutualInformation
+CMIRenyiJizba(; base = 2, q = 1.5)

The Rényi conditional mutual information $I_q^{R_{J}}(X; Y | Z)$ defined in Jizba et al. (2012).

Usage

  • Use with association to compute the raw Rényi-Jizba conditional mutual information using of of the estimators listed below.
  • Use with independence to perform a formal hypothesis test for pairwise conditional independence using the Rényi-Jizba conditional mutual information.

Compatible estimators

Definition

\[I_q^{R_{J}}(X; Y | Z) = I_q^{R_{J}}(X; Y, Z) - I_q^{R_{J}}(X; Z),\]

where $I_q^{R_{J}}(X; Z)$ is the MIRenyiJizba mutual information.

Estimation

source
Associations.CMIRenyiPoczosType
CMIRenyiPoczos <: ConditionalMutualInformation
 CMIRenyiPoczos(; base = 2, q = 1.5)

The differential Rényi conditional mutual information $I_q^{R_{P}}(X; Y | Z)$ defined in Póczos and Schneider (2012).

Usage

  • Use with association to compute the raw Rényi-Poczos conditional mutual information using of of the estimators listed below.
  • Use with independence to perform a formal hypothesis test for pairwise conditional independence using the Rényi-Poczos conditional mutual information.

Compatible estimators

Definition

\[\begin{align*} I_q^{R_{P}}(X; Y | Z) &= \dfrac{1}{q-1} \int \int \int \dfrac{p_Z(z) p_{X, Y | Z}^q}{( p_{X|Z}(x|z) p_{Y|Z}(y|z) )^{q-1}} \\ &= \mathbb{E}_{X, Y, Z} \sim p_{X, Y, Z} \left[ \dfrac{p_{X, Z}^{1-q}(X, Z) p_{Y, Z}^{1-q}(Y, Z) }{p_{X, Y, Z}^{1-q}(X, Y, Z) p_Z^{1-q}(Z)} \right] -\end{align*}\]

Estimation

source
Associations.CMITsallisPapapetrouType
CMITsallisPapapetrou <: ConditionalMutualInformation
-CMITsallisPapapetrou(; base = 2, q = 1.5)

The Tsallis-Papapetrou conditional mutual information (Papapetrou and Kugiumtzis, 2020).

Usage

  • Use with association to compute the raw Tsallis-Papapetrou conditional mutual information using of of the estimators listed below.
  • Use with independence to perform a formal hypothesis test for pairwise conditional independence using the Tsallis-Papapetrou conditional mutual information.

Compatible estimators

Definition

Tsallis-Papapetrou conditional mutual information is defined as

\[I_T^q(X, Y \mid Z) = \frac{1}{1 - q} \left( 1 - \sum_{XYZ} \frac{p(x, y, z)^q}{p(x \mid z)^{q-1} p(y \mid z)^{q-1} p(z)^{q-1}} \right).\]

source

Transfer entropy

Associations.CMITsallisPapapetrouType
CMITsallisPapapetrou <: ConditionalMutualInformation
+CMITsallisPapapetrou(; base = 2, q = 1.5)

The Tsallis-Papapetrou conditional mutual information (Papapetrou and Kugiumtzis, 2020).

Usage

  • Use with association to compute the raw Tsallis-Papapetrou conditional mutual information using of of the estimators listed below.
  • Use with independence to perform a formal hypothesis test for pairwise conditional independence using the Tsallis-Papapetrou conditional mutual information.

Compatible estimators

Definition

Tsallis-Papapetrou conditional mutual information is defined as

\[I_T^q(X, Y \mid Z) = \frac{1}{1 - q} \left( 1 - \sum_{XYZ} \frac{p(x, y, z)^q}{p(x \mid z)^{q-1} p(y \mid z)^{q-1} p(z)^{q-1}} \right).\]

source

Transfer entropy

Associations.TEShannonType
TEShannon <: TransferEntropy
 TEShannon(; base = 2; embedding = EmbeddingTE()) <: TransferEntropy

The Shannon-type transfer entropy measure.

Usage

  • Use with association to compute the raw transfer entropy.
  • Use with an IndependenceTest to perform a formal hypothesis test for pairwise and conditional dependence.

Description

The transfer entropy from source $S$ to target $T$, potentially conditioned on $C$ is defined as

\[\begin{align*} TE(S \to T) &:= I^S(T^+; S^- | T^-) \\ TE(S \to T | C) &:= I^S(T^+; S^- | T^-, C^-) -\end{align*}\]

where $I(T^+; S^- | T^-)$ is the Shannon conditional mutual information (CMIShannon). The - and + subscripts on the marginal variables $T^+$, $T^-$, $S^-$ and $C^-$ indicate that the embedding vectors for that marginal are constructed using present/past values and future values, respectively.

Estimation

source
Associations.TERenyiJizbaType
TERenyiJizba() <: TransferEntropy

The Rényi transfer entropy from Jizba et al. (2012).

Usage

  • Use with association to compute the raw transfer entropy.
  • Use with an IndependenceTest to perform a formal hypothesis test for pairwise and conditional dependence.

Description

The transfer entropy from source $S$ to target $T$, potentially conditioned on $C$ is defined as

\[\begin{align*} +\end{align*}\]

where $I(T^+; S^- | T^-)$ is the Shannon conditional mutual information (CMIShannon). The - and + subscripts on the marginal variables $T^+$, $T^-$, $S^-$ and $C^-$ indicate that the embedding vectors for that marginal are constructed using present/past values and future values, respectively.

Estimation

source
Associations.TERenyiJizbaType
TERenyiJizba() <: TransferEntropy

The Rényi transfer entropy from Jizba et al. (2012).

Usage

  • Use with association to compute the raw transfer entropy.
  • Use with an IndependenceTest to perform a formal hypothesis test for pairwise and conditional dependence.

Description

The transfer entropy from source $S$ to target $T$, potentially conditioned on $C$ is defined as

\[\begin{align*} TE(S \to T) &:= I_q^{R_J}(T^+; S^- | T^-) \\ TE(S \to T | C) &:= I_q^{R_J}(T^+; S^- | T^-, C^-), -\end{align*},\]

where $I_q^{R_J}(T^+; S^- | T^-)$ is Jizba et al. (2012)'s definition of conditional mutual information (CMIRenyiJizba). The - and + subscripts on the marginal variables $T^+$, $T^-$, $S^-$ and $C^-$ indicate that the embedding vectors for that marginal are constructed using present/past values and future values, respectively.

Estimation

Estimating Jizba's Rényi transfer entropy is a bit complicated, since it doesn't have a dedicated estimator. Instead, we re-write the Rényi transfer entropy as a Rényi conditional mutual information, and estimate it using an EntropyDecomposition with a suitable discrete/differential Rényi entropy estimator from the list below as its input.

EstimatorSub-estimatorPrinciple
EntropyDecompositionLeonenkoProzantoSavaniFour-entropies decomposition
EntropyDecompositionValueBinningFour-entropies decomposition
EntropyDecompositionDispersionFour-entropies decomposition
EntropyDecompositionOrdinalPatternsFour-entropies decomposition
EntropyDecompositionUniqueElementsFour-entropies decomposition
EntropyDecompositionTransferOperatorFour-entropies decomposition

Any of these estimators must be given as input to a `CMIDecomposition estimator.

Estimation

source

The following utility functions and types are also useful for transfer entropy estimation.

Associations.optimize_marginals_teFunction
optimize_marginals_te([scheme = OptimiseTraditional()], s, t, [c]) → EmbeddingTE

Optimize marginal embeddings for transfer entropy computation from source time series s to target time series t, conditioned on c if c is given, using the provided optimization scheme.

source
Associations.EmbeddingTEType
EmbeddingTE(; dS = 1, dT = 1, dTf = 1, dC = 1, τS = -1, τT = -1, ηTf = 1, τC = -1)
+\end{align*},\]

where $I_q^{R_J}(T^+; S^- | T^-)$ is Jizba et al. (2012)'s definition of conditional mutual information (CMIRenyiJizba). The - and + subscripts on the marginal variables $T^+$, $T^-$, $S^-$ and $C^-$ indicate that the embedding vectors for that marginal are constructed using present/past values and future values, respectively.

Estimation

Estimating Jizba's Rényi transfer entropy is a bit complicated, since it doesn't have a dedicated estimator. Instead, we re-write the Rényi transfer entropy as a Rényi conditional mutual information, and estimate it using an EntropyDecomposition with a suitable discrete/differential Rényi entropy estimator from the list below as its input.

EstimatorSub-estimatorPrinciple
EntropyDecompositionLeonenkoProzantoSavaniFour-entropies decomposition
EntropyDecompositionValueBinningFour-entropies decomposition
EntropyDecompositionDispersionFour-entropies decomposition
EntropyDecompositionOrdinalPatternsFour-entropies decomposition
EntropyDecompositionUniqueElementsFour-entropies decomposition
EntropyDecompositionTransferOperatorFour-entropies decomposition

Any of these estimators must be given as input to a `CMIDecomposition estimator.

Estimation

source

The following utility functions and types are also useful for transfer entropy estimation.

Associations.optimize_marginals_teFunction
optimize_marginals_te([scheme = OptimiseTraditional()], s, t, [c]) → EmbeddingTE

Optimize marginal embeddings for transfer entropy computation from source time series s to target time series t, conditioned on c if c is given, using the provided optimization scheme.

source
Associations.EmbeddingTEType
EmbeddingTE(; dS = 1, dT = 1, dTf = 1, dC = 1, τS = -1, τT = -1, ηTf = 1, τC = -1)
 EmbeddingTE(opt::OptimiseTraditional, s, t, [c])

EmbeddingTE provide embedding parameters for transfer entropy analysis using either TEShannon, TERenyiJizba, or in general any subtype of TransferEntropy.

The second method finds parameters using the "traditional" optimised embedding techniques from DynamicalSystems.jl

Convention for generalized delay reconstruction

We use the following convention. Let $s(i)$ be time series for the source variable, $t(i)$ be the time series for the target variable and $c(i)$ the time series for the conditional variable. To compute transfer entropy, we need the following marginals:

\[\begin{aligned} T^{+} &= \{t(i+\eta^1), t(i+\eta^2), \ldots, (t(i+\eta^{d_{T^{+}}}) \} \\ T^{-} &= \{ (t(i+\tau^0_{T}), t(i+\tau^1_{T}), t(i+\tau^2_{T}), \ldots, t(t + \tau^{d_{T} - 1}_{T})) \} \\ @@ -66,35 +66,37 @@ julia> EmbeddingTE(dT=3, τT=[0, -5, -8], dS=2, τS=[-1, -4], ηTf=1) # output -EmbeddingTE(dS=2, dT=3, dC=1, dTf=1, τS=[-1, -4], τT=[0, -5, -8], τC=-1, ηTf=1)

source

Partial mutual information

Associations.PartialMutualInformationType
PartialMutualInformation <: MultivariateInformationMeasure
-PartialMutualInformation(; base = 2)

The partial mutual information (PMI) measure of conditional association (Zhao et al., 2016).

Definition

PMI is defined as for variables $X$, $Y$ and $Z$ as

\[PMI(X; Y | Z) = D(p(x, y, z) || p^{*}(x|z) p^{*}(y|z) p(z)),\]

where $p(x, y, z)$ is the joint distribution for $X$, $Y$ and $Z$, and $D(\cdot, \cdot)$ is the extended Kullback-Leibler divergence from $p(x, y, z)$ to $p^{*}(x|z) p^{*}(y|z) p(z)$. See Zhao et al. (2016) for details.

Estimation

The PMI is estimated by first estimating a 3D probability mass function using probabilities, then computing $PMI(X; Y | Z)$ from those probaiblities.

Properties

For the discrete case, the following identities hold in theory (when estimating PMI, they may not).

  • PMI(X, Y, Z) >= CMI(X, Y, Z) (where CMI is the Shannon CMI). Holds in theory, but when estimating PMI, the identity may not hold.
  • PMI(X, Y, Z) >= 0. Holds both in theory and when estimating using discrete estimators.
  • X ⫫ Y | Z => PMI(X, Y, Z) = CMI(X, Y, Z) = 0 (in theory, but not necessarily for estimation).
source

Correlation measures

Associations.PearsonCorrelationType
PearsonCorrelation

The Pearson correlation of two variables.

Usage

  • Use with association to compute the raw Pearson correlation coefficient.
  • Use with independence to perform a formal hypothesis test for pairwise dependence using the Pearson correlation coefficient.

Description

The sample Pearson correlation coefficient for real-valued random variables $X$ and $Y$ with associated samples $\{x_i\}_{i=1}^N$ and $\{y_i\}_{i=1}^N$ is defined as

\[\rho_{xy} = \dfrac{\sum_{i=1}^n (x_i - \bar{x})(y_i - \bar{y}) }{\sqrt{\sum_{i=1}^N (x_i - \bar{x})^2}\sqrt{\sum_{i=1}^N (y_i - \bar{y})^2}},\]

where $\bar{x}$ and $\bar{y}$ are the means of the observations $x_k$ and $y_k$, respectively.

source
Associations.PartialCorrelationType
PartialCorrelation <: AssociationMeasure

The correlation of two variables, with the effect of a set of conditioning variables removed.

Usage

  • Use with association to compute the raw partial correlation coefficient.
  • Use with independence to perform a formal hypothesis test for correlated-based conditional independence.

Description

There are several ways of estimating the partial correlation. We follow the matrix inversion method, because for StateSpaceSets, we can very efficiently compute the required joint covariance matrix $\Sigma$ for the random variables.

Formally, let $X_1, X_2, \ldots, X_n$ be a set of $n$ real-valued random variables. Consider the joint precision matrix,$P = (p_{ij}) = \Sigma^-1$. The partial correlation of any pair of variables $(X_i, X_j)$, given the remaining variables $\bf{Z} = \{X_k\}_{i=1, i \neq i, j}^n$, is defined as

\[\rho_{X_i X_j | \bf{Z}} = -\dfrac{p_ij}{\sqrt{ p_{ii} p_{jj} }}\]

In practice, we compute the estimate

\[\hat{\rho}_{X_i X_j | \bf{Z}} = --\dfrac{\hat{p}_ij}{\sqrt{ \hat{p}_{ii} \hat{p}_{jj} }},\]

where $\hat{P} = \hat{\Sigma}^{-1}$ is the sample precision matrix.

source
Associations.DistanceCorrelationType
DistanceCorrelation

The distance correlation (Székely et al., 2007) measure quantifies potentially nonlinear associations between pairs of variables. If applied to three variables, the partial distance correlation (Székely and Rizzo, 2014) is computed.

Usage

  • Use with association to compute the raw (partial) distance correlation coefficient.
  • Use with independence to perform a formal hypothesis test for pairwise dependence.

Description

The distance correlation can be used to compute the association between two variables, or the conditional association between three variables, like so:

association(DistanceCorrelation(), x, y) → dcor ∈ [0, 1]
-association(DistanceCorrelation(), x, y, z) → pdcor

With two variable, we comptue dcor, which is called the empirical/sample distance correlation (Székely et al., 2007). With three variables, the partial distance correlation pdcor is computed (Székely and Rizzo, 2014).

Warn

A partial distance correlation distance_correlation(X, Y, Z) = 0 doesn't always guarantee conditional independence X ⫫ Y | Z. Székely and Rizzo (2014) for an in-depth discussion.

source

Partial mutual information

Associations.PartialMutualInformationType
PartialMutualInformation <: MultivariateInformationMeasure
+PartialMutualInformation(; base = 2)

The partial mutual information (PMI) measure of conditional association (Zhao et al., 2016).

Definition

PMI is defined as for variables $X$, $Y$ and $Z$ as

\[PMI(X; Y | Z) = D(p(x, y, z) || p^{*}(x|z) p^{*}(y|z) p(z)),\]

where $p(x, y, z)$ is the joint distribution for $X$, $Y$ and $Z$, and $D(\cdot, \cdot)$ is the extended Kullback-Leibler divergence from $p(x, y, z)$ to $p^{*}(x|z) p^{*}(y|z) p(z)$. See Zhao et al. (2016) for details.

Estimation

The PMI is estimated by first estimating a 3D probability mass function using probabilities, then computing $PMI(X; Y | Z)$ from those probaiblities.

Properties

For the discrete case, the following identities hold in theory (when estimating PMI, they may not).

  • PMI(X, Y, Z) >= CMI(X, Y, Z) (where CMI is the Shannon CMI). Holds in theory, but when estimating PMI, the identity may not hold.
  • PMI(X, Y, Z) >= 0. Holds both in theory and when estimating using discrete estimators.
  • X ⫫ Y | Z => PMI(X, Y, Z) = CMI(X, Y, Z) = 0 (in theory, but not necessarily for estimation).
source

Short expansion of conditional mutual information

Associations.ShortExpansionConditionalMutualInformationType
ShortExpansionConditionalMutualInformation <: MultivariateInformationMeasure
+ShortExpansionConditionalMutualInformation(; base = 2)
+SECMI(; base = 2) # alias

The short expansion of (Shannon) conditional mutual information (SECMI) measure from Kubkowski et al. (2021).

Description

The SECMI measure is defined as

\[SECMI(X,Y|Z) = I(X,Y) + \sum_{k=1}^{m} II(X,Z_k,Y) = (1 - m) I(X,Y) + \sum_{k=1}^{m} I(X,Y|Z_k).\]

This quantity is estimated from data using one of the estimators below from the formula

\[\widehat{SECMI}(X,Y|Z) = \widehat{I}(X,Y) + \sum_{k=1}^{m} \widehat{II}(X,Z_k,Y) = (1 - m) \widehat{I}(X,Y) + \sum_{k=1}^{m} \widehat{I}(X,Y|Z_k).\]

Compatible estimators

Estimation

source

Correlation measures

Associations.PearsonCorrelationType
PearsonCorrelation

The Pearson correlation of two variables.

Usage

  • Use with association to compute the raw Pearson correlation coefficient.
  • Use with independence to perform a formal hypothesis test for pairwise dependence using the Pearson correlation coefficient.

Description

The sample Pearson correlation coefficient for real-valued random variables $X$ and $Y$ with associated samples $\{x_i\}_{i=1}^N$ and $\{y_i\}_{i=1}^N$ is defined as

\[\rho_{xy} = \dfrac{\sum_{i=1}^n (x_i - \bar{x})(y_i - \bar{y}) }{\sqrt{\sum_{i=1}^N (x_i - \bar{x})^2}\sqrt{\sum_{i=1}^N (y_i - \bar{y})^2}},\]

where $\bar{x}$ and $\bar{y}$ are the means of the observations $x_k$ and $y_k$, respectively.

source
Associations.PartialCorrelationType
PartialCorrelation <: AssociationMeasure

The correlation of two variables, with the effect of a set of conditioning variables removed.

Usage

  • Use with association to compute the raw partial correlation coefficient.
  • Use with independence to perform a formal hypothesis test for correlated-based conditional independence.

Description

There are several ways of estimating the partial correlation. We follow the matrix inversion method, because for StateSpaceSets, we can very efficiently compute the required joint covariance matrix $\Sigma$ for the random variables.

Formally, let $X_1, X_2, \ldots, X_n$ be a set of $n$ real-valued random variables. Consider the joint precision matrix,$P = (p_{ij}) = \Sigma^-1$. The partial correlation of any pair of variables $(X_i, X_j)$, given the remaining variables $\bf{Z} = \{X_k\}_{i=1, i \neq i, j}^n$, is defined as

\[\rho_{X_i X_j | \bf{Z}} = -\dfrac{p_ij}{\sqrt{ p_{ii} p_{jj} }}\]

In practice, we compute the estimate

\[\hat{\rho}_{X_i X_j | \bf{Z}} = +-\dfrac{\hat{p}_ij}{\sqrt{ \hat{p}_{ii} \hat{p}_{jj} }},\]

where $\hat{P} = \hat{\Sigma}^{-1}$ is the sample precision matrix.

source
Associations.DistanceCorrelationType
DistanceCorrelation

The distance correlation (Székely et al., 2007) measure quantifies potentially nonlinear associations between pairs of variables. If applied to three variables, the partial distance correlation (Székely and Rizzo, 2014) is computed.

Usage

  • Use with association to compute the raw (partial) distance correlation coefficient.
  • Use with independence to perform a formal hypothesis test for pairwise dependence.

Description

The distance correlation can be used to compute the association between two variables, or the conditional association between three variables, like so:

association(DistanceCorrelation(), x, y) → dcor ∈ [0, 1]
+association(DistanceCorrelation(), x, y, z) → pdcor

With two variable, we comptue dcor, which is called the empirical/sample distance correlation (Székely et al., 2007). With three variables, the partial distance correlation pdcor is computed (Székely and Rizzo, 2014).

Warn

A partial distance correlation distance_correlation(X, Y, Z) = 0 doesn't always guarantee conditional independence X ⫫ Y | Z. Székely and Rizzo (2014) for an in-depth discussion.

source
Associations.ChatterjeeCorrelationType
ChatterjeeCorrelation <: CorrelationMeasure
 ChatterjeeCorrelation(; handle_ties = true, rng = Random.default_rng())

The Chatterjee correlation measure (Chatterjee, 2021) is an asymmetric measure of dependence between two variables.

Speeding up computations

If handle_ties == true, then the first formula below is used. If you know for sure that there are no ties in your data, then set handle_ties == false, which will use the second (faster) formula below.

Randomization and reproducibility

When rearranging the input datasets, the second variable y is sorted according to a sorting of the first variable x. If x has ties, then these ties are broken randomly and uniformly. For complete reproducibility in this step, you can specify rng. If x has no ties, then no randomization is performed.

Usage

  • Use with association to compute the raw Chatterjee correlation coefficient.
  • Use with SurrogateAssociationTest to perform a surrogate test for significance of a Chatterjee-type association (example). When using a surrogate test for significance, the first input variable is shuffled according to the given surrogate method.

Description

The correlation statistic is defined as

\[\epsilon_n(X, Y) = 1 - \dfrac{n\sum_{i=1}^{n-1} |r_{i+1} - r_i|}{2\sum_{i=1}^n }.\]

When there are no ties among the $Y_1, Y_2, \ldots, Y_n$, the measure is

\[\epsilon_n(X, Y) = -1 - \dfrac{3\sum_{i=1}^{n-1} |r_{i+1} - r_i|}{n^2 - 1}.\]

This statistic estimates a quantity proposed by Dette et al. (2013), as indicated in Shi et al. (2022). It can therefore also be called the Chatterjee-Dette-Siburg-Stoimenov correlation coefficient.

Estimation

  • Example 1. Estimating the Chatterjee correlation coefficient for independent and for dependent variables.
  • Example 2. Testing the significance of a Chatterjee-type association using a surrogate test.
source
Associations.AzadkiaChatterjeeCoefficientType
AzadkiaChatterjeeCoefficient <: AssociationMeasure
+1 - \dfrac{3\sum_{i=1}^{n-1} |r_{i+1} - r_i|}{n^2 - 1}.\]

This statistic estimates a quantity proposed by Dette et al. (2013), as indicated in Shi et al. (2022). It can therefore also be called the Chatterjee-Dette-Siburg-Stoimenov correlation coefficient.

Estimation

  • Example 1. Estimating the Chatterjee correlation coefficient for independent and for dependent variables.
  • Example 2. Testing the significance of a Chatterjee-type association using a surrogate test.
source
Associations.AzadkiaChatterjeeCoefficientType
AzadkiaChatterjeeCoefficient <: AssociationMeasure
 AzadkiaChatterjeeCoefficient(; theiler::Int = 0)

The Azadkia-Chatterjee coefficient (Azadkia and Chatterjee, 2021) is a coefficient for pairwise and conditional association inspired by the Chatterjee-Dette-Siburg-Stoimenov coefficient (Chatterjee, 2021; Dette et al., 2013) (see ChatterjeeCorrelation).

Usage

  • Use with association to compute the raw Azadkia-Chatterjee coefficient.
  • Use with SurrogateAssociationTest to perform a surrogate test for significance of a pairwise or conditional Azadkia-Chatterjee-type association (example). When using a surrogate test for significance, only the first input variable is shuffled according to the given surrogate method.
  • Use with LocalPermutationTest to perform a test of conditional independence (example).

Description

The pairwise statistic is

\[T_n(Y, \boldsymbol{Z} | \boldsymbol{X}) = \dfrac{\sum_{i=1}^n \left( \min{(R_i, R_{M_{(i)}})} - \min{(R_i, R_{N_{(i)}})} \right) }{\sum_{i=1}^n \left(R_i - \min{(R_i, R_{N_{(i)}})} \right)}.\]

where $R_i$ is the rank of the point $Y_i$ among all $Y_i$s, and $M_{(i)}$ and $N_{(i)}$ are indices of nearest neighbors of the points $\boldsymbol{X}_i$ and $(\boldsymbol{X}_i, \boldsymbol{Z}_i)$, respectively (given appropriately constructed marginal spaces). The theiler keyword argument is an integer controlling the number of nearest neighbors to exclude during neighbor searches. The Theiler window defaults to 0, which excludes self-neighbors, and is the only option considered in Azadkia and Chatterjee (2021).

In the case where $\boldsymbol{X}$ has no components (i.e. we're not conditioning), we also consider $L_i$ as the number of $j$ such that $Y_j \geq Y_i$. The measure is then defined as

\[T_n(Y, \boldsymbol{Z}) = -\dfrac{\sum_{i=1}^n \left( n \min{(R_i, R_{M_{(i)}})} - L_i^2 \right) }{\sum_{i=1}^n \left( L_i (n - L_i) \right)}.\]

The value of the coefficient is on [0, 1] when the number of samples goes to , but is not restricted to this interval in practice.

Input data

If the input data contain duplicate points, consider adding a small magnitude of noise to the input data. Otherwise, errors will occur when locating nearest neighbors.

Estimation

  • Example 1. Estimating the Azadkia-Chatterjee coefficient to quantify associations for a chain of unidirectionally coupled variables, showcasing both pairwise and conditional associations.
  • Example 2. Using SurrogateAssociationTest in combination with the Azadkia-Chatterjee coefficient to quantify significance of pairwise and conditional associations.
  • Example 3. Using LocalPermutationTest in combination with the Azadkia-Chatterjee coefficient to perform a test for conditional independence.
source

Cross-map measures

The cross-map measures define different ways of quantifying association based on the concept of "cross mapping", which has appeared in many contexts in the literature, and gained huge popularity with Sugihara et al. (2012)'s on convergent cross mapping.

Since their paper, several cross mapping methods and frameworks have emerged in the literature. In Associations.jl, we provide a unified interface for using these cross mapping methods.

Associations.ConvergentCrossMappingType
ConvergentCrossMapping <: CrossmapMeasure
+\dfrac{\sum_{i=1}^n \left( n \min{(R_i, R_{M_{(i)}})} - L_i^2 \right) }{\sum_{i=1}^n \left( L_i (n - L_i) \right)}.\]

The value of the coefficient is on [0, 1] when the number of samples goes to , but is not restricted to this interval in practice.

Input data

If the input data contain duplicate points, consider adding a small magnitude of noise to the input data. Otherwise, errors will occur when locating nearest neighbors.

Estimation

  • Example 1. Estimating the Azadkia-Chatterjee coefficient to quantify associations for a chain of unidirectionally coupled variables, showcasing both pairwise and conditional associations.
  • Example 2. Using SurrogateAssociationTest in combination with the Azadkia-Chatterjee coefficient to quantify significance of pairwise and conditional associations.
  • Example 3. Using LocalPermutationTest in combination with the Azadkia-Chatterjee coefficient to perform a test for conditional independence.
source

Cross-map measures

The cross-map measures define different ways of quantifying association based on the concept of "cross mapping", which has appeared in many contexts in the literature, and gained huge popularity with Sugihara et al. (2012)'s on convergent cross mapping.

Since their paper, several cross mapping methods and frameworks have emerged in the literature. In Associations.jl, we provide a unified interface for using these cross mapping methods.

Associations.ConvergentCrossMappingType
ConvergentCrossMapping <: CrossmapMeasure
 ConvergentCrossMapping(; d::Int = 2, τ::Int = -1, w::Int = 0,
-    f = Statistics.cor, embed_warn = true)

The convergent cross mapping measure (Sugihara et al., 2012).

Usage

Compatible estimators

Description

The Theiler window w controls how many temporal neighbors are excluded during neighbor searches (w = 0 means that only the point itself is excluded). f is a function that computes the agreement between observations and predictions (the default, f = Statistics.cor, gives the Pearson correlation coefficient).

Embedding

Let S(i) be the source time series variable and T(i) be the target time series variable. This version produces regular embeddings with fixed dimension d and embedding lag τ as follows:

\[( S(i), S(i+\tau), S(i+2\tau), \ldots, S(i+(d-1)\tau, T(i))_{i=1}^{N-(d-1)\tau}.\]

In this joint embedding, neighbor searches are performed in the subspace spanned by the first D-1 variables, while the last (D-th) variable is to be predicted.

With this convention, τ < 0 implies "past/present values of source used to predict target", and τ > 0 implies "future/present values of source used to predict target". The latter case may not be meaningful for many applications, so by default, a warning will be given if τ > 0 (embed_warn = false turns off warnings).

Estimation

source
Associations.PairwiseAsymmetricInferenceType
PairwiseAsymmetricInference <: CrossmapMeasure
+    f = Statistics.cor, embed_warn = true)

The convergent cross mapping measure (Sugihara et al., 2012).

Usage

Compatible estimators

Description

The Theiler window w controls how many temporal neighbors are excluded during neighbor searches (w = 0 means that only the point itself is excluded). f is a function that computes the agreement between observations and predictions (the default, f = Statistics.cor, gives the Pearson correlation coefficient).

Embedding

Let S(i) be the source time series variable and T(i) be the target time series variable. This version produces regular embeddings with fixed dimension d and embedding lag τ as follows:

\[( S(i), S(i+\tau), S(i+2\tau), \ldots, S(i+(d-1)\tau, T(i))_{i=1}^{N-(d-1)\tau}.\]

In this joint embedding, neighbor searches are performed in the subspace spanned by the first D-1 variables, while the last (D-th) variable is to be predicted.

With this convention, τ < 0 implies "past/present values of source used to predict target", and τ > 0 implies "future/present values of source used to predict target". The latter case may not be meaningful for many applications, so by default, a warning will be given if τ > 0 (embed_warn = false turns off warnings).

Estimation

source
Associations.PairwiseAsymmetricInferenceType
PairwiseAsymmetricInference <: CrossmapMeasure
 PairwiseAsymmetricInference(; d::Int = 2, τ::Int = -1, w::Int = 0,
-    f = Statistics.cor, embed_warn = true)

The pairwise asymmetric inference (PAI) measure (McCracken and Weigel, 2014) is a version of ConvergentCrossMapping that searches for neighbors in mixed embeddings (i.e. both source and target variables included); otherwise, the algorithms are identical.

Usage

  • Use with association to compute the pairwise asymmetric inference measure between variables.

Compatible estimators

Description

The Theiler window w controls how many temporal neighbors are excluded during neighbor searches (w = 0 means that only the point itself is excluded). f is a function that computes the agreement between observations and predictions (the default, f = Statistics.cor, gives the Pearson correlation coefficient).

Embedding

There are many possible ways of defining the embedding for PAI. Currently, we only implement the "add one non-lagged source timeseries to an embedding of the target" approach, which is used as an example in McCracken & Weigel's paper. Specifically: Let S(i) be the source time series variable and T(i) be the target time series variable. PairwiseAsymmetricInference produces regular embeddings with fixed dimension d and embedding lag τ as follows:

\[(S(i), T(i+(d-1)\tau, \ldots, T(i+2\tau), T(i+\tau), T(i)))_{i=1}^{N-(d-1)\tau}.\]

In this joint embedding, neighbor searches are performed in the subspace spanned by the first D variables, while the last variable is to be predicted.

With this convention, τ < 0 implies "past/present values of source used to predict target", and τ > 0 implies "future/present values of source used to predict target". The latter case may not be meaningful for many applications, so by default, a warning will be given if τ > 0 (embed_warn = false turns off warnings).

Estimation

source

Closeness measures

Associations.JointDistanceDistributionType
JointDistanceDistribution <: AssociationMeasure end
+    f = Statistics.cor, embed_warn = true)

The pairwise asymmetric inference (PAI) measure (McCracken and Weigel, 2014) is a version of ConvergentCrossMapping that searches for neighbors in mixed embeddings (i.e. both source and target variables included); otherwise, the algorithms are identical.

Usage

  • Use with association to compute the pairwise asymmetric inference measure between variables.

Compatible estimators

Description

The Theiler window w controls how many temporal neighbors are excluded during neighbor searches (w = 0 means that only the point itself is excluded). f is a function that computes the agreement between observations and predictions (the default, f = Statistics.cor, gives the Pearson correlation coefficient).

Embedding

There are many possible ways of defining the embedding for PAI. Currently, we only implement the "add one non-lagged source timeseries to an embedding of the target" approach, which is used as an example in McCracken & Weigel's paper. Specifically: Let S(i) be the source time series variable and T(i) be the target time series variable. PairwiseAsymmetricInference produces regular embeddings with fixed dimension d and embedding lag τ as follows:

\[(S(i), T(i+(d-1)\tau, \ldots, T(i+2\tau), T(i+\tau), T(i)))_{i=1}^{N-(d-1)\tau}.\]

In this joint embedding, neighbor searches are performed in the subspace spanned by the first D variables, while the last variable is to be predicted.

With this convention, τ < 0 implies "past/present values of source used to predict target", and τ > 0 implies "future/present values of source used to predict target". The latter case may not be meaningful for many applications, so by default, a warning will be given if τ > 0 (embed_warn = false turns off warnings).

Estimation

source

Closeness measures

Associations.JointDistanceDistributionType
JointDistanceDistribution <: AssociationMeasure end
 JointDistanceDistribution(; metric = Euclidean(), B = 10, D = 2, τ = -1, μ = 0.0)

The joint distance distribution (JDD) measure (Amigó and Hirata, 2018).

Usage

Keyword arguments

  • distance_metric::Metric: An instance of a valid distance metric from Distances.jl. Defaults to Euclidean().
  • B::Int: The number of equidistant subintervals to divide the interval [0, 1] into when comparing the normalised distances.
  • D::Int: Embedding dimension.
  • τ::Int: Embedding delay. By convention, τ is negative.
  • μ: The hypothetical mean value of the joint distance distribution if there is no coupling between x and y (default is μ = 0.0).

Description

From input time series $x(t)$ and $y(t)$, we first construct the delay embeddings (note the positive sign in the embedding lags; therefore the input parameter τ is by convention negative).

\[\begin{align*} \{\bf{x}_i \} &= \{(x_i, x_{i+\tau}, \ldots, x_{i+(d_x - 1)\tau}) \} \\ \{\bf{y}_i \} &= \{(y_i, y_{i+\tau}, \ldots, y_{i+(d_y - 1)\tau}) \} \\ -\end{align*}\]

The algorithm then proceeds to analyze the distribution of distances between points of these embeddings, as described in Amigó and Hirata (2018).

Examples

source
Associations.SMeasureType
SMeasure < ClosenessMeasure
 SMeasure(; K::Int = 2, dx = 2, dy = 2, τx = - 1, τy = -1, w = 0)

SMeasure is a bivariate association measure from Arnhold et al. (1999) and Quiroga et al. (2000) that measure directional dependence between two input (potentially multivariate) time series.

Note that τx and τy are negative; see explanation below.

Usage

  • Use with association to compute the raw s-measure statistic.
  • Use with independence to perform a formal hypothesis test for directional dependence.

Description

The steps of the algorithm are:

  1. From input time series $x(t)$ and $y(t)$, construct the delay embeddings (note the positive sign in the embedding lags; therefore inputs parameters τx and τy are by convention negative).

\[\begin{align*} \{\bf{x}_i \} &= \{(x_i, x_{i+\tau_x}, \ldots, x_{i+(d_x - 1)\tau_x}) \} \\ \{\bf{y}_i \} &= \{(y_i, y_{i+\tau_y}, \ldots, y_{i+(d_y - 1)\tau_y}) \} \\ -\end{align*}\]

  1. Let $r_{i,j}$ and $s_{i,j}$ be the indices of the K-th nearest neighbors of $\bf{x}_i$ and $\bf{y}_i$, respectively. Neighbors closed than w time indices are excluded during searches (i.e. w is the Theiler window).

  2. Compute the the mean squared Euclidean distance to the $K$ nearest neighbors for each $x_i$, using the indices $r_{i, j}$.

\[R_i^{(k)}(x) = \dfrac{1}{k} \sum_{i=1}^{k}(\bf{x}_i, \bf{x}_{r_{i,j}})^2\]

  • Compute the y-conditioned mean squared Euclidean distance to the $K$ nearest neighbors for each $x_i$, now using the indices $s_{i,j}$.

\[R_i^{(k)}(x|y) = \dfrac{1}{k} \sum_{i=1}^{k}(\bf{x}_i, \bf{x}_{s_{i,j}})^2\]

  • Define the following measure of independence, where $0 \leq S \leq 1$, and low values indicate independence and values close to one occur for synchronized signals.

\[S^{(k)}(x|y) = \dfrac{1}{N} \sum_{i=1}^{N} \dfrac{R_i^{(k)}(x)}{R_i^{(k)}(x|y)}\]

Input data

The algorithm is slightly modified from (Arnhold et al., 1999) to allow univariate timeseries as input.

  • If x and y are StateSpaceSets then use x and y as is and ignore the parameters dx/τx and dy/τy.
  • If x and y are scalar time series, then create dx and dy dimensional embeddings, respectively, of both x and y, resulting in N different m-dimensional embedding points $X = \{x_1, x_2, \ldots, x_N \}$ and $Y = \{y_1, y_2, \ldots, y_N \}$. τx and τy control the embedding lags for x and y.
  • If x is a scalar-valued vector and y is a StateSpaceSet, or vice versa, then create an embedding of the scalar timeseries using parameters dx/τx or dy/τy.

In all three cases, input StateSpaceSets are length-matched by eliminating points at the end of the longest StateSpaceSet (after the embedding step, if relevant) before analysis.

See also: ClosenessMeasure.

source
Associations.HMeasureType
HMeasure <: AssociationMeasure
+\end{align*}\]

  1. Let $r_{i,j}$ and $s_{i,j}$ be the indices of the K-th nearest neighbors of $\bf{x}_i$ and $\bf{y}_i$, respectively. Neighbors closed than w time indices are excluded during searches (i.e. w is the Theiler window).

  2. Compute the the mean squared Euclidean distance to the $K$ nearest neighbors for each $x_i$, using the indices $r_{i, j}$.

\[R_i^{(k)}(x) = \dfrac{1}{k} \sum_{i=1}^{k}(\bf{x}_i, \bf{x}_{r_{i,j}})^2\]

  • Compute the y-conditioned mean squared Euclidean distance to the $K$ nearest neighbors for each $x_i$, now using the indices $s_{i,j}$.

\[R_i^{(k)}(x|y) = \dfrac{1}{k} \sum_{i=1}^{k}(\bf{x}_i, \bf{x}_{s_{i,j}})^2\]

  • Define the following measure of independence, where $0 \leq S \leq 1$, and low values indicate independence and values close to one occur for synchronized signals.

\[S^{(k)}(x|y) = \dfrac{1}{N} \sum_{i=1}^{N} \dfrac{R_i^{(k)}(x)}{R_i^{(k)}(x|y)}\]

Input data

The algorithm is slightly modified from (Arnhold et al., 1999) to allow univariate timeseries as input.

  • If x and y are StateSpaceSets then use x and y as is and ignore the parameters dx/τx and dy/τy.
  • If x and y are scalar time series, then create dx and dy dimensional embeddings, respectively, of both x and y, resulting in N different m-dimensional embedding points $X = \{x_1, x_2, \ldots, x_N \}$ and $Y = \{y_1, y_2, \ldots, y_N \}$. τx and τy control the embedding lags for x and y.
  • If x is a scalar-valued vector and y is a StateSpaceSet, or vice versa, then create an embedding of the scalar timeseries using parameters dx/τx or dy/τy.

In all three cases, input StateSpaceSets are length-matched by eliminating points at the end of the longest StateSpaceSet (after the embedding step, if relevant) before analysis.

See also: ClosenessMeasure.

source
Associations.HMeasureType
HMeasure <: AssociationMeasure
 HMeasure(; K::Int = 2, dx = 2, dy = 2, τx = - 1, τy = -1, w = 0)

The HMeasure (Arnhold et al., 1999) is a pairwise association measure. It quantifies the probability with which close state of a target timeseries/embedding are mapped to close states of a source timeseries/embedding.

Note that τx and τy are negative by convention. See docstring for SMeasure for an explanation.

Usage

  • Use with association to compute the raw h-measure statistic.
  • Use with independence to perform a formal hypothesis test for directional dependence.

Description

The HMeasure (Arnhold et al., 1999) is similar to the SMeasure, but the numerator of the formula is replaced by $R_i(x)$, the mean squared Euclidean distance to all other points, and there is a $\log$-term inside the sum:

\[H^{(k)}(x|y) = \dfrac{1}{N} \sum_{i=1}^{N} -\log \left( \dfrac{R_i(x)}{R_i^{(k)}(x|y)} \right).\]

Parameters are the same and $R_i^{(k)}(x|y)$ is computed as for SMeasure.

See also: ClosenessMeasure.

source
Associations.MMeasureType
MMeasure <: ClosenessMeasure
 MMeasure(; K::Int = 2, dx = 2, dy = 2, τx = - 1, τy = -1, w = 0)

The MMeasure (Andrzejak et al., 2003) is a pairwise association measure. It quantifies the probability with which close state of a target timeseries/embedding are mapped to close states of a source timeseries/embedding.

Note that τx and τy are negative by convention. See docstring for SMeasure for an explanation.

Usage

  • Use with association to compute the raw m-measure statistic.
  • Use with independence to perform a formal hypothesis test for directional dependence.

Description

The MMeasure is based on SMeasure and HMeasure. It is given by

\[M^{(k)}(x|y) = \dfrac{1}{N} \sum_{i=1}^{N} -\log \left( \dfrac{R_i(x) - R_i^{(k)}(x|y)}{R_i(x) - R_i^k(x)} \right),\]

where $R_i(x)$ is computed as for HMeasure, while $R_i^k(x)$ and $R_i^{(k)}(x|y)$ is computed as for SMeasure. Parameters also have the same meaning as for SMeasure/HMeasure.

See also: ClosenessMeasure.

source
Associations.LMeasureType
LMeasure <: ClosenessMeasure
 LMeasure(; K::Int = 2, dx = 2, dy = 2, τx = - 1, τy = -1, w = 0)

The LMeasure (Chicharro and Andrzejak, 2009) is a pairwise association measure. It quantifies the probability with which close state of a target timeseries/embedding are mapped to close states of a source timeseries/embedding.

Note that τx and τy are negative by convention. See docstring for SMeasure for an explanation.

Usage

  • Use with association to compute the raw L-measure statistic.
  • Use with independence to perform a formal hypothesis test for directional dependence.

Description

LMeasure is similar to MMeasure, but uses distance ranks instead of the raw distances.

Let $\bf{x_i}$ be an embedding vector, and let $g_{i,j}$ denote the rank that the distance between $\bf{x_i}$ and some other vector $\bf{x_j}$ in a sorted ascending list of distances between $\bf{x_i}$ and $\bf{x_{i \neq j}}$ In other words, $g_{i,j}$ this is just the $N-1$ nearest neighbor distances sorted )

LMeasure is then defined as

\[L^{(k)}(x|y) = \dfrac{1}{N} \sum_{i=1}^{N} -\log \left( \dfrac{G_i(x) - G_i^{(k)}(x|y)}{G_i(x) - G_i^k(x)} \right),\]

where $G_i(x) = \frac{N}{2}$ and $G_i^K(x) = \frac{k+1}{2}$ are the mean and minimal rank, respectively.

The $y$-conditioned mean rank is defined as

\[G_i^{(k)}(x|y) = \dfrac{1}{K}\sum_{j=1}^{K} g_{i,w_{i, j}},\]

where $w_{i,j}$ is the index of the $j$-th nearest neighbor of $\bf{y_i}$.

See also: ClosenessMeasure.

source

Recurrence measures

Associations.MCRType
MCR <: AssociationMeasure
+\log \left( \dfrac{G_i(x) - G_i^{(k)}(x|y)}{G_i(x) - G_i^k(x)} \right),\]

where $G_i(x) = \frac{N}{2}$ and $G_i^K(x) = \frac{k+1}{2}$ are the mean and minimal rank, respectively.

The $y$-conditioned mean rank is defined as

\[G_i^{(k)}(x|y) = \dfrac{1}{K}\sum_{j=1}^{K} g_{i,w_{i, j}},\]

where $w_{i,j}$ is the index of the $j$-th nearest neighbor of $\bf{y_i}$.

See also: ClosenessMeasure.

source

Recurrence measures

Associations.MCRType
MCR <: AssociationMeasure
 MCR(; r, metric = Euclidean())

An association measure based on mean conditional probabilities of recurrence (MCR) introduced by Romano et al. (2007).

Usage

  • Use with association to compute the raw MCR for pairwise or conditional association.
  • Use with IndependenceTest to perform a formal hypothesis test for pairwise or conditional association.

Description

r is mandatory keyword which specifies the recurrence threshold when constructing recurrence matrices. It can be instance of any subtype of AbstractRecurrenceType from RecurrenceAnalysis.jl. To use any r that is not a real number, you have to do using RecurrenceAnalysis first. The metric is any valid metric from Distances.jl.

For input variables X and Y, the conditional probability of recurrence is defined as

\[M(X | Y) = \dfrac{1}{N} \sum_{i=1}^N p(\bf{y_i} | \bf{x_i}) = -\dfrac{1}{N} \sum_{i=1}^N \dfrac{\sum_{i=1}^N J_{R_{i, j}}^{X, Y}}{\sum_{i=1}^N R_{i, j}^X},\]

where $R_{i, j}^X$ is the recurrence matrix and $J_{R_{i, j}}^{X, Y}$ is the joint recurrence matrix, constructed using the given metric. The measure $M(Y | X)$ is defined analogously.

Romano et al. (2007)'s interpretation of this quantity is that if X drives Y, then M(X|Y) > M(Y|X), if Y drives X, then M(Y|X) > M(X|Y), and if coupling is symmetric, then M(Y|X) = M(X|Y).

Input data

X and Y can be either both univariate timeseries, or both multivariate StateSpaceSets.

Estimation

source
Associations.RMCDType
RMCD <: AssociationMeasure
+\dfrac{1}{N} \sum_{i=1}^N \dfrac{\sum_{i=1}^N J_{R_{i, j}}^{X, Y}}{\sum_{i=1}^N R_{i, j}^X},\]

where $R_{i, j}^X$ is the recurrence matrix and $J_{R_{i, j}}^{X, Y}$ is the joint recurrence matrix, constructed using the given metric. The measure $M(Y | X)$ is defined analogously.

Romano et al. (2007)'s interpretation of this quantity is that if X drives Y, then M(X|Y) > M(Y|X), if Y drives X, then M(Y|X) > M(X|Y), and if coupling is symmetric, then M(Y|X) = M(X|Y).

Input data

X and Y can be either both univariate timeseries, or both multivariate StateSpaceSets.

Estimation

source
Associations.RMCDType
RMCD <: AssociationMeasure
 RMCD(; r, metric = Euclidean(), base = 2)

The recurrence measure of conditional dependence, or RMCD (Ramos et al., 2017), is a recurrence-based measure that mimics the conditional mutual information, but uses recurrence probabilities.

Usage

  • Use with association to compute the raw RMCD for pairwise or conditional association.
  • Use with IndependenceTest to perform a formal hypothesis test for pairwise or conditional association.

Description

r is a mandatory keyword which specifies the recurrence threshold when constructing recurrence matrices. It can be instance of any subtype of AbstractRecurrenceType from RecurrenceAnalysis.jl. To use any r that is not a real number, you have to do using RecurrenceAnalysis first. The metric is any valid metric from Distances.jl.

Both the pairwise and conditional RMCD is non-negative, but due to round-off error, negative values may occur. If that happens, an RMCD value of 0.0 is returned.

Description

The RMCD measure is defined by

\[I_{RMCD}(X; Y | Z) = \dfrac{1}{N} \sum_{i} \left[ \dfrac{1}{N} \sum_{j} R_{ij}^{X, Y, Z} @@ -107,4 +109,4 @@ \log \left( \dfrac{\sum_{j} R_{ij}^{X} R_{ij}^{Y} }{\sum_{j} R_{ij}^{X, Y}} \right) -\right]\]

Estimation

source
+\right]\]

Estimation

source
diff --git a/dev/causal_graphs/index.html b/dev/causal_graphs/index.html index 64a0fb87..d3d6d895 100644 --- a/dev/causal_graphs/index.html +++ b/dev/causal_graphs/index.html @@ -1,7 +1,7 @@ -Network/graph inference · Associations.jl

Inferring causal graphs

Directed causal graphical models, estimated on observed data, is an incredibly useful framework for causal inference. There exists a plethora of methods for estimating such models.

Useful reading:

  • Pearl, J. Glymour, M., & Jewell, N. P. (2016). Causal inference in statistics: A primer. John Wiley & Sons. An excellent introductory book, suitable for anyone interested, from a beginners to experts.
  • Glymour, C., Zhang, K., & Spirtes, P. (2019). Review of causal discovery methods based on graphical models. Frontiers in genetics, 10, 524. The authoritative overview of causal discovery from graphical models. Many more methods have also emerged since this paper.

Causal graph API

The API for inferring causal graphs is defined by:

Associations.infer_graphFunction
infer_graph(algorithm::GraphAlgorithm, x) → g

Infer graph from input data x using the given algorithm.

Returns g, whose type depends on algorithm.

source
Associations.GraphAlgorithmType
GraphAlgorithm

The supertype of all causal graph inference algorithms.

Concrete implementations

  • OCE. The optimal causation entropy algorithm for time series graphs.
  • PC.
source

Optimal causation entropy

Associations.OCEType
OCE <: GraphAlgorithm
+Network/graph inference · Associations.jl

Inferring causal graphs

Directed causal graphical models, estimated on observed data, is an incredibly useful framework for causal inference. There exists a plethora of methods for estimating such models.

Useful reading:

  • Pearl, J. Glymour, M., & Jewell, N. P. (2016). Causal inference in statistics: A primer. John Wiley & Sons. An excellent introductory book, suitable for anyone interested, from a beginners to experts.
  • Glymour, C., Zhang, K., & Spirtes, P. (2019). Review of causal discovery methods based on graphical models. Frontiers in genetics, 10, 524. The authoritative overview of causal discovery from graphical models. Many more methods have also emerged since this paper.

Causal graph API

The API for inferring causal graphs is defined by:

Associations.infer_graphFunction
infer_graph(algorithm::GraphAlgorithm, x) → g

Infer graph from input data x using the given algorithm.

Returns g, whose type depends on algorithm.

source
Associations.GraphAlgorithmType
GraphAlgorithm

The supertype of all causal graph inference algorithms.

Concrete implementations

  • OCE. The optimal causation entropy algorithm for time series graphs.
  • PC.
source

Optimal causation entropy

Associations.OCEType
OCE <: GraphAlgorithm
 OCE(; utest::IndependenceTest = SurrogateAssociationTest(MIShannon(), KSG2(k = 3, w = 3)),
       ctest::C = LocalPermutationTest(CMIShannon(), MesnerShalizi(k = 3, w = 3)),
-      τmax::T = 1, α = 0.05)

The optimal causation entropy (OCE) algorithm for causal discovery Sun et al. (2015).

Description

The OCE algorithm has three steps to determine the parents of a variable xᵢ.

  1. Perform pairwise independence tests using utest and select the variable xⱼ(-τ) that has the highest significant (i.e. with associated p-value below α) association with xᵢ(0). Assign it to the set of selected parents P.
  2. Perform conditional independence tests using ctest, finding the parent Pₖ that has the highest association with xᵢ given the already selected parents, and add it to P. Repeat until no more variables with significant association are found.
  3. Backwards elimination of parents Pₖ of xᵢ(0) for which xᵢ(0) ⫫ Pₖ | P - {Pₖ}, where P is the set of parent nodes found in the previous steps.

τmax indicates the maximum lag τ between the target variable xᵢ(0) and its potential parents xⱼ(-τ). Sun et al. 2015's method is based on τmax = 1.

Returns

When used with infer_graph, it returns a vector p, where p[i] are the parents for each input variable. This result can be converted to a SimpleDiGraph from Graphs.jl (see example).

Usage

OCE is used with infer_graph to infer the parents of the input data. Input data must either be a Vector{Vector{<:Real}}, or a StateSpaceSet.

Examples

source
Associations.OCESelectedParentsType
OCESelectedParents

A simple struct for storing the parents of a single variable xᵢ inferred by the OCE algorithm. When using OCE with infer_graph, a Vector{OCESelectedParents} is returned - one per variable in the input data.

Assumptions and notation

Assumes the input x is a Vector{Vector{<:Real}} or a StateSpaceSet (for which each column is treated as a variable). It contains the following fields, where we use the notation xₖ(τ) to indicate the k-th variable lagged by time-lag τ. For example, x₂(-3) is the variable x[2] lagged by 3 time steps.

Fields

  • i: The index of the target variable (i.e. xᵢ(0) is the target).
  • all_idxs: The possible variable indices of parent variables (i.e. 1:M, where M is the number of input variables).
  • parents_js: The variable indices of the selected parent variables –- one per selected parent.
  • parents_τs: The lags for the selected parent variables –- one per selected parent.
  • parents: A vector containing the raw, time-lagged data for each selected parent variables. Let τ = parents_τs[k] and j = parents_js[k]. Then parents[k] is the raw data for the variable xⱼ(-τ).
source

PC

Associations.PCType
PC <: GraphAlgorithm
+      τmax::T = 1, α = 0.05)

The optimal causation entropy (OCE) algorithm for causal discovery Sun et al. (2015).

Description

The OCE algorithm has three steps to determine the parents of a variable xᵢ.

  1. Perform pairwise independence tests using utest and select the variable xⱼ(-τ) that has the highest significant (i.e. with associated p-value below α) association with xᵢ(0). Assign it to the set of selected parents P.
  2. Perform conditional independence tests using ctest, finding the parent Pₖ that has the highest association with xᵢ given the already selected parents, and add it to P. Repeat until no more variables with significant association are found.
  3. Backwards elimination of parents Pₖ of xᵢ(0) for which xᵢ(0) ⫫ Pₖ | P - {Pₖ}, where P is the set of parent nodes found in the previous steps.

τmax indicates the maximum lag τ between the target variable xᵢ(0) and its potential parents xⱼ(-τ). Sun et al. 2015's method is based on τmax = 1.

Returns

When used with infer_graph, it returns a vector p, where p[i] are the parents for each input variable. This result can be converted to a SimpleDiGraph from Graphs.jl (see example).

Usage

OCE is used with infer_graph to infer the parents of the input data. Input data must either be a Vector{Vector{<:Real}}, or a StateSpaceSet.

Examples

source
Associations.OCESelectedParentsType
OCESelectedParents

A simple struct for storing the parents of a single variable xᵢ inferred by the OCE algorithm. When using OCE with infer_graph, a Vector{OCESelectedParents} is returned - one per variable in the input data.

Assumptions and notation

Assumes the input x is a Vector{Vector{<:Real}} or a StateSpaceSet (for which each column is treated as a variable). It contains the following fields, where we use the notation xₖ(τ) to indicate the k-th variable lagged by time-lag τ. For example, x₂(-3) is the variable x[2] lagged by 3 time steps.

Fields

  • i: The index of the target variable (i.e. xᵢ(0) is the target).
  • all_idxs: The possible variable indices of parent variables (i.e. 1:M, where M is the number of input variables).
  • parents_js: The variable indices of the selected parent variables –- one per selected parent.
  • parents_τs: The lags for the selected parent variables –- one per selected parent.
  • parents: A vector containing the raw, time-lagged data for each selected parent variables. Let τ = parents_τs[k] and j = parents_js[k]. Then parents[k] is the raw data for the variable xⱼ(-τ).
source

PC

Associations.PCType
PC <: GraphAlgorithm
 PC(pairwise_test, conditional_test;
-    α = 0.05, max_depth = Inf, maxiters_orient = Inf)

The PC algorithm (Spirtes et al., 2000), which is named named after the first names of the authors, Peter Spirtes and Clark Glymour, which is implemented as described in Kalisch and Bühlmann (2008).

Arguments

Keyword arguments

  • α::Real. The significance level of the test.
  • max_depth. The maximum level of conditional indendence tests to be performed. By default, there is no limit (i.e. max_depth = Inf), meaning that maximum depth is N - 2, where N is the number of input variables.
  • maxiters_orient::Real. The maximum number of times to apply the orientation rules. By default, there is not limit (i.e. maxiters_orient = Inf).
Directional measures will not give meaningful answers

During the skeleton search phase, if a significance association between two nodes are is found, then a bidirectional edge is drawn between them. The generic implementation of PC therefore doesn't currently handle directional measures such as TEShannon. The reason is that if a directional relationship X → Y exists between two nodes X and Y, then the algorithm would first draw a bidirectional arrow between X and Y when analysing the direction X → Y, and then removing it again when analysing in the direction Y → X (a similar situation would also occur for the conditional stage). This will be fixed in a future release. For now, use nondirectional measures, e.g. MIShannon and CMIShannon!

Description

When used with infer_graph on some input data x, the PC algorithm performs the following steps:

  1. Initialize an empty fully connected graph g with N nodes, where N is the number of variables and x[i] is the data for the i-th node.
  2. Reduce the fully connected g to a skeleton graph by performing pairwise independence tests between all vertices using pairwise_test. Remove any edges where adjacent vertices are found to be independent according to the test (i.e. the null hypothesis of independence cannot be rejected at significance level 1 - α).
  3. Thin the skeleton g by conditional independence testing. If x[i] ⫫ x[j] | x[Z] for some set of variables Z (not including i and j) according to conditional_test (i.e. the null hypothesis of conditional independence cannot be rejected at significance level 1 - α), then the edge between i and j is removed, and we record the separating set S(i, j) = Z. Independence tests are first performed for conditioning sets of size 1, and repeated for conditioning sets of increasing size, which in most cases limits the number of tests needed. The separating sets S(i, j), which records which variables were in the conditioning set that rendered variables i and j independent, are recorded. If max_depth is an integer, then this procedure is performed on conditioning sets of sizes 1:max_depth, and if max_depth == nothing, then all possible conditioning set sizes are potentially used.
  4. Create a directed graph dg from g by replacing every undirected edge X - Y in g by the bidirectional edge X ↔ Y (i.e. construct two directional edges X → Y and Y → X). Orientiation rules 0-3 are then repeatedly applied to dg until no more edges can be oriented:
    • Rule 0 (orients v-structures): X ↔ Y ↔ Z becomes X → Y ← Z if Y is not in the separating set S(X, Z).
    • Rule 1 (prevents new v-structures): X → Y ↔ Z becomes X → Y → Z if X and Z are not adjacent.
    • Rule 2 (avoids cycles): X → Y → Z ↔ X becomes X → Y → Z ← X.
    • Rule 3: To avoid creating cycles or new v-structures, whenever X - Y → Z, X - W → Z, and X - Z but there is no edge between Y and W, turn the undirected X - Z edge into the directed edge X → Z.

The resulting directed graph (a SimpleDiGraph from Graphs.jl) is then returned.

Examples

source
+ α = 0.05, max_depth = Inf, maxiters_orient = Inf)

The PC algorithm (Spirtes et al., 2000), which is named named after the first names of the authors, Peter Spirtes and Clark Glymour, which is implemented as described in Kalisch and Bühlmann (2008).

Arguments

Keyword arguments

  • α::Real. The significance level of the test.
  • max_depth. The maximum level of conditional indendence tests to be performed. By default, there is no limit (i.e. max_depth = Inf), meaning that maximum depth is N - 2, where N is the number of input variables.
  • maxiters_orient::Real. The maximum number of times to apply the orientation rules. By default, there is not limit (i.e. maxiters_orient = Inf).
Directional measures will not give meaningful answers

During the skeleton search phase, if a significance association between two nodes are is found, then a bidirectional edge is drawn between them. The generic implementation of PC therefore doesn't currently handle directional measures such as TEShannon. The reason is that if a directional relationship X → Y exists between two nodes X and Y, then the algorithm would first draw a bidirectional arrow between X and Y when analysing the direction X → Y, and then removing it again when analysing in the direction Y → X (a similar situation would also occur for the conditional stage). This will be fixed in a future release. For now, use nondirectional measures, e.g. MIShannon and CMIShannon!

Description

When used with infer_graph on some input data x, the PC algorithm performs the following steps:

  1. Initialize an empty fully connected graph g with N nodes, where N is the number of variables and x[i] is the data for the i-th node.
  2. Reduce the fully connected g to a skeleton graph by performing pairwise independence tests between all vertices using pairwise_test. Remove any edges where adjacent vertices are found to be independent according to the test (i.e. the null hypothesis of independence cannot be rejected at significance level 1 - α).
  3. Thin the skeleton g by conditional independence testing. If x[i] ⫫ x[j] | x[Z] for some set of variables Z (not including i and j) according to conditional_test (i.e. the null hypothesis of conditional independence cannot be rejected at significance level 1 - α), then the edge between i and j is removed, and we record the separating set S(i, j) = Z. Independence tests are first performed for conditioning sets of size 1, and repeated for conditioning sets of increasing size, which in most cases limits the number of tests needed. The separating sets S(i, j), which records which variables were in the conditioning set that rendered variables i and j independent, are recorded. If max_depth is an integer, then this procedure is performed on conditioning sets of sizes 1:max_depth, and if max_depth == nothing, then all possible conditioning set sizes are potentially used.
  4. Create a directed graph dg from g by replacing every undirected edge X - Y in g by the bidirectional edge X ↔ Y (i.e. construct two directional edges X → Y and Y → X). Orientiation rules 0-3 are then repeatedly applied to dg until no more edges can be oriented:
    • Rule 0 (orients v-structures): X ↔ Y ↔ Z becomes X → Y ← Z if Y is not in the separating set S(X, Z).
    • Rule 1 (prevents new v-structures): X → Y ↔ Z becomes X → Y → Z if X and Z are not adjacent.
    • Rule 2 (avoids cycles): X → Y → Z ↔ X becomes X → Y → Z ← X.
    • Rule 3: To avoid creating cycles or new v-structures, whenever X - Y → Z, X - W → Z, and X - Z but there is no edge between Y and W, turn the undirected X - Z edge into the directed edge X → Z.

The resulting directed graph (a SimpleDiGraph from Graphs.jl) is then returned.

Examples

source
diff --git a/dev/examples/examples_associations/437dc7e3.png b/dev/examples/examples_associations/437dc7e3.png new file mode 100644 index 0000000000000000000000000000000000000000..692507c12d4b0933f7015f32c7e1f7456d32f12f GIT binary patch literal 168903 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
ycv#4ecc-^c?Dxwji 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

a9>{B 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

`TcEg7ar$dE|N+5E)0MWwCP zR=4Vn&RiWwX&K7bS7z5MZ{}n%qy18^SxJheoX<#6I1;g>S{y<$?Ig??d(xjXf56wr zWKom%SoeS?q3R+kNc~7Wb@a8HYm={s`dG+RpoQOy?|t~NY0+LvL`=e6Tu$Qp>dcIxW?HmYuQQ~Ng+eK6hER}M#p6*<}boElR|9hS@N6ohF$ zKF?hrU%KXJz`Lt_2ce%p#6<-}ML%KQ7aVNG`MU7kIE+VO!39iuZ62*yh6mFgC-5@_ccw&=Wz;JW*CEIRr%x?d80SAfq^RZEfn+!$%c3CQX z@=V$gy2OCzC&TK&My`AZa)OAL?{NHPzU8SM1pY=K%yQ-z6jb;uWB{m-W0g%-K;I7J z?cgs}vRk>_T@FKYRVFPrsCZ-P5_|v3PkPUPYvA?xa$;M@z;k)m@{Y@4x9U%Iq`r=H z7G}SqK`>WDx>9DhY=<`~J+GaOP28hLVx@szS3)wqly?-+Z6j1M;Cf(c_b}>8i=edjrdb*Di@4>pXl-`NP^|@;%>#=Cw~< zx$YO%nUa|b=&nddMRCX7)}T7YVth$TM`r1RQerPxZ*WHMmEDgY_k0kM<^I2! z?pgr~i!CUgyop34#6zAz7g0Eat?Yd8vi9b|m~F_?1Ag!xnMc2|GfZ`#WM5w&PihFU7W|`RH#maoe-X%e z9VPJYV`PE6qL4T=RS3o#4lS;q@Y%|$9_R{8kGuq?JZ+Jr5zi8eaPA_Ttof9Ul~rcY zsoL6K5dzs%)yL2TJeNx_fm}AVb@Ys>DG&|M(XU5QN}^+zW~GMU1^>g<`7Vy0ae6^O^h3S}srDrMY#}_VBBu57DGu{=eflre43d+I{Ul=?+!GGbZMm zCk6Pr*OD-cwg2eR?@+O6>mrE(F}?fxw1Jny$u)-PKc0`=MEH#QjaP%RxIPKCbNw|| z&ZN3@Ev8maH=UCCcKQ8NJDObvl1Vs^5Mr2_m^udf7+*Y$CKi?}Mcv=O0|y^NX8@c# z?8yV%J+yI3-m_`iYj@%V)&GolUi{0Zu&Jv_cE!E`C_jJNgT_423 zMFlBzYy3y)0%SMIvw5%D>6gPrZCYD>4ZoSRy-j=nm8!upE~Z>)|J!%5?b|wqZ%Brw zy-WKjNPNx&$5IHAvDEM)otUFo?qMcYU*3 zs%9*?f2e*GUGLV5-+u%LPn`5MI?F=nAeI*9%-+6~&)()U;3)%UoW;wytn(2y5C4?IT-O=xLl`or{!i?cm(MOzITqjQ$h|0zsquwC4L{?-cJ61FXy%U zEa}mW;r$_Cm!evn zIGLSJWK%F6MW>1~2RNDuz1ctZ<3=&27NBoDP#6T15vsoIpPqmcflHqM^uQWHD?a|p z=DH6jX9{SSgX?kzw@}yiRR>`VZ`JsP?{{bAH)R+d$Bb~PMb3|>c2cVtMFU&ya!2R9 z(s_lx)yMhQBI&+Ls2ntMr)M44sFUDwZaDCKAi<0; zOiXuOB~!sjg-F&IP{aD>y(pm<78mP!fa{<=Rio;y@M){9eR`*BX?`9( zX5jJ^n+hGw3V{2;;{IZseLs6fTG}}PLJ@bMFJGMK*vX3-KRYbgrK7_=qhNBNG#*8( z1xd2;V)yfxFZ}?Tz?0=yiA?lfZ-)D^jB^_NjJx^y3!b0kT)Cq=v%=TIx_$R!?atqJ zj*pFGqk?>{Ef_~Q{rUAlMU43A-~F&6wCjPZ!AJ-e3=r|7@-u{M&mhavdmw>{3u@ls z@$nAkA#Z8bj!2JW~hi~E2mBnYLq9cczHdNo!v(Pz5kp7mKMMkNnxC8V!4yNHuF2^ayRf4obaEFbCnuA|Nmz3<{7iuc#Xtr4 zEFku0cm#H#r#RuW2G*s#tc-?Ru_89pSrrm+b*jXqq^mPxnS&bh(@GK&mjEUs8lSE* zA#tpP@^AqnSbV=Gg{0I}CHtnk=pqlb&159TZ`Rr7xV1V|9-Y^I%dprYIAP)WOMNuY zKFL>$|3%Az(FBtQPxn=0W68f}E6RV&nqx@`C&&@0C-$Ra>J_@SHP`%F?c1<%1r3Y~ zcY^qbdLO_F=bk-wqyl=6J`G+%Wefp;7ZwUIp9(y8yptCWDfne%CIILNAms@yt(EoF zH$S+F;Pc8%MFxNk*WG2f5G)Pc$umwQvoFs(nBSC8P~ha1xja;dmA!(|&%QW<-o^fC zos%c8dU&|h>`B`GO3l;?F47Q5f=%-F&VGfjvkp5cc+2p|CfVORSP>dfzWF}y-OQW* za;H(IW}E8D&*^TDB!lVbjoa^59~kZ#n-SRMJ-0k5FUL^kaKZOGd6fvU_@+hu;XgYN zT=s^L794k_>A}dsf21VvwC68Hg5Kp=cCM`*Eu>b@dWtxL!RWoAa2gmk3HgSwf&cOd z8v%Cj<~>6PsXJg7d0eKlvhR=?efeUrY^*DQ@v!%wKkHAFLR`4Awj{FFU$mEqtUSRvLv{oPn()*(S-sUZ{G>~Doo3|ySszU>?v^i zIWZx8M(@|?C<+z)`RhEGf57uT3-HU@dJwpFfQ**kQaTxmlA6#RnKg+4-`jL1tC-X=P-s=t98c;N=FviTsTNdAkNM z3>lgBh6XGuQFDEZlZv-c0Y&bwkHKFoyvVPBD|&WA1Ydg#t#IV&JU_gh;W z2dMUuIkcquIp{|yhV_5S`z?zeIpTw2s!(<>3o|pmIi$d#14e<)M^(6HPn@EoVU>7W zQ-dUH12*mR)N(dHGq4G605VQaSwF6UdNDh52CLT(S)6-C8`su z*ZaXm(fZuk8-n+#9veQo)LLFM*?r_fSvR}WyWfW#%?3EPUsFYtMm*6ydGbzVWI1?g z_WhltY1-Z%2NhRkMvbh~;~tnzUp)BXL}#Ti%nEsBKv|hj?to=hw-5=&Nke+BLi*#o zJeBqMG0cG7@pA%y#9+vc<_SpNjv(Gbcg?^MkGc_#ju_@ShB=I5$KVjK08*fYBAyyk zdN}b-pFUN<=G6GXD*)6Wcd8*hR#UTuPZjjUduT=>W&*JRK;B-06@YwlyAIKS%c(7c zgp`7s^C%-PUSc|CJ)i?Y#Q-+~Q(#FDlc=&;O7?S_$uX2LzBg3yzEg`|oZ{1{a}|}gI*D1^|MleRJajUDns*U| zHTlB1|DF+Y;+N^lymQI9$w#rj((fi++>0|4&&$f#Plte$x%(;-x_7iNe$o zVeGCU(oc+`{Y6kt5S?ZteCKApD`0#%hl;2<&-CuyWwlSDe_5;6|NgxBvh?>OgPzIa z-w&6kem$R3O;Op?&cS?uSD#@XidgR`uU@C-djh% zkuu#=dMvrfC%2%0@lP-YVeTpTf_f^g4gA%b>ShD)$K%@Ck`fZwSCWWOVRsEeK1>2e z)?-N0mUKrAq8(2tPSoBUiruQ{d{g9o++iwMGMZ`kprl(xR<{%VBGfd*Lu0m!FBJK$ z2ou5E_I zXCBwNdGFDii`REkFfEfF^!VCf=g$)$c+7H}9fW(Whb-s9WF>!o;~!OFzu~UPOQOGz z_>`l0sJiVlz^pu@U?eH5ttWlHmtN(Qhui+**xbfs%6buQ%rA65#dvU>oJJeC%DF8k z6pX{mZE$wSP>U+n_OKcXyD&G(r%#^1^_MSjfsQQrrkwB&25~ZRCV>m6-3^&U-`nKP z-k7S*AgVV!mFtb#1=lEUQnT5(xWIa1e!5p~ZvALU^%y1xFeS_A`S9gaTnw)0^Y8}d z@)Sx(zJ;tjp$Z8gK{UJG?)+yMFyEWkE_FUT&&3id!~PpJXgFjsMdII(4?nUPt`YgktI+&rn0LFl(t%v>o-a=FGECbJ z60x#XcuXLHq+bP9q_we1lGb4$6PN3hOu1W?nj(aUDprfXI2{g*MlS-y`S?@~_SHJP z!8Gs#m|x(!0LmJ=o@?#U`X~U8?9YkmV59$O0cQGpdU}X1so?$)M`M0Fn>I*{!1xS* zdj&NlPPd@>fnB`D{jM&UWA5pZlaX1(ydS>a_P>!sK4$4j-|I>&rZLZiYGk)6A}Nab z99y?f2;qOGvt6qAO2g9mp@+l7!1&mh1S@sp214{MYU*`xOBm?ppr?QGcy8;;@K8+^ zoMt|b2)}T9cPKMR5xa*+)1Icre|e+o#k>+X`H9O~(zquE5A;r^2r zMJ|bXd6z3|hB3&!fv~ijlk_W5|f_uId{kNxL9 z_Hk_gym_tlto7W_eP6?Qo!5Ewua7wyTVn~n*4X#&;-zK0M|SH(I})8iMiH^GX3*ur zp$F0r7VUWUFPFg=*AtpY{eCBDh9Brhfi)Suk0(!7&DEY0XQ3@4I$FW?Y^~lPR|hi$ z-mWx+YzTttI-H{HHCa_XBQ;`$wiq3mxZV8po`Q;Ag@C(Za<}H5h_P-CT37bivL@NW zwB}O^;&rLMB;Iw?(m+Y3;P9txejnW;D-NFIx2dUzbT?*)R5Ru~5%SEqkHNT5wnSlh~Sn_s;eukP6{7#8mi_o zqNK|l=FR)!P3$AAKg#!Jh&lxX?7@)@D6`@6J#BR5$`$T~EgRN%O$g@6aWCFCGB%EZ z@@ma-KeT7h!}X=AZx%i~ed|NZmvyS4FM@89NSb*lsEg_`Q zJ>sU5Ya#(LT5%h?nER#4$pq6FtTxPjLjA7dmhdc4UnziSjW#m|vZb~4eL5ucp*O#@wMp&W>&Zcd7#ymbE5AA~foTh#iZLqt z!Lh$!JN=Ss-a-BfAIHeXNVNf69xC#tO`F=UN;szRJRWsFZDJxw?^|t|O`Sx)PDmN) z;x@KJ;*kF?q`2%Q-;cI_2vwvMZ@couBDa-oXVXY|UKgVF`Pd(^^U2mtDOBWRe6Iyl zv|dwCFx!|8Uh})TDEanPz!Sb=i#ua-;6bInYM(H+NLaZaq|&5uFx!0y<+U+Jv9_M9 z_>}$Zs#47jYH+fuFNY^5yRma%8G+I)EiU$j9&VpYNJ=7DPi~sev{X2QaN6(Ep)VQ1 z!lE&vMc2TnbPWDV3I3t_0dxfvr1yD#hEl5_`z_Em#1UpAWW=mC*`LX1qv$EV{`l-( zdR2ZJGZmA_foLrBk7aI@ZwStK&0cQqng-@r1yP-)Pt2E|s6bVMhu~8onT4_rls|!G zvtdNwkyN)Lw&fiLPC}QD@s@^KlAw>^tFXA+4C?&Y2q4Q7^NkSd)~K|zB6GEWs;89C z!4T`s;e$UXB_`tTH2Bqd8Hk=Maza{K=Sx$WW%oPV`m?`+^DD`nx4KncJ*N_F?+^#KYrT0&+s<+&#z0qy7`0lv?3K zkdWS+3GLOn?~PnMPcTQ$AoGk+gxHZXbmYqWG+3Xw-|xlwBT(h?t{yN2KST_nyV;@B zK-OWi=ILlL?{esARCZ=JM4{(vb|2ruh>5oLos$o^P>&s-ngWm>6BP6c6Nc`{A=>7U zj0%W7sCu?C|O|8lBTX4*_HX_Q%BVkp&7E|AX$7QI7Mo} zdGT~=otUbejchF2PV0`GI=h=`HD!m_aYZU$=agyB zZ<@B>U6=G00IFO|@JWt4(<64b{0+lK+6g!*p`=-^%*=B&}!kVvR}RGpK%37h+Gv@mprw2O|s07IXnMEKnmXI z5r?wde+j8Mm@#7f5OQOPZ6IkvT^$(_*OQv{cluz4prj4#jfxB{2GHuTyy$RR{!zXS z2Ndn7uvpI7hX?BZR`k)sr zssZZ5u~Ibq_|EKK?{15y30;Ah7$hvSK!-k${sfm1V{*U;^L^vb4xI+%6pzzH`&PFO zA3dM4rJokXHnTAtfpLw}n8#Mlj|MTIc7uW5iH|Yu6xQbQ^uD*t6(HtZ!&Q zkjOos(H~lljh~;}d(6l7@vh}J@x0+2KENJ#GBEVLzLO3{I4%W-&

hj&$h;M?x@fR@lE!RdHgmPqxj=~yD4}eJX&j&_nzQ7iN zc9(O7AEU~-;UYLh7;`mRZ7~rMUq3&@R{Z$E+@A&)01Idvac$Yahgyg<_~Jb;El!;~ z_x!tIZrw&pU4G8C_3H=c6cI53~dRmqVs{%KG z={v+TpntHQ4Q#V-hPrXDi+1GIUzwo-ryv+pUc2s(3I(?Oyf6?^g&!) z&*`@I1z-taUBa)TiBBV3=?W%51=*1|)IvUh=|Lh2cWz&MfpnlNrGD`6rhk^}us6FMSP z;7ZY;=t}aKHauy6tHq?cs){JbgWU=B2Y|v*7;!#Sf@lE@4a{z(ERCI8SOAbwRbE0T zk4Te%!E?@^gqj9W9gyo0p~=a4KotNIR8$*q4$)026|VWBs-j}D`wf9GBDzCkC3Z7W zCl(Vs{py^ezJ5r7ASOHmbOD};X^J{vgp$X4byi=C=KQcBQng-%5rpe z4yG16c+l+i#iy1HgBXPt9GnY#fsB*qNjvi1?OaNjs;Y&_Q;-v%f-Lg2YroKT<>;uT zMHf~VV*F@3+0wzG1a`dUy*X|et_6oBj0Oj>7jJi!J%gx+dyfxh6F~l)?0M+g@~Tw> zB8eZGDNm{;K;?qu6#8qxMUoVNLdp<60)Y+})!hc`gXW9@MdPTGV-zmVB-ns39+-24 zfj_^|v;-1#yHX6S2vmDee~~_PNYYF#&I`zgpi8c{)E!c&Pr4ve$Lkzzjp}~?Eakg;MKFARU1hGo6s2Z zg(8@trK-U38D>{qIzZEo5Q_9EwPFrrwmG20nvKLj@`h2QT~0>xG-Jyy5bCs(tJ% z$KZ_0@vvC!Xl9FX6UF5}Mj2eG(PwqOwUldI)FrQ#^rk>sCZTRhN9RFD^m!NUuq^-v z)I9nVd5w0rFKPaYi%S)S$1qg7!QVuum$sE!wmRGVKGv&5VK$ZH7VYt+eS8WD0oLs; zwF}Je?bzj${XYNowt6+yQ@%cbIU;nO%`WWdIQBR%y5uuYUISuR238UPzJ-QHV)N+O z$HX2C*F<#D3&%S6Fq_2Td3$L%46Ds|2!kp9BEKxkJt+A)dm^=sjc@5vo119SVUMb> zP2`}Z%5NPK2G&w?6qjExhu&D2*cWq=`q&n-%?9EOq3FqqT?4&fP^wMPeJ_!K#x z(UCtKH$GcoZGX;e#Gqz+!xp&`M8CuWO5?oU22=%1r}pDm`}>N@N;u2~l$Z4Q^}7o_ zm^`7Vc=$#x0tLVIVD>N}p{)&O;0*j*ASv)`er{x}F?Ge^a~l7kURm`%{uNWHnd1Q~ z+2@&qMvdfceozEZm@2JH-t=9RT5nsC|N8lXxg`w!&OUEkhb|(ZJQ)w_?o8`~YmKBe zSnysU`ZtTSG`7sFT0@ez*mnOcSY)TJL=M&m2VhjUSI`6@Uy#ozyvN%4nH<70@kj655MUw*out>b|B(C=vj@oLeG(u|vp)VIzTxL4kfUvf^R-!E|kUWwK!J*QbX9!y|7c%blGU|0y3ev^t#zv?4Z>nT-x)yW(bO<(77E82PQ&Ljk!~OPg ztgKod-^+@HdRO+oyt~kwBp=jwL(Q*4lu~H-e_xX@6yR>b#_>`6JbVZZ#0-AjR4#h2 z??<{jz!=lrtu(5g@$e62N7rP+>0c&~+#@`tsL0zn*$obS>$-Joq$9K9ELV8{@%@(X zRn~Fr`S-#y73K$kt|Kx_;03RM0-&dXmD*M1*G)4W&7HTbc4h}YpQ}ih$`cmo=@Aus zzoIL;m6zP;Vz(mo>B5TB@m~3C-y1m_g_ww1>OJ&aeJ_i&*e*{jL~?jQfQGB9REU~B z104f{^PgW1Sl4YEvcY9)8oeF++s05!LQ1}SsQB!6tA>eX-TU&ATlu(Hx2VR9Y3#_g z%sOxw1Oq{qEeUVm{{+=|JwnT0q&s)0NzikddeA{S^ky6*rnOJvcK{gY6?#p z({6Hg-sYZXs#16~;orwjQSAXX1@ZHvBnsUlD3~*{2?-0Y_IvL^IDu6Rd+A`)`9i9& zW7mLi1m%aLxo2`SFa6ZsaL1gHI*tZZsn6LsW`XPB2S{-&m|_iqcu`RuZI84xdqCot zEWn?W%5|3mgIhc~8&mcfkr$3^@myW$|12hyDtCy5(s~8Qj}a=!+zXXA-<3k&3g{L3(IHN7 zeN@l(*(%mtGBZv7EcCaYaoVl$Ixq3X?meH{K(ZM{=K@0MYbcxHEZ6)+X$-tngc68h z^bIeP$R8|4G1qX71DjuT#g+{w0Am~jl*G`J=(0b9V$G?((Bg&pf@^639e-qQ3BNE< zciDb{K7#7?>(ck$eFk7kyxO}QbM3JV2%R);&k{1FUS1ekWW+&N&CcknfTn4LAt(jf z&Yn2P`1+#~Upu9EMs01Tk6Gf>1-Uv(JWt*^+#3uef?hsqC}dz}>MHW)$T2^{*Y~;| zs~((*{N>5I^#!JMD=T{|#Y;>^lnP0d725igI6XRNF zKhoD%e9>Ii@+g}JYMz*`hkzw&y8SCO=urGh{+?V~x`JQ^rOc?&F3mPh>fOH}7`E z3o=3YSz^5)mQ3f`Fe1<~*ZJ{-G0^$pOXU>iiVAV6Hd-c;GIlz?fMh zGQmzE)Y89faCIMpZ_*xrnH`^ZzB^1AxQ^)4-VWfh2c@Tnk5y{o(VSva8BN@291l`A zl<^jyWnfPpK${xQGUIuDm%VqxCEhA^8+kBM6Md!S)z!%b1)#^!DQIhNzxV9I#r>ep zg6-co3BX+GqZ}<^>qv5Sxj0pTiT(-Z1}e6Q+;eEsqWpduuF~-#*sq^nYQ6Q zs%LN`yqPGb0oECC*rh}SS8i$fApL-)qo|C^iYOxe)KsP-8d=q2b37!(7#vW-&?xQ( zu3gwj|6q}bHbIFcaY0HF4Z+(~ zWx9&i+`P&Ym0uD$qS33BAu?d(aG-tLF65FJBlgwI*^be{x@mAL6}uG<{z8 z&Hg>(z{G}D4c9*QJAMFVJR&|*y@PEyHt5a5UL@xyG}1!Y_&5uN#K+ z5#Q#EQ*J0eKE~L|0MVcpe2ZZ8_U{y_7(=!ZS_XqD(95MhG0xtI-k=n&XVz!Tc1=pG6$p@2AIo` z`R_}xA7SV~EaBcr4*X!9Q&(5VOmqK&E;$hMwV{&;sV@x1lt@DRR&hxQ>Z1%BX;{R0 z4;?a|ZGXi=9Pc%g5jhktSD0~9XRk%y9aik_AAiv_02~3Syx)3M{c=&s&`;VRcZ={5 zc&MINjm{W|Qc}ye=uYSKfAvv{Kej`m1a6_G#Y)ap&fe}8B!z5pGj}>TOft2R8v#w5c85N^$ZEEiZ^rEYkFp_;TjfmOcBLCCQiy zEkYz|4Cg*2$ONh~A%Dwn76ZufjLAW3bh*M(iGIix5dhjj{_a0(449mnQM8fl7>zhBt;ncy!K1KBd|HdrA0e}P>r~Xc}{CF ze*s9)sD=?{rFN}-9W7=e(8ccr8IS1o?aBfd2ZZH82YO#|i%J^CVWQc@Beb@yZ4nw# zfMopEqrOd`=GZtM^n~&Cj*00(;b}%P_EYTPo7Yg;)bp3)KnG_`L8CeP=3q{>Z9{Px zl1&hLv7LTR7*Q+s`}HEQ0vFcMN{z%z5bb9%6SDxW%2fv11i+%u8PBli7FG-z%>Zs@ z!kiD?LcuTfBt3B{p(hvv2C>xV@v`inz?YDvT}QIpKwM^YZ0t;-lb2F_zi=;_V=Sxb zz|uiE62t6}ki&Bh9{-2mi@J}NS@zoZx{P6HgcOdV@`DEtN{Wkrq<kG&hgu8?{8mOp8EvS8{eVd;ISk5L-0bZ55p;M zIuBxI1e$aH671r_!pDD@X)5tgfX?=KjGkflB<|uG9+wc5E_tk@KqZ)QBak4}zx6go zyd{n@&c&DlF9SqUu+sq^L*@tM)%ov@_tX+4m%RGQS#W{HN)%1N3sF046q<`=gnRm? zNkQ~o;u(F;e(NoP7yX!2RZ-amfE@5%SNvZ3qSDes|8fCFQ3C_V(&j5Gk?d@=K>d^W zu{i@211Jq zdO$lmJ39EOfl*c>mP@YZ`1bKOK{JP)Pq;)V)U&yd9_iGa`i(*S&Zs>Ep z_||KD8OB9%LT37kE%bJ(EyhB2d>s$?jeM-KA6Ii)J{?}DTIyM9I9O-NWBo05=O&>SNV`eUY%OCr}vN#ww+i)>6xcNGzEk&&_?5nGXIn0Zj!; znq7gBk;H57?y_Rwy{8mU47R~taB*^is}L}bV9W_@s;DwHE)SH`5BCE9>n6D{HRf;zYvEUI)%rWum% zY_$;nM2T>a&dWRAX(E|^T=?eA2-6jewJ#im%VE?4&JDr3{%_w5268CxokjZ{!8*Jb ze^&rcN^Mx*U*qB^8r67TqJCt(pSGc{4mv}DO7WL1RU9|Ma73TBvrENznTCcC8M+ri zPoHKq+CXS%XzK@Cn>^zHC3Ju9b>aB9myZu#^uWnS!}y~(iw0<{U3a7cKtT;q(w#}N zgfM{nT*JW=HzlFS4K^=$BM)gdGqS_b!ILr|bC`l{wEaX3vp|VrxnuqA=NwoEQt)$~ zL^ZUlgCd(KA%&(RP`ucf>G>sH3Moh?9|batb*!VH+S=?*s0-{aaEb!W7|O=O9|jp5 zplu6ADvGSQKv<%OV84A7?L^DFtTjceEm&u|#T(#^#i(D78U zy0Mz^kwfQ~RDFBU{2`{mi=S7+pfuRQ#&%RBh8FMSc*e1TRfv=GeSJ>TQn{#mWzLYx zk&e$v;;6(ffbI!?`hR^W>cb&BaPbuF`1=NF5E(eAOUEx{eSJ;fl%IY0b&63=k{)fO zZF+8ahC?%IEx1IOWTn66izv*Rgq>LaqI)uAx`gD5S$5TI6n)~rX21?l7)D|feducK zw@YNx-|ru8CXqbprb`xjkf7o5qDKIFTQDH`mb$DKaSG97g^fWWA%x?eEy;%kqGb`! za=<_r(xXdIzeQ9|B&@!ldT?4QcA61P=ZF*M*Uj-#X&=L2*nY2_XLx(<;nhFdm?8ta z1BEw?CB`X2fK^Dp8!tHv+?(hNc$i6X%FA{iu1p%9{q+l_qenAIAp>9?GYJ_FRR?MX zIo_vZR6u$2&DC*(($>h)vp7kX;O>;b1fbDz2_Pl6{af0OoxH>(sCQqdrR1866viip~F*OJ%%D16eTVdL1hsQdeV zO4VDv+4f0<(yxz({D1SIDjYM;zW}Lr$XBKOhDFwO(%57-IH z#0!|>YgV>mpILGZ@=1jhu%L^pM?m5S&|A&6F&c6W<{$Aap-du$NCx6s-23)b{Y-%w z6FQv_UP&4vE|f`}6yYSzp_K`RW=^>7DY-sYco!Yi1^&dYE}xGu^d`jQP}hQvrIWfI zmiZe*c(9$nrsyi;)f>XEt>-m@bRzUiW}dxy^9Nt)E1&?du8-gtftG+bV&Z-At79Sj z`UvS;@W(1Qv!tiEl;mafgX7kaJx077+C`xVd&>=DNJT>ff`2GG<)%%S+Ord}SCbqd z^@DeUxwJ>tl_TT&w}|tA!uRPr4=WKn_ktDZ@yJIo%>~UOO)cs$NmSJGaT~Azy8sR3 zPE1d)V&+Q7wZ;k7aJ^j_At&YLt^VVF|mBG93R&0 z_6KMuOBf*`chifAy4qL}GUy>C0}(g33+;zUZKB{MZ`~Yp($RU$#zi1v7yR(x`MJ3( z3YLeSoD6L*g-_z%UoHZJA;F@7es99zLY^N!IVgzi!l8LQt;J59<@VGoHC#g}zR@nv zY106@$^Li$`~;Yt3x`MZl`t8S+-1-iVf)BJ3xF}}emrylx_-f=nvLN}U8K*JO`oUWht6{dh-1%BI-m@)#(%lhb^JHtC> z`L}j}ydfq{a8(0Z%rUVC-dWzc%vLS;B0bmQztAx6I z-U*)Qc&mp+^`ZlbJrD->6?E&#A5dK<>@|eksmYNCFYQM(lYs6@c^~u!6Sf=74o3NO zlR_QX>&iP6n>^{T?GX%}KUa60Q;)-6l=_q%O0$3?z^X_RKodnCt_xyW;d5f$Y6I@l zF%kkm8Ic0-zrbnqzOqmjqs7BUpBXgmMVdo!^p+O~9}!?o=|N&YSSla$p&r0FMV=_o zYmY>(p25@X)_e;BM!1&%dlqqTtF5%GtQ#6*W-E!0Yumg)w_Xt()1HFmZkOJ_Si8_NfP49nHpxG( zg;#h?YU33UXsRe6MsbCQ+br4tU0$A`+m1h)@9a8G#bBksk=Qp4TRHn7_5p^t$MdUNx*u4B^P_4Vo*2IDBKx^Rf9 zoIJVuEeib}=io(cBr(XC3y z(#|KbvD4qaStp%F()yxHguf9u6*yDsPsD7S_L4tfXIc5H)d2Ac=oQa1{yUNL2_15$ zrsARzgP!oD1JoIeM=;iuSO>gw{zl2=hS$Bf1w3uOBnKI!g@_!eFoq5g46}MGTqSOh zihShHgjnHoodVb@SRsNSgqfqcbcFo5lk$)ao+~2VaFirQYY7z<2-^b`%ooQsg3WEkb# zZJu!5oVRdmDL|=kXf0yn# zLfB<`Z4-R+1d0VLXynU-*Z!chSJZQ(6}0Sr!v)~uOqWxTX4&L*z$?le;csKwNbYk& z6Pl5m-XjpCXqZKZQeMP7=HBZCLE3sSn9CLZ5?R(8x^w83g?gRn#zYgi1SANc0^-t= zrUVJp_8EvD#FvCqh^Bjvbhje*@olpL%+ZXuxSIikN(bsNp%9GP!0=XuXSWf*kQJ~R zFU`u1z*wLpfeOK~dz7e<#$O0Wi85kVA<>m(Qbz**KfFX|zb`<#NFgR_tf6%73gy0ix zo6T{@DALZjBGQCA2bKRcOK&>d0Eob-(O>gx_Qx-q$*FoN#8@8i^dNptMaBT{CZJ-d zR)TraBPDxJgZ1cbHyjy|?wNs`=nEI)rDzC61_c_P4xSjAE5O$^in_MDY1Ek|z#5rr zQ#ry2HRdS^?^y_`73y=*mo$;V0#4X3xBc8L+%1s``JePMoB5o zBl?@r?&iI8=fUJ8nxKiWzgpxX+bo_JYq^>@XG+NYIbrFf$^5 zm@fS@1wz)qzyP5cj8%rK?GU!!0lP`A%x4&9ga4@(5Sa|#Kwv4#eaYV?!fnc^-+QSm!ECXmH zqDc64yF(qdctnC-)!3*&vWZyQ@>)EO1iDZ+lX0&LKl+bHZMZ-lJ=X!Ry3=S6+P*x0 z%*-^7IuCa`LAM5M0W_zh7oi9#b@8sXNfb^v^oK_)XUSe zK2l;Ft`=v*v|mB4p|e$J0j93__gETg{~&W*Y)bGQ)kU6* zP+S+n!Z`hBZcgTj?mIHp{pNKZ*SCgnk--*2GojK_I6HYCP76aSa>6l=J&=gsxzlht zpY;S0I06-vr$S8z*)q<&A-IRxV?&i#Ff-SFFVvxlkP4o^I_FZ!yn&8R6CxYpQ6qf~ zlj8TVJ%D4F$G?I{s;aEQ^myzw+#14=*#Pr|WVSiHYV~{kqjbMA_%FOtXl5Xd02FXR ze4c?rmO2>QO#x@&5Wx?E4FXxK5?eRDqZ(lm()zE+O_1ealeGU#K_ZARzZh{o#t2%{ zWo4`QWBrAy+olnXVxMH2kwd}&XgobM4~kuASx|~!M+hSXKNk_Yegw4v;jMu~nUvvp zE$hijniH#|YSC4S#x<73jL@Ib%Ek!?0GWy)90*D1ZNDf{D?k0yr_kDgr}xF~s_m*h zj5nc5jgA1A0fGlnuOWpa4JjJ0JY{VJ@d7ynmHUJHChD7R7zdM~mS~5(6vo+$4#m9J zW5Y-yQB!OjpC@E(H*eDCD{pEPxZ$3F=HY8o0r2lY5??@O>-P#b}p2WwBb z;es7nS>XNh$GT%(2Yl&UchlU*tI#5bI?D&=EM*G}#wyS*y{n}yV+}fLdbbP8R%+># zkYgpp8zx`(8s|xzfa1U)%5%4G-^O^?;M*OG5D(AjkOx68I1MptnCl4G^lw4#0t;m( z)BUdi=0@TxCOXvSo3;~201JnSUxnBUN#kI1xMBOD^7Y-hXtulSl=d4@U3e;lh|x$6 zVbC)=TzzpklUPNq3k))h<$b_s9}o_@otkWz8KWO0=R0&nakEsw>z*4YI_w1tMG0l; zqN9XlqIIMySHc!D{D<8el?;x*J3&>CJ}i0hMos{Cs}b|2d}-(Jff3dKxa57};y5}L zjqf8KJxa0%Wx;8`^{RSln0KM-c7-Lhqe ze8HPHpx}mm=!{ElVz@ z;WmdLUCZu&Xe3gU&1qR|nJeXOC56gV`zmL zy)n9eA4YDCYPHQUys>~@@*JYPH!GRQqqdNNFmoIZwo>zeXM?q)BEyhbSew@)DN`Gn zL466(^>}z&fq|rQ5d$ zMHB!=%;hju;mJhAN$@^hnjgU@19R9AarScGxjMDrmTtG0)iHi2%9oSdD3fB~mgN z%SGB;coA2GU~J633N@xi6+af45jnrUdZ-&~t6_*yE7D|gf55?>EZeL=a4F1p5_;pf zK{qoNLM-RbnM{l!&*kD2J6pU}tw;L9UM6dGDsp!Vm**lVA(OkG_@eo<8O$ zol$--4-aZIKM7P47-#wW1B^R%SfuOM?`sHug(XAZ<{M=mPr3mNGA7h;XHt#HABg1j zT!kOJ{Vw5IXW18RA^{1_5(W)d%&(~Ri1c0`VaqW1gQXgszhSF^PDpT9Pz2qy$L%wO zd#gOPJs*qlcuD~pfz1JPuct-<057s1rroF+ zL||`(ObQOj$ecEgZyiU(30J&0^=7(bpPdxLy;@TK&OLjCHLUgv%J39GRE2H;KKfUT zd%6#xu@eU=VdBbzrcZN@9=v+CK^u*cdMGS+?c@2d329d<7>hQqlajc8izL&;#Pj33~N zMg+!Ca)NqG@2!Py(beo<-vni#;Q0s11BPtDfo;xSkQM#JStUr22c2dLsr?RUnwtOS_vY)h-2BUY zc@g(q9Ryg&v~-F7!pB+v&1C=8LAKaeAOp#y+Z_C4bWI%x`*zS(_=D%T`^>7 z%kvqhEk@Mx!v}a8@KLRrk;BY8+!{RTCc?i8m{rp7%snXJC=#`A3~ArZtP}zCu`_3k zx3=wVg^XFU` zUFTAHs(bIuS>M$E^D#3yr=1+w&BWe4v@MynQZI09`d(Xm=Re*y+Er@xu$8lcQNYu& z?ZQXu;Mmwp_4n}YUOp8cY^{GRa%VAe^ELJH5Mhh=UQd(^4YoR4{ZhKG%>&fuSE@mV zor&b%Ff-24DF?Erz_vEjNUd1S-u>5y+Z$L{ZZH!gZ;(lvuMHFFf3F%ZAh4-O^d?t1 z?+zHfo7hX0R!=q0m%e&+XY^Ir7SaFX@@!DuAs;C6;6D~e?5S)KI)L3QEJnr``Cc$q zEY1jh3U{1LFp3d**Q!qSU$+}5PTs(rv&%H1B=Gd0HV(PNEI5}g-8M8ru z)f`!i_jymOuU95W2PayI@|>;8Rag?mtTM}3wlhl3R$reBVD_diD!w`suM#KL{jVczgI!%?=NO_I_4D&qOs^TFuDz`h5qB- zQ4R?`IT;C3mJkBv%F?rZr;$e_ZmbjgHaYnh)t-)nf*VosO>2R0O1Q0UJ?<})S;ksA z*rIB$MbmoI2(Rz869F{w>hPPB`e;7BzC2s^<8tSV%8wUXW)!od!(MyCQ|o|RfdQ83DfslK?OtW zOP0H=K+BkT4!p1FJpzb&aj|Qq2%c_E6^=}>hu%HB&~*jKlDrQjft%Yu`H8J~N@KQy zvOX z*k`sM=CQ&@AX_bo6u0H{EN~k38!f)B2w4h%aUlbeURA#J?s8=w7qPO`{2XgWYrn(oegTH-8Th@`KH^7tRX-Y5$ouz@tNb($1oML6#X(Qm`UC?F#Q zAS!DR)}ilYg}f@_GI<{Wf~tnu`UhZ|M6D+foI=KyStCM}D80)2pj9EbO)j(59gkJs z2Pq)SNd>*V&Q`;6Yda<1lB7ldR5L6v5F^_G904U+XjI;#pQ@+YVUK48GmS8F2SgT; z(*_1YQ9x@z2}KERPm~9wz#j;Dk!$P#yu*tQsRsm8gZ>^3kqP7rHq!Pys>-uxqHi9Q;D2? zzd^>GVbj?vL2o4A;N;^y=!qcu{x70zFk_EKoohhBQAPwHhDm`S0}n7^Arg#I!Dl(M z+>R>aW-^>6x)-cQ9u08(Yhq~L;E<`ogjg?a6F>^V?;ryP6mBllDCgV3UN;L_L7#wt zko$JKFcQW~`n&k@LTmsxcHD_h6$I0mu}OCh$t*y{#|CzJ9m1uH&w(p|AB9}*>gSPH zM^i*!c|x_vb~m4(AXx7)=&V*zsRmjWFpkiHo`GR#YO3^H1+}*ui?TWH521!p_$#86 zkQ-ovTLdz#lh%T~L-K0?CIA7i)Jf^P#MP$3|lUc2ZGP$z>j$N$;l%GWPK)c+t#h6F4Jd# z!5m$gd4!~tmRa<}o!FWwtRy55Q5)sgPX%R^hg;(Ym`dO0Z#>n6xFn{gOhcmOx#AYF zs1Cpa@YE-t9)dOi!I!{FVrVyR)u}d^4`mw1>KB(ip#Ta{6Q`;WUlGwo>MA`#{n7c~ zKt}!cv!Nnp!y zt;9YCnuI)*$hH7vbzB2yg}4X~7~)GXa@5jVz_ORX6lSoQz+O#OiJ$)b->Znqzaw4A znLXIp(a|P&xrYY{$yya&0tAq*&aA1Uz5U!iV>(I$x$fa}W zTD=oO=!^35ca1Y{5BToGT64QdX?nb@H(vANXYm=Rf09fX%Cw1Uvd4pe_;;k8|4@KX z5dHTBYn(k&0q+`ph2*IHPw(XaER@1O{{M7==#$_FAx@5Hz?^4-GV0+Y zQ2P4%@V=;*vQX;LqopP)5a+7s){!(H5cO%^Rz%cDhRzrF$1btJh)qRy?AOym<_dI6oe(T3(f zn8vPC)2hygx{+EC`lL@a_Yt5kv=gFXL9lFq%%Fhy4+Rj2BP;t6(%a3Bpu>^Wz!#r~ z=i8O`&ZYMjp`@#rdW`J(PlOKbMH~=MI#i&L5i!aWy-lf#Eku9YT# zK$2UVjxUAm4``3tP9Xx9aG6Z9HXQn%SYLlqHqf>+C4NMs~#f!3;Z`u;{zvg1FO!vt&F zXL$AoC5|A!A%$qlR!h8rtj~d!nG|>Kp9`Uwndk-7>D2stM3t!58yQ~&ZVI^PKVRj4 zwGUko88`X?D8k!v34xdnm8uRYQIcH6+7b`!Qoc+0tn?fGxDMem5rr=xeeL{@*Emmh z=o|Y$Srws{S0>nYjqtu2t-D^l*hGp`APfNSM-;FE>R{w^f9S&@h&@!|l17U*;Ascu z|M{(B5GewwQmKRMUP7i{>sEsbH|m-8w%2i0kaFdzO3suaDg9HindEqF?a~j8Ggc4; z`)>p0ZohKzEj|QKM#&i6DQ6Ie1BFTOUY$F-YEdS&j`Z;%VW+qOYTa~oEy%?#Jqp$^ zeA~{l72V8MY@2+zLD1gislbN>DG+i!B?uIC?jdeNOeXx$pOw_7phtP{*wii%U^atc zhCK&oYG*PC+9%R$7i6Hsgx!rBq3#0DjEZY;%>0iZs3<5C&i6Tb7GTYr-0lN!cpt>2 zY`Fxgi5EyRB)LLd4uCn+eiM}X8(#mModpZS1>jSFeGgzE6u#8zFjoPr<1#kFD(u_O zyb=kxH^2Ko04m(`RR910 literal 0 HcmV?d00001 diff --git a/dev/examples/examples_associations/52cc6dc0.png b/dev/examples/examples_associations/52cc6dc0.png deleted file mode 100644 index 566eda9a1faea70093d10e7aba4c2476e34d4d5c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 168848 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

{j4}g7i%tm?5%Oy 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�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

1;W`sU~5p^|qgDJem} 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

g({EFK2wg!qSpIqaDsFHeWn! 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 literal 0 HcmV?d00001 diff --git a/dev/examples/examples_associations/66955cd3.png b/dev/examples/examples_associations/66955cd3.png deleted file mode 100644 index 327f854bde93f9f9717ffa9ed80cf16dc63da09c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 120420 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 z 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 diff --git a/dev/examples/examples_associations/9daf09b7.png b/dev/examples/examples_associations/9daf09b7.png deleted file mode 100644 index bff17671643fe5a5a2e372f67858cfb4d0632636..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 166857 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 D0LJ{M diff --git a/dev/examples/examples_associations/a2c07a5d.png b/dev/examples/examples_associations/a2c07a5d.png new file mode 100644 index 0000000000000000000000000000000000000000..9207e4a9d9b5142c4431d44774698849587cc5ee GIT binary patch literal 119570 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

-aini+Vs`t4iemuem-a&ml-Ztw-Jm!@zm*w(I& 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

@}c>HKgR(MoHIy>+6 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 U7^7i)5ATOilvP1y${4-)FA36(+5i9m diff --git a/dev/examples/examples_associations/f8a5d486.png b/dev/examples/examples_associations/f8a5d486.png new file mode 100644 index 0000000000000000000000000000000000000000..069e5dc88c3cf9fb62f3c5c759b2fdc991b41314 GIT binary patch literal 166606 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୆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 -Associations · Associations.jl

Examples of association measure estimation

HellingerDistance

From precomputed probabilities

using Associations
+Associations · Associations.jl

Examples of association measure estimation

HellingerDistance

From precomputed probabilities

using Associations
 # From pre-computed PMFs
 p1 = Probabilities([0.1, 0.5, 0.2, 0.2])
 p2 = Probabilities([0.3, 0.3, 0.2, 0.2])
@@ -139,7 +139,7 @@
 end
 
 est = JointProbabilities(MIShannon(), UniqueElements())
-association(est, preferences, biased_foods), association(est, preferences, random_foods)
(0.8960041282761537, 0.009021573708881764)

Dedicated GaussianMI estimator

using Associations
+association(est, preferences, biased_foods), association(est, preferences, random_foods)
(0.9121980267193728, 0.0064741995942783435)

Dedicated GaussianMI estimator

using Associations
 using Distributions
 using Statistics
 
@@ -147,19 +147,19 @@
 using Associations
 x = randn(1000)
 y = rand(1000) .+ x
-association(GaussianMI(MIShannon()), x, y) # defaults to `MIShannon()`
1.8752147792356844

Dedicated KraskovStögbauerGrassberger1 estimator

using Associations
+association(GaussianMI(MIShannon()), x, y) # defaults to `MIShannon()`
1.887751263190827

Dedicated KraskovStögbauerGrassberger1 estimator

using Associations
 x, y = rand(1000), rand(1000)
-association(KSG1(MIShannon(); k = 5), x, y)
-0.010107922919329665

Dedicated KraskovStögbauerGrassberger2 estimator

using Associations
+association(KSG1(MIShannon(); k = 5), x, y)
-0.05082276290349422

Dedicated KraskovStögbauerGrassberger2 estimator

using Associations
 x, y = rand(1000), rand(1000)
-association(KSG2(MIShannon(); k = 5), x, y)
0.00031500265989919273

Dedicated GaoKannanOhViswanath estimator

using Associations
+association(KSG2(MIShannon(); k = 5), x, y)
-0.025405473540939843

Dedicated GaoKannanOhViswanath estimator

using Associations
 x, y = rand(1000), rand(1000)
-association(GaoKannanOhViswanath(MIShannon(); k = 10), x, y)
-0.028078556992144538

EntropyDecomposition + Kraskov

We can compute MIShannon by naively applying a DifferentialInfoEstimator. Note that this doesn't apply any bias correction.

using Associations
+association(GaoKannanOhViswanath(MIShannon(); k = 10), x, y)
0.00459872266730303

EntropyDecomposition + Kraskov

We can compute MIShannon by naively applying a DifferentialInfoEstimator. Note that this doesn't apply any bias correction.

using Associations
 x, y = rand(1000), rand(1000)
-association(EntropyDecomposition(MIShannon(), Kraskov(k = 3)), x, y)
-0.057489812127480666

EntropyDecomposition + BubbleSortSwaps

We can also compute MIShannon by naively applying a DiscreteInfoEstimator. Note that this doesn't apply any bias correction.

using Associations
+association(EntropyDecomposition(MIShannon(), Kraskov(k = 3)), x, y)
-0.09251187526588317

EntropyDecomposition + BubbleSortSwaps

We can also compute MIShannon by naively applying a DiscreteInfoEstimator. Note that this doesn't apply any bias correction.

using Associations
 x, y = rand(1000), rand(1000)
 disc = CodifyVariables(BubbleSortSwaps(m=5))
 hest = PlugIn(Shannon())
-association(EntropyDecomposition(MIShannon(), hest, disc), x, y)
0.09069541584395502

EntropyDecomposition + Jackknife + ValueBinning

Shannon mutual information can be written as a sum of marginal entropy terms. Here, we use CodifyVariables with ValueBinning bin the data and compute discrete Shannon mutual information.

using Associations
+association(EntropyDecomposition(MIShannon(), hest, disc), x, y)
0.07843115924913757

EntropyDecomposition + Jackknife + ValueBinning

Shannon mutual information can be written as a sum of marginal entropy terms. Here, we use CodifyVariables with ValueBinning bin the data and compute discrete Shannon mutual information.

using Associations
 using Random; rng = MersenneTwister(1234)
 x = rand(rng, 50)
 y = rand(rng, 50)
@@ -204,7 +204,7 @@
 scatterlines!(ax, ks ./ N, mean(mis_ksg2, dims = 1) |> vec, label = "KSG2")
 hlines!(ax, [mitrue], color = :black, linewidth = 3, label = "I (true)")
 axislegend()
-fig
Example block output

Estimator comparison for MIShannon

Most estimators suffer from significant bias when applied to discrete, finite data. One possible resolution is to add a small amount of noise to discrete variables, so that the data becomes continuous in practice.

But instead of adding noise to your data, you can also consider using an estimator that is specifically designed to deal with continuous-discrete mixture data. One example is the GaoKannanOhViswanath estimator. Below, we compare its performance to KraskovStögbauerGrassberger1 on uniformly distributed discrete multivariate data. The true mutual information is zero. While the "naive" KraskovStögbauerGrassberger1 estimator diverges from the true value for these data, the GaoKannanOhViswanath converges to the true value.

using Associations
+fig
Example block output

Estimator comparison for MIShannon

Most estimators suffer from significant bias when applied to discrete, finite data. One possible resolution is to add a small amount of noise to discrete variables, so that the data becomes continuous in practice.

But instead of adding noise to your data, you can also consider using an estimator that is specifically designed to deal with continuous-discrete mixture data. One example is the GaoKannanOhViswanath estimator. Below, we compare its performance to KraskovStögbauerGrassberger1 on uniformly distributed discrete multivariate data. The true mutual information is zero. While the "naive" KraskovStögbauerGrassberger1 estimator diverges from the true value for these data, the GaoKannanOhViswanath converges to the true value.

using Associations
 using Statistics
 using StateSpaceSets: StateSpaceSet
 using Statistics: mean
@@ -274,7 +274,7 @@
     label = "GaoKannanOhViswanath (continuous)", color = :red,
     linestyle = :dot, marker = '●')
 axislegend(position = :rb)
-fig
Example block output

Estimation using DifferentialInfoEstimators: a comparison

Let's compare the performance of a subset of the implemented mutual information estimators. We'll use example data from Lord et al., where the analytical mutual information is known.

using Associations
+fig
Example block output

Estimation using DifferentialInfoEstimators: a comparison

Let's compare the performance of a subset of the implemented mutual information estimators. We'll use example data from Lord et al., where the analytical mutual information is known.

using Associations
 using LinearAlgebra: det
 using StateSpaceSets: StateSpaceSet
 using Distributions: MvNormal
@@ -430,7 +430,7 @@
 fig = plot_results(family1, ifamily1;
     k_lord = k_lord, k = k, nreps = 10, n = 800,
     estimators = estimators,
-    base = base)
Example block output

Example system: family 2

function family2(α, n::Int)
+    base = base)
Example block output

Example system: family 2

function family2(α, n::Int)
     Σ = [1 α; α 1]
     N2 = MvNormal(zeros(2), Σ)
     D2 = StateSpaceSet([rand(N2) for i = 1:n])
@@ -462,7 +462,7 @@
     end
     axislegend(position = :lt)
     return f
-end
Example block output

Example system: family 3

In this system, we draw samples from a 4D Gaussian distribution distributed as specified in the ifamily3 function below. We let $X$ be the two first variables, and $Y$ be the two last variables.

function ifamily3(α; base = ℯ)
+end
Example block output

Example system: family 3

In this system, we draw samples from a 4D Gaussian distribution distributed as specified in the ifamily3 function below. We let $X$ be the two first variables, and $Y$ be the two last variables.

function ifamily3(α; base = ℯ)
     Σ = [7 -5 -1 -3; -5 5 -1 3; -1 -1 3 -1; -3 3 -1 2+α]
     Σx = Σ[1:2, 1:2]; Σy = Σ[3:4, 3:4]
     mi = 0.5*log(det(Σx) * det(Σy) / det(Σ))
@@ -480,7 +480,7 @@
 
 fig = plot_results(family3, ifamily3;
     k_lord = k_lord, k = k, nreps = 5, n = 800,
-    estimators = estimators, base = base)
Example block output

We see that the Lord estimator, which estimates local volume elements using a singular-value decomposition (SVD) of local neighborhoods, outperforms the other estimators by a large margin.

MIRenyiJizba

JointProbabilities + UniqueElements

MIRenyiJizba can be estimated for categorical data using JointProbabilities estimator with the UniqueElements outcome space.

using Associations
+    estimators = estimators, base = base)
Example block output

We see that the Lord estimator, which estimates local volume elements using a singular-value decomposition (SVD) of local neighborhoods, outperforms the other estimators by a large margin.

MIRenyiJizba

JointProbabilities + UniqueElements

MIRenyiJizba can be estimated for categorical data using JointProbabilities estimator with the UniqueElements outcome space.

using Associations
 using Random; rng = Xoshiro(1234)
 x = rand(rng, ["a", "b", "c"], 200);
 y = rand(rng, ["hello", "yoyo", "heyhey"], 200);
@@ -556,7 +556,7 @@
 x = randn(1000)
 y = randn(1000) .+ x
 z = randn(1000) .+ y
-association(GaussianCMI(), x, z, y) # defaults to `CMIShannon()`
0.8340784989499823

CMIShannon with FPVP

using Associations
+association(GaussianCMI(), x, z, y) # defaults to `CMIShannon()`
0.7769194995209883

CMIShannon with FPVP

using Associations
 using Distributions
 using Statistics
 
@@ -570,7 +570,7 @@
 # We expect zero (in practice: very low) CMI when computing I(X; Z | Y), because
 # the link between X and Z is exclusively through Y, so when observing Y,
 # X and Z should appear independent.
-association(FPVP(k = 5), x, z, y) # defaults to `CMIShannon()`
-0.12244142283149556

CMIShannon with MesnerShalizi

using Associations
+association(FPVP(k = 5), x, z, y) # defaults to `CMIShannon()`
-0.1454225385627872

CMIShannon with MesnerShalizi

using Associations
 using Distributions
 using Statistics
 using Random; rng = Xoshiro(1234)
@@ -638,7 +638,17 @@
 # the link between X and Z is exclusively through Y, so when observing Y,
 # X and Z should appear independent.
 est = MIDecomposition(CMIShannon(base = 2), KSG1(k = 10))
-association(est, x, z, y)
-0.4346600995528286

EntropyDecomposition + Kraskov

Any DifferentialInfoEstimator can also be used to compute conditional mutual information using a sum of entropies. For that, we usethe EntropyDecomposition estimator. No bias correction is applied for EntropyDecomposition either.

using Associations
+association(est, x, z, y)
-0.4574363552777936

ShortExpansionConditionalMutualInformation

JointProbabilities with CodifyVariables and ValueBinning

using Associations
+using Test
+using Random; rng = Xoshiro(1234)
+n = 20
+x = rand(rng, n)
+y = randn(rng, n) .+ x .^ 2
+z = randn(rng, n) .* y
+
+# An estimator for estimating the SECMI measure
+est = JointProbabilities(SECMI(base = 2), CodifyVariables(ValueBinning(3)))
+association(est, x, z, y)
0.2398365741064942

EntropyDecomposition + Kraskov

Any DifferentialInfoEstimator can also be used to compute conditional mutual information using a sum of entropies. For that, we usethe EntropyDecomposition estimator. No bias correction is applied for EntropyDecomposition either.

using Associations
 using Distributions
 using Random; rng = Xoshiro(1234)
 n = 500
@@ -723,7 +733,7 @@
 precise = true # precise bin edges
 discretization = CodifyVariables(TransferOperator(RectangularBinning(2, precise))) #
 est_disc_to = EntropyDecomposition(TEShannon(), PlugIn(Shannon()), discretization);
-association(est_disc_to, x, y), association(est_disc_to, y, x)
(0.25290542068814803, 0.10426214204847328)

The Shannon-type transfer entropy from x to y is stronger than from y to x, which is what we expect if x drives y.

association(est_disc_to, x, z), association(est_disc_to, x, z, y)
(0.05336193821009649, 0.023756514196860756)

The Shannon-type transfer entropy from x to z is stronger than the transfer entropy from x to z given y. This is expected, because x drives z through y, so "conditioning away" the effect of y should decrease the estimated information transfer.

CMIDecomposition

using Associations
+association(est_disc_to, x, y), association(est_disc_to, y, x)
(0.25290542131587457, 0.10426214246627041)

The Shannon-type transfer entropy from x to y is stronger than from y to x, which is what we expect if x drives y.

association(est_disc_to, x, z), association(est_disc_to, x, z, y)
(0.053361938183095425, 0.02375651419735947)

The Shannon-type transfer entropy from x to z is stronger than the transfer entropy from x to z given y. This is expected, because x drives z through y, so "conditioning away" the effect of y should decrease the estimated information transfer.

CMIDecomposition

using Associations
 using Random; rng = MersenneTwister(1234)
 x = rand(rng, 1000)
 y = rand(rng, 1000) .+ x
@@ -800,7 +810,7 @@
 end
 axislegend(ax_xy, position = :rb)
 
-fig
Example block output

Reproducing Schreiber (2000)

Let's try to reproduce the results from Schreiber's original paper (Schreiber, 2000) where he introduced the transfer entropy. We'll here use the JointProbabilities estimator, discretizing per column of the input data using the CodifyVariables discretization scheme with the ValueBinning outcome space.

using Associations
+fig
Example block output

Reproducing Schreiber (2000)

Let's try to reproduce the results from Schreiber's original paper (Schreiber, 2000) where he introduced the transfer entropy. We'll here use the JointProbabilities estimator, discretizing per column of the input data using the CodifyVariables discretization scheme with the ValueBinning outcome space.

using Associations
 using DynamicalSystemsBase
 using CairoMakie
 using Statistics
@@ -1059,4 +1069,4 @@
  0.26839516685160714
  1.0709803535460094
  0.8668408207007512

For the variables above, where x → y → z, we expect stronger assocation between x and y than between x and z. We also expect the strength of the association between x and z to drop when conditioning on y, because y is the variable that connects x and z.

m = AzadkiaChatterjeeCoefficient(theiler = 0) # only exclude self-neighbors
-association(m, x, y), association(m, x, z), association(m, x, z, y)
(0.3062018195708035, 0.06951871657754011, 0.010810810810810811)
+association(m, x, y), association(m, x, z), association(m, x, z, y)
(0.3062018195708035, 0.06951871657754011, 0.010810810810810811)
diff --git a/dev/examples/examples_independence/index.html b/dev/examples/examples_independence/index.html index 329ca691..4ee18d02 100644 --- a/dev/examples/examples_independence/index.html +++ b/dev/examples/examples_independence/index.html @@ -1,5 +1,5 @@ -Independence testing · Associations.jl

Examples of independence testing

CorrTest

using Associations
+Independence testing · Associations.jl

Examples of independence testing

CorrTest

using Associations
 using Random; rng = Xoshiro(1234)
 
 # Some normally distributed data
@@ -552,4 +552,63 @@
 α = 0.05:  ✖ Independence cannot be rejected
 α = 0.01:  ✖ Independence cannot be rejected
 α = 0.001: ✖ Independence cannot be rejected
-

The test verifies our expectation.

+

The test verifies our expectation.

SECMITest

JointProbabilities estimation on numeric data

using Associations
+using Test
+using Random; rng = Xoshiro(1234)
+n = 25
+x = rand(rng, n)
+y = randn(rng, n) .+ x .^ 2
+z = randn(rng, n) .* y
+
+# An estimator for estimating the SECMI measure
+est = JointProbabilities(SECMI(base = 2), CodifyVariables(ValueBinning(3)))
+test = SECMITest(est; nshuffles = 19)
SECMITest{JointProbabilities{ShortExpansionConditionalMutualInformation{Int64}, CodifyVariables{1, ValueBinning{RectangularBinning{Int64}}}, RelativeAmount}, RandomShuffle, Int64, Random.TaskLocalRNG}(JointProbabilities{ShortExpansionConditionalMutualInformation{Int64}, CodifyVariables{1, ValueBinning{RectangularBinning{Int64}}}, RelativeAmount}(ShortExpansionConditionalMutualInformation(; base = 2), CodifyVariables{1, ValueBinning{RectangularBinning{Int64}}}((ValueBinning(binning = RectangularBinning{Int64}(3, false)),)), RelativeAmount()), RandomShuffle(), 19, Random.TaskLocalRNG())

When analyzing $SECMI(x, y | z)$, the expectation is to reject the null hypothesis (independence), since x and y are connected, regardless of the effect of z.

independence(test, x, y, z)
`SECMITEST` independence test
+---------------------------------------------------------------------
+H₀: "The first two variables are independent, given the 3rd variable"
+Hₐ: "The first two variables are dependent, given the 3rd variable"
+---------------------------------------------------------------------
+Estimated parameters:
+μ̂ = 0.25805644718504456, σ̂ = 0.0073792890873878095
+D𝒩 = 0.47035974938829067, D𝒳² = 0.680538137544112
+
+p-value:   0.0
+α = 0.05:  ✓ Evidence favors dependence
+α = 0.01:  ✓ Evidence favors dependence
+α = 0.001: ✓ Evidence favors dependence
+

We can detect this association, even for n = 25! When analyzing $SECMI(x, z | y)$, we expect that we can't reject the null (indepdendence), precisely since x and z are not connected when "conditioning away" y.

independence(test, x, z, y)
`SECMITEST` independence test
+---------------------------------------------------------------------
+H₀: "The first two variables are independent, given the 3rd variable"
+Hₐ: "The first two variables are dependent, given the 3rd variable"
+---------------------------------------------------------------------
+Estimated parameters:
+μ̂ = 0.31004273999202697, σ̂ = 0.013770904101472135
+D𝒩 = 0.469898049687456, D𝒳² = 0.646392964764863
+
+p-value:   0.9999999984107697
+α = 0.05:  ✖ Independence cannot be rejected
+α = 0.01:  ✖ Independence cannot be rejected
+α = 0.001: ✖ Independence cannot be rejected
+

JointProbabilities estimation on categorical data

Note that this also works for categorical variables. Just use UniqueElements to discretize!

using Associations
+using Test
+using Random; rng = Xoshiro(1234)
+n = 24
+x = rand(rng, ["vegetables", "candy"], n)
+y = [xᵢ == "candy" && rand(rng) > 0.3 ? "yummy" : "yuck" for xᵢ in x]
+z = [yᵢ == "yummy" && rand(rng) > 0.6 ? "grown-up" : "child" for yᵢ in y]
+d = CodifyVariables(UniqueElements())
+est = JointProbabilities(SECMI(base = 2), d)
+
+independence(SECMITest(est; nshuffles = 19), x, z, y)
`SECMITEST` independence test
+---------------------------------------------------------------------
+H₀: "The first two variables are independent, given the 3rd variable"
+Hₐ: "The first two variables are dependent, given the 3rd variable"
+---------------------------------------------------------------------
+Estimated parameters:
+μ̂ = 0.0310780574994074, σ̂ = 0.0009485277824744301
+D𝒩 = 0.5789473684210527, D𝒳² = 0.7508967119517067
+
+p-value:   1.0
+α = 0.05:  ✖ Independence cannot be rejected
+α = 0.01:  ✖ Independence cannot be rejected
+α = 0.001: ✖ Independence cannot be rejected
+
diff --git a/dev/examples/examples_infer_graphs/index.html b/dev/examples/examples_infer_graphs/index.html index 7a566e20..4dc9c508 100644 --- a/dev/examples/examples_infer_graphs/index.html +++ b/dev/examples/examples_infer_graphs/index.html @@ -108,4 +108,4 @@ cond_test = LocalPermutationTest(est_cond; rng, nshuffles = 50) alg = PC(pairwise_test, cond_test; α = 0.05) est_cpdag_nonparametric = infer_graph(alg, X; verbose = false) -plotgraph(est_cpdag_nonparametric)

We get the same basic structure of the graph, but which directional associations are correctly ruled out varies. In general, using different types of association measures with different independence tests, applied to general non-gaussian data, will not give the same results as the correlation-based tests.

+plotgraph(est_cpdag_nonparametric)

We get the same basic structure of the graph, but which directional associations are correctly ruled out varies. In general, using different types of association measures with different independence tests, applied to general non-gaussian data, will not give the same results as the correlation-based tests.

diff --git a/dev/independence/index.html b/dev/independence/index.html index bec8b942..e743bcd5 100644 --- a/dev/independence/index.html +++ b/dev/independence/index.html @@ -1,18 +1,20 @@ -Independence · Associations.jl

Independence testing

For practical applications, it is often useful to determine whether variables are independent, possible conditioned upon another set of variables. One way of doing so is to utilize an association measure, and perform some sort of randomization-based independence testing.

For example, to test the dependence between time series, time series surrogates testing is used. Many other frameworks for independence exist too. Here, we've collected some independence testing frameworks, and made sure that they are compatible with as many of the implemented association measures as possible.

Independence testing API

The independence test API is defined by

SurrogateAssociationTest

Associations.SurrogateAssociationTestType
SurrogateAssociationTest <: IndependenceTest
+Independence · Associations.jl

Independence testing

For practical applications, it is often useful to determine whether variables are independent, possible conditioned upon another set of variables. One way of doing so is to utilize an association measure, and perform some sort of randomization-based independence testing.

For example, to test the dependence between time series, time series surrogates testing is used. Many other frameworks for independence exist too. Here, we've collected some independence testing frameworks, and made sure that they are compatible with as many of the implemented association measures as possible.

Independence testing API

The independence test API is defined by

Associations.independenceFunction
independence(test::IndependenceTest, x, y, [z]) → summary

Perform the given IndependenceTest test on data x, y and z. If only x and y are given, test must provide a bivariate association measure. If z is given too, then test must provide a conditional association measure.

Returns a test summary, whose type depends on test.

See IndependenceTest for a list of compatible tests.

source

SurrogateAssociationTest

Associations.SurrogateAssociationTestType
SurrogateAssociationTest <: IndependenceTest
 SurrogateAssociationTest(est_or_measure;
     nshuffles::Int = 100,
     surrogate = RandomShuffle(),
     rng = Random.default_rng(),
     show_progress = false,
-)

A surrogate-data based generic (conditional) independence test for assessing whether the association between variables X and Y are independent, potentially conditioned on a third variable Z.

Compatible estimators and measures

  • Compatible with AssociationMeasures that measure some sort of pairwise or conditional association.
Note

You must yourself determine whether using a particular measure is meaningful, and what it means.

Note

If used with a TransferEntropy measure such as TEShannon, then the source variable is always shuffled, and the target and conditional variable are left unshuffled.

Usage

Description

This is a generic one-sided hypothesis test that checks whether x and y are independent (given z, if provided) based on resampling from a null distribution assumed to represent independence between the variables. The null distribution is generated by repeatedly shuffling the input data in some way that is intended to break any dependence between the input variables.

The test first estimates the desired statistic using est_or_measure on the input data. Then, the first input variable is shuffled nshuffled times according to the given surrogate method (each type of surrogate represents a distinct null hypothesis). For each shuffle, est_or_measure is recomputed and the results are stored.

Examples

source
Associations.SurrogateAssociationTestResultType
SurrogateAssociationTestResult(m, m_surr, pvalue)

Holds the result of a SurrogateAssociationTest. m is the measure computed on the original data. m_surr is a vector of the measure computed on permuted data, where m_surr[i] is the measure compute on the i-th permutation. pvalue is the one-sided p-value for the test.

source

LocalPermutationTest

Associations.LocalPermutationTestType
LocalPermutationTest <: IndependenceTest
+)

A surrogate-data based generic (conditional) independence test for assessing whether the association between variables X and Y are independent, potentially conditioned on a third variable Z.

Compatible estimators and measures

  • Compatible with AssociationMeasures that measure some sort of pairwise or conditional association.
Note

You must yourself determine whether using a particular measure is meaningful, and what it means.

Note

If used with a TransferEntropy measure such as TEShannon, then the source variable is always shuffled, and the target and conditional variable are left unshuffled.

Usage

Description

This is a generic one-sided hypothesis test that checks whether x and y are independent (given z, if provided) based on resampling from a null distribution assumed to represent independence between the variables. The null distribution is generated by repeatedly shuffling the input data in some way that is intended to break any dependence between the input variables.

The test first estimates the desired statistic using est_or_measure on the input data. Then, the first input variable is shuffled nshuffled times according to the given surrogate method (each type of surrogate represents a distinct null hypothesis). For each shuffle, est_or_measure is recomputed and the results are stored.

Examples

source
Associations.SurrogateAssociationTestResultType
SurrogateAssociationTestResult(m, m_surr, pvalue)

Holds the result of a SurrogateAssociationTest. m is the measure computed on the original data. m_surr is a vector of the measure computed on permuted data, where m_surr[i] is the measure compute on the i-th permutation. pvalue is the one-sided p-value for the test.

source

LocalPermutationTest

Associations.LocalPermutationTestType
LocalPermutationTest <: IndependenceTest
 LocalPermutationTest(measure, [est];
     kperm::Int = 5,
     nshuffles::Int = 100,
     rng = Random.default_rng(),
     replace = true,
     w::Int = 0,
-    show_progress = false)

LocalPermutationTest is a generic conditional independence test (Runge, 09–11 Apr 2018) for assessing whether two variables X and Y are conditionally independendent given a third variable Z (all of which may be multivariate).

When used with independence, a LocalPermutationTestResult is returned.

Description

This is a generic one-sided hypothesis test that checks whether X and Y are independent (given Z, if provided) based on resampling from a null distribution assumed to represent independence between the variables. The null distribution is generated by repeatedly shuffling the input data in some way that is intended to break any dependence between x and y, but preserve dependencies between x and z.

The algorithm is as follows:

  1. Compute the original conditional independence statistic I(X; Y | Z).
  2. Allocate a scalar valued vector with space for nshuffles elements.
  3. For k ∈ [1, 2, …, nshuffles], repeat
    • For each zᵢ ∈ Y, let nᵢ be time indices of the kperm nearest neighbors of zᵢ, excluding the w nearest neighbors of zᵢ from the neighbor query (i.e w is the Theiler window).
    • Let xᵢ⋆ = X[j], where j is randomly sampled from nᵢ with replacement. This way, xᵢ is replaced with xⱼ only if zᵢ ≈ zⱼ (zᵢ and zⱼ are close). Repeat for i = 1, 2, …, n and obtain the shuffled X̂ = [x̂₁, x̂₂, …, x̂ₙ].
    • Compute the conditional independence statistic Iₖ(X̂; Y | Z).
    • Let Î[k] = Iₖ(X̂; Y | Z).
  4. Compute the p-value as count(Î[k] .<= I) / nshuffles).

In additional to the conditional variant from Runge (2018), we also provide a pairwise version, where the shuffling procedure is identical, except neighbors in Y are used instead of Z and we I(X; Y) and Iₖ(X̂; Y) instead of I(X; Y | Z) and Iₖ(X̂; Y | Z).

Compatible measures

MeasurePairwiseConditionalRequires estNote
PartialCorrelationNo
DistanceCorrelationNo
CMIShannonYes
TEShannonYesPairwise tests not possible with TransferEntropyEstimators, only lower-level estimators, e.g. FPVP, GaussianMI or Kraskov
PartialMutualInformationYes
AzadkiaChatterjeeCoefficientNo

The LocalPermutationTest is only defined for conditional independence testing. Exceptions are for measures like TEShannon, which use conditional measures under the hood even for their pairwise variants, and are therefore compatible with LocalPermutationTest.

The nearest-neighbor approach in Runge (2018) can be reproduced by using the CMIShannon measure with the FPVP estimator.

Examples

source
Associations.LocalPermutationTestResultType
LocalPermutationTestResult(m, m_surr, pvalue)

Holds the result of a LocalPermutationTest. m is the measure computed on the original data. m_surr is a vector of the measure computed on permuted data, where m_surr[i] is the measure compute on the i-th permutation. pvalue is the one-sided p-value for the test.

source

JointDistanceDistributionTest

Associations.JointDistanceDistributionTestType
JointDistanceDistributionTest <: IndependenceTest
-JointDistanceDistributionTest(measure::JointDistanceDistribution; rng = Random.default_rng())

An independence test for two variables based on the JointDistanceDistribution (Amigó and Hirata, 2018).

When used with independence, a JDDTestResult is returned.

Description

The joint distance distribution (labelled Δ in their paper) is used by Amigó & Hirata (2018) to detect directional couplings of the form $X \to Y$ or $Y \to X$. JointDistanceDistributionTest formulates their method as an independence test.

Formally, we test the hypothesis $H_0$ (the variables are independent) against $H_1$ (there is directional coupling between the variables). To do so, we use a right-sided/upper-tailed t-test to check mean of Δ is skewed towards positive value, i.e.

  • $H_0 := \mu(\Delta) = 0$
  • $H_1 := \mu(\Delta) > 0$.

When used with independence, a JDDTestResult is returned, which contains the joint distance distribution and a p-value. If you only need Δ, use association with a JointDistanceDistribution instance directly.

Examples

  • Example 1. Detecting (in)dependence in bidirectionally coupled logistic maps.
source

CorrTest

Associations.CorrTestType
CorrTest <: IndependenceTest
+    show_progress = false)

LocalPermutationTest is a generic conditional independence test (Runge, 09–11 Apr 2018) for assessing whether two variables X and Y are conditionally independendent given a third variable Z (all of which may be multivariate).

When used with independence, a LocalPermutationTestResult is returned.

Description

This is a generic one-sided hypothesis test that checks whether X and Y are independent (given Z, if provided) based on resampling from a null distribution assumed to represent independence between the variables. The null distribution is generated by repeatedly shuffling the input data in some way that is intended to break any dependence between x and y, but preserve dependencies between x and z.

The algorithm is as follows:

  1. Compute the original conditional independence statistic I(X; Y | Z).
  2. Allocate a scalar valued vector with space for nshuffles elements.
  3. For k ∈ [1, 2, …, nshuffles], repeat
    • For each zᵢ ∈ Y, let nᵢ be time indices of the kperm nearest neighbors of zᵢ, excluding the w nearest neighbors of zᵢ from the neighbor query (i.e w is the Theiler window).
    • Let xᵢ⋆ = X[j], where j is randomly sampled from nᵢ with replacement. This way, xᵢ is replaced with xⱼ only if zᵢ ≈ zⱼ (zᵢ and zⱼ are close). Repeat for i = 1, 2, …, n and obtain the shuffled X̂ = [x̂₁, x̂₂, …, x̂ₙ].
    • Compute the conditional independence statistic Iₖ(X̂; Y | Z).
    • Let Î[k] = Iₖ(X̂; Y | Z).
  4. Compute the p-value as count(Î[k] .<= I) / nshuffles).

In additional to the conditional variant from Runge (2018), we also provide a pairwise version, where the shuffling procedure is identical, except neighbors in Y are used instead of Z and we I(X; Y) and Iₖ(X̂; Y) instead of I(X; Y | Z) and Iₖ(X̂; Y | Z).

Compatible measures

MeasurePairwiseConditionalRequires estNote
PartialCorrelationNo
DistanceCorrelationNo
CMIShannonYes
TEShannonYesPairwise tests not possible with TransferEntropyEstimators, only lower-level estimators, e.g. FPVP, GaussianMI or Kraskov
PartialMutualInformationYes
AzadkiaChatterjeeCoefficientNo

The LocalPermutationTest is only defined for conditional independence testing. Exceptions are for measures like TEShannon, which use conditional measures under the hood even for their pairwise variants, and are therefore compatible with LocalPermutationTest.

The nearest-neighbor approach in Runge (2018) can be reproduced by using the CMIShannon measure with the FPVP estimator.

Examples

source
Associations.LocalPermutationTestResultType
LocalPermutationTestResult(m, m_surr, pvalue)

Holds the result of a LocalPermutationTest. m is the measure computed on the original data. m_surr is a vector of the measure computed on permuted data, where m_surr[i] is the measure compute on the i-th permutation. pvalue is the one-sided p-value for the test.

source

JointDistanceDistributionTest

Associations.JointDistanceDistributionTestType
JointDistanceDistributionTest <: IndependenceTest
+JointDistanceDistributionTest(measure::JointDistanceDistribution; rng = Random.default_rng())

An independence test for two variables based on the JointDistanceDistribution (Amigó and Hirata, 2018).

When used with independence, a JDDTestResult is returned.

Description

The joint distance distribution (labelled Δ in their paper) is used by Amigó & Hirata (2018) to detect directional couplings of the form $X \to Y$ or $Y \to X$. JointDistanceDistributionTest formulates their method as an independence test.

Formally, we test the hypothesis $H_0$ (the variables are independent) against $H_1$ (there is directional coupling between the variables). To do so, we use a right-sided/upper-tailed t-test to check mean of Δ is skewed towards positive value, i.e.

  • $H_0 := \mu(\Delta) = 0$
  • $H_1 := \mu(\Delta) > 0$.

When used with independence, a JDDTestResult is returned, which contains the joint distance distribution and a p-value. If you only need Δ, use association with a JointDistanceDistribution instance directly.

Examples

  • Example 1. Detecting (in)dependence in bidirectionally coupled logistic maps.
source

CorrTest

Associations.CorrTestType
CorrTest <: IndependenceTest
 CorrTest()

An independence test based correlation (for two variables) and partial correlation (for three variables) (Levy and Narula, 1978); as described in Schmidt et al. (2018).

Uses PearsonCorrelation and PartialCorrelation internally.

Assumes that the input data are (multivariate) normally distributed. Then ρ(X, Y) = 0 implies X ⫫ Y and ρ(X, Y | 𝐙) = 0 implies X ⫫ Y | 𝐙.

Description

The null hypothesis is H₀ := ρ(X, Y | 𝐙) = 0. We use the approach in Levy & Narula (1978)(Levy and Narula, 1978) and compute the Z-transformation of the observed (partial) correlation coefficient $\hat{\rho}_{XY|\bf{Z}}$:

\[Z(\hat{\rho}_{XY|\bf{Z}}) = -\log\dfrac{1 + \hat{\rho}_{XY|\bf{Z}}}{1 - \hat{\rho}_{XY|\bf{Z}}}.\]

To test the null hypothesis against the alternative hypothesis H₁ := ρ(X, Y | 𝐙) > 0, calculate

\[\hat{Z} = \dfrac{1}{2}\dfrac{Z(\hat{\rho}_{XY|\bf{Z}}) - Z(0)}{\sqrt{1/(n - d - 3)}},\]

and compute the two-sided p-value (Schmidt et al., 2018)

\[p(X, Y | \bf{Z}) = 2(1 - \phi(\sqrt{n - d - 3}Z(\hat{\rho}_{XY|\bf{Z}}))),\]

where $d$ is the dimension of $\bf{Z}$ and $n$ is the number of samples. For the pairwise case, the procedure is identical, but set $\bf{Z} = \emptyset$.

Examples

  • Example 1. Pairwise and conditional tests for independence on coupled noise processes.
source
Associations.CorrTestResultType
CorrTestResult(pvalue, ρ, z)

A simple struct that holds the results of a CorrTest test: the (partial) correlation coefficient ρ, Fisher's z, and pvalue - the two-sided p-value for the test.

source
+\log\dfrac{1 + \hat{\rho}_{XY|\bf{Z}}}{1 - \hat{\rho}_{XY|\bf{Z}}}.\]

To test the null hypothesis against the alternative hypothesis H₁ := ρ(X, Y | 𝐙) > 0, calculate

\[\hat{Z} = \dfrac{1}{2}\dfrac{Z(\hat{\rho}_{XY|\bf{Z}}) - Z(0)}{\sqrt{1/(n - d - 3)}},\]

and compute the two-sided p-value (Schmidt et al., 2018)

\[p(X, Y | \bf{Z}) = 2(1 - \phi(\sqrt{n - d - 3}Z(\hat{\rho}_{XY|\bf{Z}}))),\]

where $d$ is the dimension of $\bf{Z}$ and $n$ is the number of samples. For the pairwise case, the procedure is identical, but set $\bf{Z} = \emptyset$.

Examples

  • Example 1. Pairwise and conditional tests for independence on coupled noise processes.
source
Associations.CorrTestResultType
CorrTestResult(pvalue, ρ, z)

A simple struct that holds the results of a CorrTest test: the (partial) correlation coefficient ρ, Fisher's z, and pvalue - the two-sided p-value for the test.

source

SECMITest

Associations.SECMITestType
SECMITest <: IndependenceTest
+SECMITest(est; nshuffles = 19, surrogate = RandomShuffle(), rng = Random.default_rng())

A test for conditional independence based on the ShortExpansionConditionalMutualInformation measure (Kubkowski et al., 2021).

The first argument est must be a InformationMeasureEstimator that provides the ShortExpansionConditionalMutualInformation instance. See examples below.

Examples

source
Associations.SECMITestResultType
SECMITestResult <: IndependenceTestResult
+SECMITestResult(secmi₀, secmiₖ, p, μ̂, σ̂, emp_cdf, D𝒩, D𝒳², nshuffles::Int)

A simple struct that holds the computed parameters of a SECMITest when called with independence, as described in (Kubkowski et al., 2021).

Parameters

  • p: The p-value for the test.
  • secmi₀: The value of the ShortExpansionConditionalMutualInformation measure estimated on the original data.
  • secmiₖ: An ensemble of values for the ShortExpansionConditionalMutualInformation measure estimated on triples SECMI(X̂, Y, Z), where indicates a shuffled version of the first variable X and length(secmiₖ) == nshuffles.
  • μ̂: The estimated mean of the secmiₖ.
  • σ̂: The estimated standard deviation of the secmiₖ.
  • emp_cdf: The empirical cumulative distribution function (CDF) of the secmiₖs.
  • D𝒩: The $D_{N(\hat{\mu}, \hat{\sigma})}$ statistic.
  • D𝒳²: The $D_{\chi^2}$ statistic.
source
diff --git a/dev/index.html b/dev/index.html index e44417d5..058cddfd 100644 --- a/dev/index.html +++ b/dev/index.html @@ -1,2 +1,2 @@ -Associations.jl · Associations.jl

Associations.jl

AssociationsModule

Associations

CI codecov DOI

Associations.jl is a package for quantifying associations, independence testing and causal inference.

All further information is provided in the documentation, which you can either find online or build locally by running the docs/make.jl file.

Key features

  • Association API: includes measures and their estimators for pairwise, conditional and other forms of association from conventional statistics, from dynamical systems theory, and from information theory: partial correlation, distance correlation, (conditional) mutual information, transfer entropy, convergent cross mapping and a lot more!
  • Independence testing API, which is automatically compatible with every association measure estimator implemented in the package.
  • Causal (network) inference API integrating the association measures and independence testing framework.

Addititional features

Extending on features from ComplexityMeasures.jl, we also offer

  • Discretization API for multiple (multivariate) input datasets.
  • Multivariate counting and probability estimation API.
  • Multivariate information measure API

Installation

To install the package, run import Pkg; Pkg.add("Associations").

Previously, this package was called CausalityTools.jl.

source

Latest news

Package rename

The package has been renamed from CausalityTools.jl to Associations.jl.

Associations.jl has been updated to v4!

This update includes a number of breaking changes, several of which are not backwards compatible. These are done to ensure compatibility with ComplexityMeasures.jl v3, which provides discretization functionality that we use here.

Important changes are:

  • Convenience methods have been removed completely. Use association instead.
  • Example systems have been removed.
  • The syntax for computing an association has changed. Estimators now always contain the definition it estimates. For example, association(MIShannon(), KSG1(), x, y) is now association(KSG1(MIShannon()), x, y).
  • SurrogateTest has been renamed to SurrogateAssociationTest.
  • See the CHANGELOG.md for a complete list of changes.

Getting started

The quickest way to get going with the package is to check out the examples in the left-hand menu.

Info

To make it easier to navigate the extensive documentation, all documentation strings are collapsed by default. Click the arrow icon in the top toolbar to expand/collapse the docstrings in a page.

Documentation content

Input data for Associations.jl

Input data for Associations.jl are given as:

  • Univariate timeseries, which are given as standard Julia Vectors.
  • Multivariate timeseries, StateSpaceSets, or state space sets, which are given as StateSpaceSets. Many methods convert timeseries inputs to StateSpaceSet for faster internal computations.
  • Categorical data can be used with JointProbabilities to compute various information theoretic measures and is represented using any iterable whose elements can be any arbitrarily complex data type (as long as it's hashable), for example Vector{String}, {Vector{Int}}, or Vector{Tuple{Int, String}}.
StateSpaceSets.StateSpaceSetType
StateSpaceSet{D, T, V} <: AbstractVector{V}

A dedicated interface for sets in a state space. It is an ordered container of equally-sized points of length D, with element type T, represented by a vector of type V. Typically V is SVector{D,T} or Vector{T} and the data are always stored internally as Vector{V}. SSSet is an alias for StateSpaceSet.

The underlying Vector{V} can be obtained by vec(ssset), although this is almost never necessary because StateSpaceSet subtypes AbstractVector and extends its interface. StateSpaceSet also supports almost all sensible vector operations like append!, push!, hcat, eachrow, among others. When iterated over, it iterates over its contained points.

Construction

Constructing a StateSpaceSet is done in three ways:

  1. By giving in each individual columns of the state space set as Vector{<:Real}: StateSpaceSet(x, y, z, ...).
  2. By giving in a matrix whose rows are the state space points: StateSpaceSet(m).
  3. By giving in directly a vector of vectors (state space points): StateSpaceSet(v_of_v).

All constructors allow for the keyword container which sets the type of V (the type of inner vectors). At the moment options are only SVector, MVector, or Vector, and by default SVector is used.

Description of indexing

When indexed with 1 index, StateSpaceSet behaves exactly like its encapsulated vector. i.e., a vector of vectors (state space points). When indexed with 2 indices it behaves like a matrix where each row is a point.

In the following let i, j be integers, typeof(X) <: AbstractStateSpaceSet and v1, v2 be <: AbstractVector{Int} (v1, v2 could also be ranges, and for performance benefits make v2 an SVector{Int}).

  • X[i] == X[i, :] gives the ith point (returns an SVector)
  • X[v1] == X[v1, :], returns a StateSpaceSet with the points in those indices.
  • X[:, j] gives the jth variable timeseries (or collection), as Vector
  • X[v1, v2], X[:, v2] returns a StateSpaceSet with the appropriate entries (first indices being "time"/point index, while second being variables)
  • X[i, j] value of the jth variable, at the ith timepoint

Use Matrix(ssset) or StateSpaceSet(matrix) to convert. It is assumed that each column of the matrix is one variable. If you have various timeseries vectors x, y, z, ... pass them like StateSpaceSet(x, y, z, ...). You can use columns(dataset) to obtain the reverse, i.e. all columns of the dataset in a tuple.

source

Maintainers and contributors

The Associations.jl software is maintained by Kristian Agasøster Haaga, who also curates and writes this documentation. Significant contributions to the API and documentation design has been made by George Datseris, which also co-authors ComplexityMeasures.jl, which we develop in tandem with this package.

A complete list of contributors to this repo are listed on the main Github page. Some important contributions are:

  • Norbert Genera contributed bug reports and investigations that led to subsequent improvements for the pairwise asymmetric inference algorithm and an improved cross mapping API.
  • David Diego's contributions were invaluable in the initial stages of development. His MATLAB code provided the basis for several transfer entropy methods and binning-related code.
  • George Datseris also ported KSG1 and KSG2 mutual information estimators to Neighborhood.jl.
  • Bjarte Hannisdal provided tutorials for mutual information.
  • Tor Einar Møller contributed to cross-mapping methods in initial stages of development.

Many individuals has contributed code to other packages in the JuliaDynamics ecosystem which we use here. Contributors are listed in the respective GitHub repos and webpages.

+Associations.jl · Associations.jl

Associations.jl

AssociationsModule

Associations

CI (main) codecov DOI

Associations.jl is a package for quantifying associations, independence testing and causal inference.

All further information is provided in the documentation, which you can either find online or build locally by running the docs/make.jl file.

Key features

  • Association API: includes measures and their estimators for pairwise, conditional and other forms of association from conventional statistics, from dynamical systems theory, and from information theory: partial correlation, distance correlation, (conditional) mutual information, transfer entropy, convergent cross mapping and a lot more!
  • Independence testing API, which is automatically compatible with every association measure estimator implemented in the package.
  • Causal (network) inference API integrating the association measures and independence testing framework.

Addititional features

Extending on features from ComplexityMeasures.jl, we also offer

  • Discretization API for multiple (multivariate) input datasets.
  • Multivariate counting and probability estimation API.
  • Multivariate information measure API

Installation

To install the package, run import Pkg; Pkg.add("Associations").

Previously, this package was called CausalityTools.jl.

source

Latest news

Package rename

The package has been renamed from CausalityTools.jl to Associations.jl.

Associations.jl has been updated to v4!

This update includes a number of breaking changes, several of which are not backwards compatible. These are done to ensure compatibility with ComplexityMeasures.jl v3, which provides discretization functionality that we use here.

Important changes are:

  • Convenience methods have been removed completely. Use association instead.
  • Example systems have been removed.
  • The syntax for computing an association has changed. Estimators now always contain the definition it estimates. For example, association(MIShannon(), KSG1(), x, y) is now association(KSG1(MIShannon()), x, y).
  • SurrogateTest has been renamed to SurrogateAssociationTest.
  • See the CHANGELOG.md for a complete list of changes.

Getting started

The quickest way to get going with the package is to check out the examples in the left-hand menu.

Info

To make it easier to navigate the extensive documentation, all documentation strings are collapsed by default. Click the arrow icon in the top toolbar to expand/collapse the docstrings in a page.

Documentation content

Input data for Associations.jl

Input data for Associations.jl are given as:

  • Univariate timeseries, which are given as standard Julia Vectors.
  • Multivariate timeseries, StateSpaceSets, or state space sets, which are given as StateSpaceSets. Many methods convert timeseries inputs to StateSpaceSet for faster internal computations.
  • Categorical data can be used with JointProbabilities to compute various information theoretic measures and is represented using any iterable whose elements can be any arbitrarily complex data type (as long as it's hashable), for example Vector{String}, {Vector{Int}}, or Vector{Tuple{Int, String}}.
StateSpaceSets.StateSpaceSetType
StateSpaceSet{D, T, V} <: AbstractVector{V}

A dedicated interface for sets in a state space. It is an ordered container of equally-sized points of length D, with element type T, represented by a vector of type V. Typically V is SVector{D,T} or Vector{T} and the data are always stored internally as Vector{V}. SSSet is an alias for StateSpaceSet.

The underlying Vector{V} can be obtained by vec(ssset), although this is almost never necessary because StateSpaceSet subtypes AbstractVector and extends its interface. StateSpaceSet also supports almost all sensible vector operations like append!, push!, hcat, eachrow, among others. When iterated over, it iterates over its contained points.

Construction

Constructing a StateSpaceSet is done in three ways:

  1. By giving in each individual columns of the state space set as Vector{<:Real}: StateSpaceSet(x, y, z, ...).
  2. By giving in a matrix whose rows are the state space points: StateSpaceSet(m).
  3. By giving in directly a vector of vectors (state space points): StateSpaceSet(v_of_v).

All constructors allow for the keyword container which sets the type of V (the type of inner vectors). At the moment options are only SVector, MVector, or Vector, and by default SVector is used.

Description of indexing

When indexed with 1 index, StateSpaceSet behaves exactly like its encapsulated vector. i.e., a vector of vectors (state space points). When indexed with 2 indices it behaves like a matrix where each row is a point.

In the following let i, j be integers, typeof(X) <: AbstractStateSpaceSet and v1, v2 be <: AbstractVector{Int} (v1, v2 could also be ranges, and for performance benefits make v2 an SVector{Int}).

  • X[i] == X[i, :] gives the ith point (returns an SVector)
  • X[v1] == X[v1, :], returns a StateSpaceSet with the points in those indices.
  • X[:, j] gives the jth variable timeseries (or collection), as Vector
  • X[v1, v2], X[:, v2] returns a StateSpaceSet with the appropriate entries (first indices being "time"/point index, while second being variables)
  • X[i, j] value of the jth variable, at the ith timepoint

Use Matrix(ssset) or StateSpaceSet(matrix) to convert. It is assumed that each column of the matrix is one variable. If you have various timeseries vectors x, y, z, ... pass them like StateSpaceSet(x, y, z, ...). You can use columns(dataset) to obtain the reverse, i.e. all columns of the dataset in a tuple.

source

Maintainers and contributors

The Associations.jl software is maintained by Kristian Agasøster Haaga, who also curates and writes this documentation. Significant contributions to the API and documentation design has been made by George Datseris, which also co-authors ComplexityMeasures.jl, which we develop in tandem with this package.

A complete list of contributors to this repo are listed on the main Github page. Some important contributions are:

  • Norbert Genera contributed bug reports and investigations that led to subsequent improvements for the pairwise asymmetric inference algorithm and an improved cross mapping API.
  • David Diego's contributions were invaluable in the initial stages of development. His MATLAB code provided the basis for several transfer entropy methods and binning-related code.
  • George Datseris also ported KSG1 and KSG2 mutual information estimators to Neighborhood.jl.
  • Bjarte Hannisdal provided tutorials for mutual information.
  • Tor Einar Møller contributed to cross-mapping methods in initial stages of development.

Many individuals has contributed code to other packages in the JuliaDynamics ecosystem which we use here. Contributors are listed in the respective GitHub repos and webpages.

diff --git a/dev/objects.inv b/dev/objects.inv index 54110276c1f01dafc1436990cea9b25648422a86..0dc282f5f1355e473a0e2cf4b4b26873e769643d 100644 GIT binary patch delta 4714 zcmV-w5|!^+VUmd#2by3rZd%a zG!O|(h$&L#C63+cYxM>CVm$zF00@!*NyqsUOCoRp0_XCb3lJLme!#VL)#mj@<0DL__Q zK!KxHNw%R|9OKn3-6Y2|kj>*WnO2iIf!+n(Fg=KlXIz|*&nklNA`hlX;$4>Vw_*#n zI(fwY9mTUPpZ%{VQRY#U9_AuOCu1#K-NW?7wXblFvxj6`fJ2knTc_@ zL9<$YNgGtX`iJuy5Ejx&3br^SUbNds3FS)TLyW@&IP(3T#2993%N;tR=m(^d zt!6ZfLZ3InLD6-w#bF3D!SK^VN@1^T=WtT@EZaEC#WsJ6)AKKTmnH zFXXMVTxzwy0~!uA%RpxEe06^VU8CJc;sFO+>rJ_HA+>@eXw_1+Q?@#&>L^OuXA*BXKO7uRM;gV zsys^%ol^I?1&h1YI%(8?CxB!7S`aJcrC#*JIi-I-jbSgi>VRbeeuv5XZV+uKwDK5O z>)m3Nkrbk+Ac{(&h!J%Jo#pPh(sG42QQuQlB6Vk!cNW2EZN1(Qz%Sv3#NZU9mNU%007MeE|pl~O?gpjy}0@1{k0A90Y8 zQyPYh)HDcBBw6`Y0N#t$XS`tT&a`YDsPKO_)Hqn3w-Icp_O^!A+P{5wMsq_83Thwo zWy(_GcLDzXRlkU%9TKR?2&T`-#{`=Dna4ht{*-|aRrwe~f7q3xKS>b|enj6Ly?k}_ zLjU^Dq@SzaVIHYkRStPS3kpuX;*};k@fwMrRrp+v@R3`6_@y#+Uz?L|u4iY~a1ej` zR0OWCih#p4j=>D*c;Rm${Z~fL1F|EbYBdM4f=p7}u|CiD9f?8`-bFz15r=8Cz@KqQ zC(@33;>@HMi*%928TGbwxLsEWHI2K{phhv^lUET)@Th`p7Y;x$T5<*NXeC%^!6s_f@;NM`GB@sv>h~EG zA6d{H4PYbEhk?#a%LZ#{Gi!f6(#@y{G_7;#Ml2i9Z|GnRLh7K62Eyu>BKCH1d1Sk& zXT+z>7xvNH7$1SWA}zK@cx zfa%X?>U`(3GR*xNtX_eAzs~_}^1b^VsJ9x|;nc-0uoZbR1X<_9umE^9(81A3F%*1) zZ-3Sg$N9O+6qXRY=!w`ID=dyM`16R*(b2A*?K&6ZCMdd<&{UOuUy9jjuI`62SA&oi zkBJS84b9i{QM)ovWdMJMtahFkWABb=Tr{)z&9yfx2>b#4ozM;RXCa)QUN|>(D;K~< zOekn-7aqQRX}KkOO0Xl07Tb>-F`!g7K>1J|L6GN-C$0K}2u~1LZ3`V#KJZYXsR*dT zQs)l$-m2_x8#$ZLTpX}yc)H!yIkz0ij!nAdRNAs``O~`4!sCB%t%n7 zadcnkPfk}mTCs41b%3*uO1NvB0A^#_x%RV9Ed1;f!DWl% zA&zC)PZQ`_JnYs{K)o^uQ%H-gkhPJivFK9om5<0QXsBt@3Yu2^Nvu*cioqqzH7`jZ zA)2MFA1ikPI_!T*oD7I|x0R076b(Y`%q4j>GR_WawaYbmRZm06EgG+IBl4#s0@${_9brcMYh#85c1I@@$%|jaCFve7CQG+f6Doo)Le2RqP z&_4WA`_lrAW@N8bNz7RS1_vW_L_tAP5uex^tlIWYw_tyrJEVnEg^*5!qzY=zja-yl z5f;jFd8Lpx8e*+_%%UN$gbi(S*K7Bdf`12Q8~*sN3|V;eFOC9R>1htbORNkA(o7Js zeyHe&K zIp0 zby*kJd0~Tfong_ht!&*g0VY!s%GQtC%GQs{1Q=t`jB%d36d8@}PL-7^1PCx89$ZP< z7!H3#u5~~~<~T}}hOVh0P7Sq^0-T72tQsJ34>psR7`IfrsMQTshq{VIN+T3nXo^Ha zL8>d2P&9G4bh)GyFE_enSh=GjzWXgXIaHBj2^6ohMjq5{dGyavzn0A#3bk>Bu+xeD zdfAa4>;5bD?(RZ*OP(SGUlCWm{OSy>KIebhh?Hv2%r;QvGi5odfH`9*WLh(v)9f?BY7y!;Q~7yS9T?&D2z|$vuBxLTyb?jZC*YEV1OWZ0JVQZ4 zyNa_L>wxR*#_@tE0iucS?4BATEt}SAy)yUZY3S+QU9F!XiwUW18w+Fz2SwOsv>|^6 z%OFuJVtCbt7+&=U2)asA@@1RzjF_@!RXk$4P(eOUL$#M9Nmo^@%0ole$BbA;bbMq; zq|wZa3X!3uCN(kz>S)QyYML0=@qL8?Byvkb&V>UMk1o(E9#|O|1QtsSN)q*vm6t!g zaF&YU9lCuA8FlNF$Bs}W%?~d7WdVP6w~9OyYO9%VRCUuGhpK~w)18Q_Y4#tAs@qPX zsGc{RxzyF4nZaybPj&IM#nig|E9avpalIQcqcRU~_LgPqCR-HQ{7aJZx z*^c|6+`qcU(3<6x?4f<|%c)5H;FmM~d@kr0;@=PtJkd=S;CKWN$g8E*@WzYXU69(&1x;wE zCwnkEJ~;i8hP1^zj-GBFNBYeY0y@*kXn}(!6)W>i)>MCw(4&8~Z)+=)B8Y~rw^_(9 z6&$IuDzJ5SQ5oOSQdKWiSy5!XV%>F*H5nD@==Cw6R&UDyYzbt?n^DoTv=Xf*DWQo_ zKUU1XK1DxjkU7C|!V1>RxK{^2ye)|R4p7MG#glzdnOdXPLpzzel4R^$b~xTJze^)a zeV5|u1&I}FjGlj$a;$D5Cg>_xoM?!5Adny!OlMZDurXK`Q^yeWK(}zSc8K47Vq&m!kmQmrY~b< z@>GgeEZrG`iCW@?qj8ZOKs8@wF(;*%;vQVS#Yqa(=(mHu9CF-L&Nps!XNbn=qr%bb|WdZH9?=HltEp_#~ zDE7xMeeQqijsQP1@j4(IKUoOXjMdA>U4pHZ_<+Pv9;p)oje-f zbpRYQKG`-RVpW8a4MQHyD04TTn2de!%cBMoN z7nm$fGk+394U0N~Lt&_2HRE5?ARzHI_M`i$GJ60fu#fL1$U=yf5)-U-O9Fi~h?0x$ zZJ>XTwXfb=8fy=s^p_h?1EWp?=;D*@Nxa$OVQ5N=nRCa-eA%=$JL3Q^b5p@fwbuM? zx57=p-;y$XnvAq&2-C#0*l4uOH7dTw1?s9%NBe`SZvvIBAj%#<0O=6z681Xi~=T5QSqOvp z)kB&yr54!*Ya`oQWNA(UfVo{=Qk&LeXWdx|1o0;<4|rp}BwhhnbV>YX$X$tbwiaI6 zn~#6V+xVMfv~5+Vy=ygEfiO%!GBQU~p)-8En(W&3iEK sZcTiq^gf)Mcd7~k%&kS^_?v~87ChOO73kZieatTEOU+pN|LwU`D7gp=3IG5A delta 4557 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 diff --git a/dev/references/index.html b/dev/references/index.html index fe3530b8..fb070532 100644 --- a/dev/references/index.html +++ b/dev/references/index.html @@ -1,2 +1,2 @@ -References · Associations.jl

References

+References · Associations.jl

References

diff --git a/dev/search_index.js b/dev/search_index.js index 6a5b6151..14e1faea 100644 --- a/dev/search_index.js +++ b/dev/search_index.js @@ -1,3 +1,3 @@ var documenterSearchIndex = {"docs": -[{"location":"references/#References","page":"References","title":"References","text":"","category":"section"},{"location":"references/","page":"References","title":"References","text":"Abe, S. and Rajagopal, A. K. (2001). Nonadditive conditional entropy and its significance for local realism. Physica A: Statistical Mechanics and its Applications 289, 157–164.\n\n\n\nAlizadeh, N. H. and Arghami, N. R. (2010). A new estimator of entropy. Journal of the Iranian Statistical Society (JIRSS).\n\n\n\nAmigó, J. M. and Hirata, Y. (2018). Detecting directional couplings from multivariate flows by the joint distance distribution. Chaos 28, 075302.\n\n\n\nAndrzejak, R. G.; Kraskov, A.; Stögbauer, H.; Mormann, F. and Kreuz, T. (2003). Bivariate surrogate techniques: necessity, strengths, and caveats. Physical review E 68, 066202.\n\n\n\nArnhold, J.; Grassberger, P.; Lehnertz, K. and Elger, C. E. (1999). A robust method for detecting interdependences: application to intracranially recorded EEG. Physica D: Nonlinear Phenomena 134, 419–430.\n\n\n\nArora, A.; Meister, C. and Cotterell, R. (2022). Estimating the Entropy of Linguistic Distributions, arXiv, arXiv:2204.01469 [cs.CL].\n\n\n\nAzadkia, M. and Chatterjee, S. (2021). A simple measure of conditional dependence. The Annals of Statistics 49, 3070–3102.\n\n\n\nAzami, H. and Escudero, J. (2016). Amplitude-aware permutation entropy: Illustration in spike detection and signal segmentation. Computer Methods and Programs in Biomedicine 128, 40–51.\n\n\n\nBandt, C. and Pompe, B. (2002). Permutation Entropy: A Natural Complexity Measure for Time Series. Phys. Rev. Lett. 88, 174102.\n\n\n\nBerger, S.; Kravtsiv, A.; Schneider, G. and Jordan, D. (2019). Teaching Ordinal Patterns to a Computer: Efficient Encoding Algorithms Based on the Lehmer Code. Entropy 21.\n\n\n\nChao, A. and Shen, T.-J. (2003). Nonparametric estimation of Shannon's index of diversity when there are unseen species in sample. Environmental and Ecological Statistics 10, 429–443.\n\n\n\nCharzyńska, A. and Gambin, A. (2016). Improvement of the k-nn Entropy Estimator with Applications in Systems Biology. Entropy 18.\n\n\n\nChatterjee, S. (2021). A new coefficient of correlation. Journal of the American Statistical Association 116, 2009–2022.\n\n\n\nChicharro, D. and Andrzejak, R. G. (2009). Reliable detection of directional couplings using rank statistics. Physical Review E 80, 026217.\n\n\n\nCorrea, J. C. (1995). A new estimator of entropy. Communications in Statistics - Theory and Methods 24, 2439–2449, arXiv:https://doi.org/10.1080/03610929508831626.\n\n\n\nCover, T. M. (1999). Elements of information theory (John Wiley & Sons).\n\n\n\nDatseris, G. and Haaga, K. A. (2024). ComplexityMeasures. jl: scalable software to unify and accelerate entropy and complexity timeseries analysis, arXiv preprint arXiv:2406.05011.\n\n\n\nDette, H.; Siburg, K. F. and Stoimenov, P. A. (2013). A Copula-Based Non-parametric Measure of Regression Dependence. Scandinavian Journal of Statistics 40, 21–41.\n\n\n\nEbrahimi, N.; Pflughoeft, K. and Soofi, E. S. (1994). Two measures of sample entropy. Statistics & Probability Letters 20, 225–234.\n\n\n\nvan Erven, T. and Harremos, P. (2014). Rényi Divergence and Kullback-Leibler Divergence. IEEE Transactions on Information Theory 60, 3797–3820.\n\n\n\nFrenzel, S. and Pompe, B. (2007). Partial Mutual Information for Coupling Analysis of Multivariate Time Series. Phys. Rev. Lett. 99, 204101.\n\n\n\nFuruichi, S. (2006). Information theoretical properties of Tsallis entropies. Journal of Mathematical Physics 47.\n\n\n\nGao, S.; Ver Steeg, G. and Galstyan, A. (09–12 May 2015). Efficient Estimation of Mutual Information for Strongly Dependent Variables. In: Proceedings of the Eighteenth International Conference on Artificial Intelligence and Statistics, Vol. 38 of Proceedings of Machine Learning Research, edited by Lebanon, G. and Vishwanathan, S. V. (PMLR, San Diego, California, USA); pp. 277–286.\n\n\n\nGao, W.; Kannan, S.; Oh, S. and Viswanath, P. (2017). Estimating Mutual Information for Discrete-Continuous Mixtures. In: Advances in Neural Information Processing Systems, Vol. 30, edited by Guyon, I.; Luxburg, U. V.; Bengio, S.; Wallach, H.; Fergus, R.; Vishwanathan, S. and Garnett, R. (Curran Associates, Inc.).\n\n\n\nGao, W.; Oh, S. and Viswanath, P. (2018). Demystifying Fixed k -Nearest Neighbor Information Estimators. IEEE Transactions on Information Theory 64, 5629–5661.\n\n\n\nGolshani, L.; Pasha, E. and Yari, G. (2009). Some properties of Rényi entropy and Rényi entropy rate. Information Sciences 179, 2426–2433.\n\n\n\nGoria, M. N.; Leonenko, N. N.; Mergel, V. V. and Inverardi, P. L. (2005). A new class of random vector entropy estimators and its applications in testing statistical hypotheses. Journal of Nonparametric Statistics 17, 277–297, arXiv:https://doi.org/10.1080/104852504200026815.\n\n\n\nGrassberger, P. (2022). On Generalized Schuermann Entropy Estimators. Entropy 24.\n\n\n\nHe, S.; Sun, K. and Wang, H. (2016). Multivariate permutation entropy and its application for complexity analysis of chaotic systems. Physica A: Statistical Mechanics and its Applications 461, 812–823.\n\n\n\nHorvitz, D. G. and Thompson, D. J. (1952). A Generalization of Sampling Without Replacement from a Finite Universe. Journal of the American Statistical Association 47, 663–685, arXiv:https://www.tandfonline.com/doi/pdf/10.1080/01621459.1952.10483446.\n\n\n\nJizba, P.; Kleinert, H. and Shefaat, M. (2012). Rényi's information transfer between financial time series. Physica A: Statistical Mechanics and its Applications 391, 2971–2989.\n\n\n\nKalisch, M. and Bühlmann, P. (2008). Robustification of the PC-Algorithm for Directed Acyclic Graphs. Journal of Computational and Graphical Statistics 17, 773–789, arXiv:https://doi.org/10.1198/106186008X381927.\n\n\n\nKozachenko, L. F. and Leonenko, N. N. (1987). Sample estimate of the entropy of a random vector. Problemy Peredachi Informatsii 23, 9–16.\n\n\n\nKraskov, A.; Stögbauer, H. and Grassberger, P. (2004). Estimating mutual information. Phys. Rev. E 69, 066138.\n\n\n\nLeonenko, N.; Pronzato, L. and Savani, V. (2008). A class of Rényi information estimators for multidimensional densities. The Annals of Statistics 36, 2153–2182.\n\n\n\nLevy, K. J. and Narula, S. C. (1978). Testing hypotheses concerning partial correlations: Some methods and discussion. International Statistical Review/Revue Internationale de Statistique, 215–218.\n\n\n\nLi, G.; Guan, Q. and Yang, H. (2019). Noise Reduction Method of Underwater Acoustic Signals Based on CEEMDAN, Effort-To-Compress Complexity, Refined Composite Multiscale Dispersion Entropy and Wavelet Threshold Denoising. Entropy 21.\n\n\n\nLindner, M.; Vicente, R.; Priesemann, V. and Wibral, M. (2011). TRENTOOL: A Matlab open source toolbox to analyse information flow in time series data with transfer entropy. BMC Neuroscience 12, 119–119.\n\n\n\nLord, W. M.; Sun, J. and Bollt, E. M. (2018). Geometric k-nearest neighbor estimation of entropy and mutual information. Chaos: An Interdisciplinary Journal of Nonlinear Science 28.\n\n\n\nLuo, M.; Kantz, H.; Lau, N.-C.; Huang, W. and Zhou, Y. (2015). Questionable dynamical evidence for causality between galactic cosmic rays and interannual variation in global temperature. Proceedings of the National Academy of Sciences 112, E4638 - E4639.\n\n\n\nManis, G.; Aktaruzzaman, M. and Sassi, R. (2017). Bubble entropy: An entropy almost free of parameters. IEEE Transactions on Biomedical Engineering 64, 2711–2718.\n\n\n\nMartin, S.; Morison, G.; Nailon, W. H. and Durrani, T. S. (2004). Fast and accurate image registration using Tsallis entropy and simultaneous perturbation stochastic approximation. Electronics Letters 40, 595–597.\n\n\n\nMcCracken, J. M. and Weigel, R. S. (2014). Convergent cross-mapping and pairwise asymmetric inference. Physical Review E 90, 062903.\n\n\n\nMesner, O. C. and Shalizi, C. R. (2020). Conditional mutual information estimation for mixed, discrete and continuous data. IEEE Transactions on Information Theory 67, 464–484.\n\n\n\nMiller, G. (1955). Note on the bias of information estimates. Information theory in psychology: Problems and methods.\n\n\n\nPaluš, M. (2014). Cross-Scale Interactions and Information Transfer. Entropy 16, 5263–5289.\n\n\n\nPaninski, L. (2003). Estimation of entropy and mutual information. Neural computation 15, 1191–1253.\n\n\n\nPapapetrou, M. and Kugiumtzis, D. (2020). Tsallis conditional mutual information in investigating long range correlation in symbol sequences. Physica A: Statistical Mechanics and its Applications 540, 123016.\n\n\n\nPóczos, B. and Schneider, J. (2012). Nonparametric estimation of conditional information and divergences. In: Artificial Intelligence and Statistics (PMLR); pp. 914–923.\n\n\n\nQuiroga, R. Q.; Arnhold, J. and Grassberger, P. (2000). Learning driver-response relationships from synchronization patterns. Physical Review E 61, 5142.\n\n\n\nRahimzamani, A.; Asnani, H.; Viswanath, P. and Kannan, S. (2018). Estimators for multivariate information measures in general probability spaces. Advances in Neural Information Processing Systems 31.\n\n\n\nRamos, A. M.; Builes-Jaramillo, A.; Poveda, G.; Goswami, B.; Macau, E. E.; Kurths, J. and Marwan, N. (2017). Recurrence measure of conditional dependence and applications. Phys. Rev. E 95, 052206.\n\n\n\nRomano, M. C.; Thiel, M.; Kurths, J. and Grebogi, C. (2007). Estimation of the direction of the coupling by conditional probabilities of recurrence. Phys. Rev. E 76, 036211.\n\n\n\nRostaghi, M. and Azami, H. (2016). Dispersion entropy: A measure for time-series analysis. IEEE Signal Processing Letters 23, 610–614.\n\n\n\nRunge, J. (09–11 Apr 2018). Conditional independence testing based on a nearest-neighbor estimator of conditional mutual information. In: Proceedings of the Twenty-First International Conference on Artificial Intelligence and Statistics, Vol. 84 of Proceedings of Machine Learning Research, edited by Storkey, A. and Perez-Cruz, F. (PMLR); pp. 938–947.\n\n\n\nRényi, A. (1961). On measures of entropy and information. In: Proceedings of the Fourth Berkeley Symposium on Mathematical Statistics and Probability, Volume 1: Contributions to the Theory of Statistics, Vol. 4 (University of California Press); pp. 547–562.\n\n\n\nSarbu, S. (2014). Rényi information transfer: Partial Rényi transfer entropy and partial Rényi mutual information. In: 2014 IEEE International Conference on Acoustics, Speech and Signal Processing (ICASSP) (IEEE); pp. 5666–5670.\n\n\n\nSchmidt, C.; Huegle, J. and Uflacker, M. (2018). Order-independent constraint-based causal structure learning for gaussian distribution models using GPUs. In: Proceedings of the 30th International Conference on Scientific and Statistical Database Management; pp. 1–10.\n\n\n\nSchreiber, T. (2000). Measuring information transfer. Physical review letters 85, 461.\n\n\n\nSchuermann, T. (2004). Bias analysis in entropy estimation. Journal of Physics A: Mathematical and General 37, L295.\n\n\n\nShannon, C. E. (1948). A mathematical theory of communication. The Bell system technical journal 27, 379–423.\n\n\n\nShi, H.; Drton, M. and Han, F. (2022). On the power of Chatterjee’s rank correlation. Biometrika 109, 317–333.\n\n\n\nSingh, H.; Misra, N.; Hnizdo, V.; Fedorowicz, A. and Demchuk, E. (2003). Nearest Neighbor Estimates of Entropy. American Journal of Mathematical and Management Sciences 23, 301–321.\n\n\n\nSpirtes, P.; Glymour, C. N. and Scheines, R. (2000). Causation, prediction, and search (MIT press).\n\n\n\nStaniek, M. and Lehnertz, K. (2008). Symbolic Transfer Entropy. Phys. Rev. Lett. 100, 158101.\n\n\n\nSugihara, G.; May, R. M.; Ye, H.; Hsieh, C.-h.; Deyle, E. R.; Fogarty, M. and Munch, S. B. (2012). Detecting Causality in Complex Ecosystems. Science 338, 496–500.\n\n\n\nSun, J.; Taylor, D. and Bollt, E. M. (2015). Causal Network Inference by Optimal Causation Entropy. SIAM Journal on Applied Dynamical Systems 14, 73–106, arXiv:https://doi.org/10.1137/140956166.\n\n\n\nSzékely, G. J. and Rizzo, M. L. (2014). Partial distance correlation with methods for dissimilarities. The Annals of Statistics 42, 2382–2412.\n\n\n\nSzékely, G. J.; Rizzo, M. L. and Bakirov, N. K. (2007). Measuring and testing dependence by correlation of distances. The Annals of Statistics 35, 2769–2794.\n\n\n\nTsallis, C. (1988). Possible generalization of Boltzmann-Gibbs statistics. Journal of statistical physics 52, 479–487.\n\n\n\nTsallis, C. (2009). Introduction to nonextensive statistical mechanics: approaching a complex world. Vol. 1 no. 1 (Springer).\n\n\n\nVasicek, O. (1976). A test for normality based on sample entropy. Journal of the Royal Statistical Society Series B: Statistical Methodology 38, 54–59.\n\n\n\nVejmelka, M. and Paluš, M. (2008). Inferring the directionality of coupling with conditional mutual information. Physical Review E 77, 026214.\n\n\n\nWang, X.; Si, S. and Li, Y. (2020). Multiscale diversity entropy: A novel dynamical measure for fault diagnosis of rotating machinery. IEEE Transactions on Industrial Informatics 17, 5419–5429.\n\n\n\nZahl, S. (1977). Jackknifing an index of diversity. Ecology 58, 907–913.\n\n\n\nZhao, J.; Zhou, Y.; Zhang, X. and Chen, L. (2016). Part mutual information for quantifying direct associations in networks. Proceedings of the National Academy of Sciences 113, 5130–5135.\n\n\n\nZhu, J.; Bellanger, J.-J.; Shu, H. and Le Bouquin Jeannès, R. (2015). Contribution to Transfer Entropy Estimation via the k-Nearest-Neighbors Approach. Entropy 17, 4173–4201.\n\n\n\nZunino, L.; Olivares, F.; Scholkmann, F. and Rosso, O. A. (2017). Permutation entropy based time series analysis: Equalities in the input signal can lead to false conclusions. Physics Letters A 381, 1883–1892.\n\n\n\n","category":"page"},{"location":"api/discretization_counts_probs_api/","page":"Discretization API","title":"Discretization API","text":"CollapsedDocStrings = true","category":"page"},{"location":"api/discretization_counts_probs_api/#Discretization-API","page":"Discretization API","title":"Discretization API","text":"","category":"section"},{"location":"api/discretization_counts_probs_api/#Encoding-multiple-input-datasets","page":"Discretization API","title":"Encoding multiple input datasets","text":"","category":"section"},{"location":"api/discretization_counts_probs_api/","page":"Discretization API","title":"Discretization API","text":"A fundamental operation when computing multivariate information measures from data is discretization. When discretizing, what happens is that we \"encode\" input data into an intermediate representation indexed by the positive integers. This intermediate representation is called an \"encoding\". This is useful in several ways:","category":"page"},{"location":"api/discretization_counts_probs_api/","page":"Discretization API","title":"Discretization API","text":"Once a dataset has been encoded into integers, we can estimate Counts or Probabilities (tutorial).\nOnce probabilities have been estimated, one can use these to estimate MultivariateInformationMeasure (tutorial).","category":"page"},{"location":"api/discretization_counts_probs_api/","page":"Discretization API","title":"Discretization API","text":"The following functions and types are used by Associations.jl to perform discretization of input data.","category":"page"},{"location":"api/discretization_counts_probs_api/","page":"Discretization API","title":"Discretization API","text":"Discretization\nCodifyVariables\nCodifyPoints\ncodify","category":"page"},{"location":"api/discretization_counts_probs_api/#Associations.Discretization","page":"Discretization API","title":"Associations.Discretization","text":"Discretization\n\nThe supertype of all discretization schemes.\n\nConcrete implementations\n\nCodifyVariables\nCodifyPoints\n\n\n\n\n\n","category":"type"},{"location":"api/discretization_counts_probs_api/#Associations.CodifyVariables","page":"Discretization API","title":"Associations.CodifyVariables","text":"CodifyVariables <: Discretization\nCodifyVariables(outcome_space::OutcomeSpace)\n\nThe CodifyVariables discretization scheme quantises input data in a column-wise manner using the given outcome_space.\n\nCompatible outcome spaces\n\nUniqueElements (for when data are pre-discretized)\nBubbleSortSwaps\nCosineSimilarityBinning\nOrdinalPatterns\nDispersion\n\nDescription\n\nThe main difference between CodifyVariables and [CodifyPoints] is that the former uses OutcomeSpaces for discretization. This usually means that some transformation is applied to the data before discretizing. For example, some outcome constructs a delay embedding from the input (and thus encodes sequential information) before encoding the data.\n\nSpecifically, given x::AbstractStateSpaceSet..., where the i-th dataset x[i] is assumed to represent a single series of measurements, CodifyVariables encodes x[i] by codify-ing into a series of integers using an appropriate OutcomeSpace. This is typically done by first sequentially transforming the data and then running sliding window (the width of the window is controlled by outcome_space) across the data, and then encoding the values within each window to an integer.\n\nExamples\n\nusing Associations\nx, y = rand(100), rand(100)\nd = CodifyVariables(OrdinalPatterns(m=2))\ncx, cy = codify(d, x, y)\n\n\n\n\n\n","category":"type"},{"location":"api/discretization_counts_probs_api/#Associations.CodifyPoints","page":"Discretization API","title":"Associations.CodifyPoints","text":"CodifyPoints{N}\nCodifyPoints(encodings::NTuple{N, Encoding})\n\nCodifyPoints points is a Discretization scheme that encodes input data points without applying any sequential transformation to the input (as opposed to CodifyVariables, which may apply some transformation before encoding).\n\nUsage\n\nUse with codify to encode/discretize input variable on a point-by-point basis.\n\nCompatible encodings\n\nGaussianCDFEncoding\nOrdinalPatternEncoding\nRelativeMeanEncoding\nRelativeFirstDifferenceEncoding\nUniqueElementsEncoding\nRectangularBinEncoding\nCombinationEncoding\n\nDescription\n\nGiven x::AbstractStateSpaceSet..., where the i-th dataset is assumed to represent a single series of measurements, CodifyPoints encodes each point pₖ ∈ x[i] using some Encoding(s), without applying any (sequential) transformation to the x[i] first. This behaviour is different to CodifyVariables, which does apply a transformation to x[i] before encoding.\n\nIf length(x) == N (i.e. there are N input dataset), then encodings must be a tuple of N Encoding. Alternatively, if encodings is a single Encoding, then that same encoding is applied to every x[i].\n\nExamples\n\nusing Associations\n\n# The same encoding on two input datasets\nx = StateSpaceSet(rand(100, 3))\ny = StateSpaceSet(rand(100, 3))\nencoding_ord = OrdinalPatternEncoding(3)\ncx, cy = codify(CodifyPoints(encoding_ord), x, y)\n\n# Different encodings on multiple datasets\nz = StateSpaceSet(rand(100, 2))\nencoding_bin = RectangularBinEncoding(RectangularBinning(3), z)\nd = CodifyPoints(encoding_ord, encoding_ord, encoding_bin)\ncx, cy, cz = codify(d, x, y, z)\n\n\n\n\n\n","category":"type"},{"location":"api/discretization_counts_probs_api/#ComplexityMeasures.codify","page":"Discretization API","title":"ComplexityMeasures.codify","text":"codify(o::OutcomeSpace, x::Vector) → s::Vector{Int}\n\nCodify x according to the outcome space o.\n\nDescription\n\nThe reason this function exists is that we don't always want to encode the entire input x at once. Sometimes, it is desirable to first apply some transformation to x first, then apply Encodings in a point-wise manner in the transformed space. (the OutcomeSpace dictates this transformation). This is useful for encoding timeseries data.\n\nThe length of the returned s depends on the OutcomeSpace. Some outcome spaces preserve the input data length (e.g. UniqueElements), while some outcome spaces (e.g. OrdinalPatterns) do e.g. delay embeddings before encoding, so that length(s) < length(x).\n\n\n\n\n\ncodify(encoding::CodifyPoints{N}, x::Vararg{<:AbstractStateSpaceSet, N})\n\nCodify each timeseries xᵢ ∈ x according to the given encoding.\n\nExamples\n\nx = StateSpaceSet(rand(10000, 2))\ny = StateSpaceSet(rand(10000, 3))\nz = StateSpaceSet(rand(10000, 2))\n\n# For `x`, we use a relative mean encoding.\nex = RelativeMeanEncoding(0.0, 1.0, n = 3)\n# For `y`, we use a combination encoding.\ney = CombinationEncoding(\n RelativeMeanEncoding(0.0, 1.0, n = 2), \n OrdinalPatternEncoding(3)\n)\n# For `z`, we use ordinal patterns to encode.\nez = OrdinalPatternEncoding(2)\n\n# Codify two input datasets gives a 2-tuple of Vector{Int}\ncodify(CodifyPoints(ex, ey), x, y)\n\n# Codify three input datasets gives a 3-tuple of Vector{Int}\ncodify(CodifyPoints(ex, ey, ez), x, y, z)\n\n\n\n\n\ncodify(d::CodifyVariables, x::Vararg{<:AbstractStateSpaceSet, N})\ncodify(d::CodifyPoints, x::Vararg{<:AbstractStateSpaceSet, N})\n\nCodify each timeseries xᵢ ∈ x according to the given encoding/discretization d.\n\nCompatible discretizations\n\nCodifyVariables\nCodifyPoints\n\nExamples\n\nusing Associations\n\n# Sliding window encoding\nx = [0.1, 0.2, 0.3, 0.2, 0.1, 0.0, 0.5, 0.3, 0.5]\nxc1 = codify(CodifyVariables(OrdinalPatterns(m=2)), x) # should give [1, 1, 2, 2, 2, 1, 2, 1]\nxc2 = codify(OrdinalPatterns(m=2), x) # equivalent\nlength(xc1) < length(x) # should be true, because `OrdinalPatterns` delay embeds. \n\n# Point-by-point encoding\nx, y = StateSpaceSet(rand(100, 3)), StateSpaceSet(rand(100, 3))\ncx, cy = codify(CodifyPoints(OrdinalPatternEncoding(3)), x, y)\n\n\n\n\n\n","category":"function"},{"location":"api/discretization_counts_probs_api/","page":"Discretization API","title":"Discretization API","text":"In summary, the two main ways of discretizing data in Associations are as follows.","category":"page"},{"location":"api/discretization_counts_probs_api/","page":"Discretization API","title":"Discretization API","text":"The CodifyPoints discretization scheme encodes input data on a point-by-point basis by applying some Encoding to each point.\nThe CodifyVariables discretization scheme encodes input data on a column-by-column basis by applying a sliding window to each column, and encoding the data within the sliding window according to some OutcomeSpace (Internally, this uses codify).","category":"page"},{"location":"api/discretization_counts_probs_api/","page":"Discretization API","title":"Discretization API","text":"note: Note\nEncoding, OutcomeSpace and codify are all from ComplexityMeasures.jl. In this package, they are used to discretize multiple input variables instead of just one input variable.","category":"page"},{"location":"api/discretization_counts_probs_api/#Encoding-per-point/row","page":"Discretization API","title":"Encoding per point/row","text":"","category":"section"},{"location":"api/discretization_counts_probs_api/","page":"Discretization API","title":"Discretization API","text":"In some cases, it may be desireable to encode data on a row-wise basis. This typically happens when working with pre-embedded time series or StateSpaceSets (respecting the fact that time ordering is already taken care of by the embedding procedure). If we want to apply something like OrdinalPatternEncoding to such data, then we must encode each point individually, such that vectors like [1.2, 2.4, 4.5] or [\"howdy\", \"partner\"] gets mapped to an integer. The CodifyPoints discretization intstruction ensures input data are encoded on a point-by-point basis.","category":"page"},{"location":"api/discretization_counts_probs_api/","page":"Discretization API","title":"Discretization API","text":"A point-by-point discretization using CodifyPoints is formally done by applying some Encoding to each input data point. You can pick between the following encodings, or combine them in arbitrary ways using CombinationEncoding.","category":"page"},{"location":"api/discretization_counts_probs_api/","page":"Discretization API","title":"Discretization API","text":"Encoding\nGaussianCDFEncoding\nOrdinalPatternEncoding\nRelativeMeanEncoding\nRelativeFirstDifferenceEncoding\nUniqueElementsEncoding\nRectangularBinEncoding\nCombinationEncoding","category":"page"},{"location":"api/discretization_counts_probs_api/#ComplexityMeasures.Encoding","page":"Discretization API","title":"ComplexityMeasures.Encoding","text":"Encoding\n\nThe supertype for all encoding schemes. Encodings always encode elements of input data into the positive integers. The encoding API is defined by the functions encode and decode. Some probability estimators utilize encodings internally.\n\nCurrent available encodings are:\n\nOrdinalPatternEncoding.\nGaussianCDFEncoding.\nRectangularBinEncoding.\nRelativeMeanEncoding.\nRelativeFirstDifferenceEncoding.\nUniqueElementsEncoding.\nBubbleSortSwapsEncoding.\nPairDistanceEncoding.\nCombinationEncoding, which can combine any of the above encodings.\n\n\n\n\n\n","category":"type"},{"location":"api/discretization_counts_probs_api/#ComplexityMeasures.GaussianCDFEncoding","page":"Discretization API","title":"ComplexityMeasures.GaussianCDFEncoding","text":"GaussianCDFEncoding <: Encoding\nGaussianCDFEncoding{m}(; μ, σ, c::Int = 3)\n\nAn encoding scheme that encodes a scalar or vector χ into one of the integers sᵢ ∈ [1, 2, …, c] based on the normal cumulative distribution function (NCDF), and decodes the sᵢ into subintervals of [0, 1] (with some loss of information).\n\nInitializing a GaussianCDFEncoding\n\nThe size of the input to be encoded must be known beforehand. One must therefore set m = length(χ), where χ is the input (m = 1 for scalars, m ≥ 2 for vectors). To do so, one must explicitly give m as a type parameter: e.g. encoding = GaussianCDFEncoding{3}(; μ = 0.0, σ = 0.1) to encode 3-element vectors, or encoding = GaussianCDFEncoding{1}(; μ = 0.0, σ = 0.1) to encode scalars.\n\nDescription\n\nEncoding/decoding scalars\n\nGaussianCDFEncoding first maps an input scalar χ to a new real number y_ in 0 1 by using the normal cumulative distribution function (CDF) with the given mean μ and standard deviation σ, according to the map\n\nx to y y = dfrac1 sigma\n sqrt2 pi int_-infty^x e^(-(x - mu)^2)(2 sigma^2) dx\n\nNext, the interval [0, 1] is equidistantly binned and enumerated 1 2 ldots c, and y is linearly mapped to one of these integers using the linear map y to z z = textfloor(y(c-1)) + 1.\n\nBecause of the floor operation, some information is lost, so when used with decode, each decoded sᵢ is mapped to a subinterval of [0, 1]. This subinterval is returned as a length-1 Vector{SVector}.\n\nNotice that the decoding step does not yield an element of any outcome space of the estimators that use GaussianCDFEncoding internally, such as Dispersion. That is because these estimators additionally delay embed the encoded data.\n\nEncoding/decoding vectors\n\nIf GaussianCDFEncoding is used with a vector χ, then each element of χ is encoded separately, resulting in a length(χ) sequence of integers which may be treated as a CartesianIndex. The encoded symbol s ∈ [1, 2, …, c] is then just the linear index corresponding to this cartesian index (similar to how CombinationEncoding works).\n\nWhen decoded, the integer symbol s is converted back into its CartesianIndex representation, which is just a sequence of integers that refer to subdivisions of the [0, 1] interval. The relevant subintervals are then returned as a length-χ Vector{SVector}.\n\nExamples\n\njulia> using ComplexityMeasures, Statistics\n\njulia> x = [0.1, 0.4, 0.7, -2.1, 8.0];\n\njulia> μ, σ = mean(x), std(x); encoding = GaussianCDFEncoding(; μ, σ, c = 5)\n\njulia> es = encode.(Ref(encoding), x)\n5-element Vector{Int64}:\n 2\n 2\n 3\n 1\n 5\n\njulia> decode(encoding, 3)\n2-element SVector{2, Float64} with indices SOneTo(2):\n 0.4\n 0.6\n\n\n\n\n\n","category":"type"},{"location":"api/discretization_counts_probs_api/#ComplexityMeasures.OrdinalPatternEncoding","page":"Discretization API","title":"ComplexityMeasures.OrdinalPatternEncoding","text":"OrdinalPatternEncoding <: Encoding\nOrdinalPatternEncoding{m}(lt = ComplexityMeasures.isless_rand)\n\nAn encoding scheme that encodes length-m vectors into their permutation/ordinal patterns and then into the integers based on the Lehmer code. It is used by OrdinalPatterns and similar estimators, see that for a description of the outcome space.\n\nThe ordinal/permutation pattern of a vector χ is simply sortperm(χ), which gives the indices that would sort χ in ascending order.\n\nDescription\n\nThe Lehmer code, as implemented here, is a bijection between the set of factorial(m) possible permutations for a length-m sequence, and the integers 1, 2, …, factorial(m). The encoding step uses algorithm 1 in Berger et al. (2019), which is highly optimized. The decoding step is much slower due to missing optimizations (pull requests welcomed!).\n\nExample\n\njulia> using ComplexityMeasures\n\njulia> χ = [4.0, 1.0, 9.0];\n\njulia> c = OrdinalPatternEncoding(3);\n\njulia> i = encode(c, χ)\n3\n\njulia> decode(c, i)\n3-element SVector{3, Int64} with indices SOneTo(3):\n 2\n 1\n 3\n\nIf you want to encode something that is already a permutation pattern, then you can use the non-exported permutation_to_integer function.\n\n\n\n\n\n","category":"type"},{"location":"api/discretization_counts_probs_api/#ComplexityMeasures.RelativeMeanEncoding","page":"Discretization API","title":"ComplexityMeasures.RelativeMeanEncoding","text":"RelativeMeanEncoding <: Encoding\nRelativeMeanEncoding(minval::Real, maxval::Real; n = 2)\n\nRelativeMeanEncoding encodes a vector based on the relative position the mean of the vector has with respect to a predefined minimum and maximum value (minval and maxval, respectively).\n\nDescription\n\nThis encoding is inspired by Azami and Escudero (2016)'s algorithm for amplitude-aware permutation entropy. They use a linear combination of amplitude information and first differences information of state vectors to correct probabilities. Here, however, we explicitly encode the amplitude-part of the correction as an a integer symbol Λ ∈ [1, 2, …, n]. The first-difference part of the encoding is available as the RelativeFirstDifferenceEncoding encoding.\n\nEncoding/decoding\n\nWhen used with encode, an m-element state vector bfx = (x_1 x_2 ldots x_m) is encoded as Λ = dfrac1Nsum_i=1^m abs(x_i). The value of Λ is then normalized to lie on the interval [0, 1], assuming that the minimum/maximum value any single element x_i can take is minval/maxval, respectively. Finally, the interval [0, 1] is discretized into n discrete bins, enumerated by positive integers 1, 2, …, n, and the number of the bin that the normalized Λ falls into is returned.\n\nWhen used with decode, the left-edge of the bin that the normalized Λ fell into is returned.\n\n\n\n\n\n","category":"type"},{"location":"api/discretization_counts_probs_api/#ComplexityMeasures.RelativeFirstDifferenceEncoding","page":"Discretization API","title":"ComplexityMeasures.RelativeFirstDifferenceEncoding","text":"RelativeFirstDifferenceEncoding <: Encoding\nRelativeFirstDifferenceEncoding(minval::Real, maxval::Real; n = 2)\n\nRelativeFirstDifferenceEncoding encodes a vector based on the relative position the average of the first differences of the vectors has with respect to a predefined minimum and maximum value (minval and maxval, respectively).\n\nDescription\n\nThis encoding is inspired by Azami and Escudero (2016)'s algorithm for amplitude-aware permutation entropy. They use a linear combination of amplitude information and first differences information of state vectors to correct probabilities. Here, however, we explicitly encode the first differences part of the correction as an a integer symbol Λ ∈ [1, 2, …, n]. The amplitude part of the encoding is available as the RelativeMeanEncoding encoding.\n\nEncoding/decoding\n\nWhen used with encode, an m-element state vector bfx = (x_1 x_2 ldots x_m) is encoded as Λ = dfrac1m - 1sum_k=2^m x_k - x_k-1. The value of Λ is then normalized to lie on the interval [0, 1], assuming that the minimum/maximum value any single abs(x_k - x_k-1) can take is minval/maxval, respectively. Finally, the interval [0, 1] is discretized into n discrete bins, enumerated by positive integers 1, 2, …, n, and the number of the bin that the normalized Λ falls into is returned. The smaller the mean first difference of the state vector is, the smaller the bin number is. The higher the mean first difference of the state vectors is, the higher the bin number is.\n\nWhen used with decode, the left-edge of the bin that the normalized Λ fell into is returned.\n\nPerformance tips\n\nIf you are encoding multiple input vectors, it is more efficient to construct a RelativeFirstDifferenceEncoding instance and re-use it:\n\nminval, maxval = 0, 1\nencoding = RelativeFirstDifferenceEncoding(minval, maxval; n = 4)\npts = [rand(3) for i = 1:1000]\n[encode(encoding, x) for x in pts]\n\n\n\n\n\n","category":"type"},{"location":"api/discretization_counts_probs_api/#ComplexityMeasures.UniqueElementsEncoding","page":"Discretization API","title":"ComplexityMeasures.UniqueElementsEncoding","text":"UniqueElementsEncoding <: Encoding\nUniqueElementsEncoding(x)\n\nUniqueElementsEncoding is a generic encoding that encodes each xᵢ ∈ unique(x) to one of the positive integers. The xᵢ are encoded according to the order of their first appearance in the input data.\n\nThe constructor requires the input data x, since the number of possible symbols is length(unique(x)).\n\nExample\n\nusing ComplexityMeasures\nx = ['a', 2, 5, 2, 5, 'a']\ne = UniqueElementsEncoding(x)\nencode.(Ref(e), x) == [1, 2, 3, 2, 3, 1] # true\n\n\n\n\n\n","category":"type"},{"location":"api/discretization_counts_probs_api/#ComplexityMeasures.RectangularBinEncoding","page":"Discretization API","title":"ComplexityMeasures.RectangularBinEncoding","text":"RectangularBinEncoding <: Encoding\nRectangularBinEncoding(binning::RectangularBinning, x)\nRectangularBinEncoding(binning::FixedRectangularBinning)\n\nAn encoding scheme that encodes points χ ∈ x into their histogram bins.\n\nThe first call signature simply initializes a FixedRectangularBinning and then calls the second call signature.\n\nSee FixedRectangularBinning for info on mapping points to bins.\n\n\n\n\n\n","category":"type"},{"location":"api/discretization_counts_probs_api/#ComplexityMeasures.CombinationEncoding","page":"Discretization API","title":"ComplexityMeasures.CombinationEncoding","text":"CombinationEncoding <: Encoding\nCombinationEncoding(encodings)\n\nA CombinationEncoding takes multiple Encodings and creates a combined encoding that can be used to encode inputs that are compatible with the given encodings.\n\nEncoding/decoding\n\nWhen used with encode, each Encoding in encodings returns integers in the set 1, 2, …, n_e, where n_e is the total number of outcomes for a particular encoding. For k different encodings, we can thus construct the cartesian coordinate (c₁, c₂, …, cₖ) (cᵢ ∈ 1, 2, …, n_i), which can uniquely be identified by an integer. We can thus identify each unique combined encoding with a single integer.\n\nWhen used with decode, the integer symbol is converted to its corresponding cartesian coordinate, which is used to retrieve the decoded symbols for each of the encodings, and a tuple of the decoded symbols are returned.\n\nThe total number of outcomes is prod(total_outcomes(e) for e in encodings).\n\nExamples\n\nusing ComplexityMeasures\n\n# We want to encode the vector `x`.\nx = [0.9, 0.2, 0.3]\n\n# To do so, we will use a combination of first-difference encoding, amplitude encoding,\n# and ordinal pattern encoding.\n\nencodings = (\n RelativeFirstDifferenceEncoding(0, 1; n = 2),\n RelativeMeanEncoding(0, 1; n = 5),\n OrdinalPatternEncoding(3) # x is a three-element vector\n )\nc = CombinationEncoding(encodings)\n\n# Encode `x` as integer\nω = encode(c, x)\n\n# Decode symbol (into a vector of decodings, one for each encodings `e ∈ encodings`).\n# In this particular case, the first two element will be left-bin edges, and\n# the last element will be the decoded ordinal pattern (indices that would sort `x`).\nd = decode(c, ω)\n\n\n\n\n\n","category":"type"},{"location":"api/discretization_counts_probs_api/#tutorial_codify_points","page":"Discretization API","title":"Examples: encoding rows (one point at a time)","text":"","category":"section"},{"location":"api/discretization_counts_probs_api/","page":"Discretization API","title":"Discretization API","text":"We'll here use the OrdinalPatternEncoding with differing parameter m to encode multiple StateSpaceSet of differing dimensions.","category":"page"},{"location":"api/discretization_counts_probs_api/","page":"Discretization API","title":"Discretization API","text":"using Associations\nusing StateSpaceSets\nusing Random; rng = Xoshiro(1234)\n\n# The first variable is 2-dimensional and has 50 points\nx = StateSpaceSet(rand(rng, 50, 2))\n# The second variable is 3-dimensional and has 50 points\ny = StateSpaceSet(rand(rng, 50, 3))\n# The third variable is 4-dimensional and has 50 points\nz = StateSpaceSet(rand(rng, 50, 4))\n\n# One encoding scheme per input variable\n# encode `x` using `ox` on a point-by-point basis (Vector{SVector{4}} → Vector{Int})\n# encode `y` using `oy` on a point-by-point basis (Vector{SVector{3}} → Vector{Int})\n# encode `z` using `oz` on a point-by-point basis (Vector{SVector{2}} → Vector{Int})\nox = OrdinalPatternEncoding(2)\noy = OrdinalPatternEncoding(3)\noz = OrdinalPatternEncoding(4)\n\n# This given three column vectors of integers.\ncx, cy, cz = codify(CodifyPoints(ox, oy, oz), x, y, z)\n\n[cx cy cz]","category":"page"},{"location":"api/discretization_counts_probs_api/","page":"Discretization API","title":"Discretization API","text":"Notice that the 2-dimensional x has been encoded into integer values 1 or 2, because there are 2! possible ordinal patterns for dimension m = 2. The 3-dimensional y has been encoded into integers in the range 1 to 3! = 6, while the 4-dimensional z is encoded into an even larger range of integers, because the number of possible ordinal patterns is 4! = 24 for 4-dimensional embedding vectors.","category":"page"},{"location":"api/discretization_counts_probs_api/#Encoding-per-variable/column","page":"Discretization API","title":"Encoding per variable/column","text":"","category":"section"},{"location":"api/discretization_counts_probs_api/","page":"Discretization API","title":"Discretization API","text":"Sometimes, it may be desireable to encode input data one variable/column at a time. This typically happens when the input are either a single or multiple timeseries.","category":"page"},{"location":"api/discretization_counts_probs_api/","page":"Discretization API","title":"Discretization API","text":"To encode columns, we move a sliding window across each input variable/column and encode points within that window. Formally, such a sliding-window discretization is done by using the CodifyVariables discretization scheme, which takes as input some OutcomeSpace that dictates how each window is encoded, and also dictates the width of the encoding windows. ","category":"page"},{"location":"api/discretization_counts_probs_api/","page":"Discretization API","title":"Discretization API","text":"For column/variable-wise encoding, you can pick between the following outcome spaces.","category":"page"},{"location":"api/discretization_counts_probs_api/","page":"Discretization API","title":"Discretization API","text":"OutcomeSpace\nUniqueElements\nCosineSimilarityBinning\nDispersion\nOrdinalPatterns\nBubbleSortSwaps\nValueBinning\nRectangularBinning\nFixedRectangularBinning","category":"page"},{"location":"api/discretization_counts_probs_api/#ComplexityMeasures.OutcomeSpace","page":"Discretization API","title":"ComplexityMeasures.OutcomeSpace","text":"OutcomeSpace\n\nThe supertype for all outcome space implementation.\n\nDescription\n\nIn ComplexityMeasures.jl, an outcome space defines a set of possible outcomes Omega = omega_1 omega_2 ldots omega_L (some form of discretization). In the literature, the outcome space is often also called an \"alphabet\", while each outcome is called a \"symbol\" or an \"event\".\n\nAn outcome space also defines a set of rules for mapping input data to to each outcome omega_i, a processes called encoding or symbolizing or discretizing in the literature (see encodings). Some OutcomeSpaces first apply a transformation, e.g. a delay embedding, to the data before discretizing/encoding, while other OutcomeSpaces discretize/encode the data directly.\n\nImplementations\n\nOutcome space Principle Input data Counting-compatible\nUniqueElements Count of unique elements Any ✔\nValueBinning Binning (histogram) Vector, StateSpaceSet ✔\nOrdinalPatterns Ordinal patterns Vector, StateSpaceSet ✔\nSpatialOrdinalPatterns Ordinal patterns in space Array ✔\nDispersion Dispersion patterns Vector ✔\nSpatialDispersion Dispersion patterns in space Array ✔\nCosineSimilarityBinning Cosine similarity Vector ✔\nBubbleSortSwaps Swap counts when sorting Vector ✔\nSequentialPairDistances Sequential state vector distances Vector, StateSpaceSet ✔\nTransferOperator Binning (transfer operator) Vector, StateSpaceSet ✖\nNaiveKernel Kernel density estimation StateSpaceSet ✖\nWeightedOrdinalPatterns Ordinal patterns Vector, StateSpaceSet ✖\nAmplitudeAwareOrdinalPatterns Ordinal patterns Vector, StateSpaceSet ✖\nWaveletOverlap Wavelet transform Vector ✖\nPowerSpectrum Fourier transform Vector ✖\n\nIn the column \"input data\" it is assumed that the eltype of the input is <: Real.\n\nUsage\n\nOutcome spaces are used as input to\n\nprobabilities/allprobabilities_and_outcomes for computing probability mass functions.\noutcome_space, which returns the elements of the outcome space.\ntotal_outcomes, which returns the cardinality of the outcome space.\ncounts/counts_and_outcomes/allcounts_and_outcomes, for obtaining raw counts instead of probabilities (only for counting-compatible outcome spaces).\n\nCounting-compatible vs. non-counting compatible outcome spaces\n\nThere are two main types of outcome spaces.\n\nCounting-compatible outcome spaces have a well-defined way of counting how often each point in the (encoded) input data is mapped to a particular outcome omega_i. These outcome spaces use encode to discretize the input data. Examples are OrdinalPatterns (which encodes input data into ordinal patterns) or ValueBinning (which discretizes points onto a regular grid). The table below lists which outcome spaces are counting compatible.\nNon-counting compatible outcome spaces have no well-defined way of counting explicitly how often each point in the input data is mapped to a particular outcome omega_i. Instead, these outcome spaces returns a vector of pre-normalized \"relative counts\", one for each outcome omega_i. Examples are WaveletOverlap or PowerSpectrum.\n\nCounting-compatible outcome spaces can be used with any ProbabilitiesEstimator to convert counts into probability mass functions. Non-counting-compatible outcome spaces can only be used with the maximum likelihood (RelativeAmount) probabilities estimator, which estimates probabilities precisely by the relative frequency of each outcome (formally speaking, the RelativeAmount estimator also requires counts, but for the sake of code consistency, we allow it to be used with relative frequencies as well).\n\nThe function is_counting_based can be used to check whether an outcome space is based on counting.\n\nDeducing the outcome space (from data)\n\nSome outcome space models can deduce Omega without knowledge of the input, such as OrdinalPatterns. Other outcome spaces require knowledge of the input data for concretely specifying Omega, such as ValueBinning with RectangularBinning. If o is some outcome space model and x some input data, then outcome_space(o, x) returns the possible outcomes Omega. To get the cardinality of Omega, use total_outcomes.\n\nImplementation details\n\nThe element type of Omega varies between outcome space models, but it is guaranteed to be hashable and sortable. This allows for conveniently tracking the counts of a specific event across experimental realizations, by using the outcome as a dictionary key and the counts as the value for that key (or, alternatively, the key remains the outcome and one has a vector of probabilities, one for each experimental realization).\n\n\n\n\n\n","category":"type"},{"location":"api/discretization_counts_probs_api/#ComplexityMeasures.UniqueElements","page":"Discretization API","title":"ComplexityMeasures.UniqueElements","text":"UniqueElements()\n\nAn OutcomeSpace based on straight-forward counting of distinct elements in a univariate time series or multivariate dataset. This is the same as giving no estimator to probabilities.\n\nOutcome space\n\nThe outcome space is the unique sorted values of the input. Hence, input x is needed for a well-defined outcome_space.\n\nImplements\n\ncodify. Used for encoding inputs where ordering matters (e.g. time series).\n\n\n\n\n\n","category":"type"},{"location":"api/discretization_counts_probs_api/#ComplexityMeasures.CosineSimilarityBinning","page":"Discretization API","title":"ComplexityMeasures.CosineSimilarityBinning","text":"CosineSimilarityBinning(; m::Int, τ::Int, nbins::Int)\n\nA OutcomeSpace based on the cosine similarity (Wang et al., 2020).\n\nIt can be used with information to compute the \"diversity entropy\" of an input timeseries (Wang et al., 2020).\n\nThe implementation here allows for τ != 1, which was not considered in the original paper.\n\nDescription\n\nCosineSimilarityBinning probabilities are computed as follows.\n\nFrom the input time series x, using embedding lag τ and embedding dimension m, construct the embedding Y = bf x_i = (x_i x_i+tau x_i+2tau ldots x_i+mtau - 1_i = 1^N-mτ.\nCompute D = d(bf x_t bf x_t+1) _t=1^N-mτ-1, where d(cdot cdot) is the cosine similarity between two m-dimensional vectors in the embedding.\nDivide the interval [-1, 1] into nbins equally sized subintervals (including the value +1).\nConstruct a histogram of cosine similarities d in D over those subintervals.\nSum-normalize the histogram to obtain probabilities.\n\nOutcome space\n\nThe outcome space for CosineSimilarityBinning is the bins of the [-1, 1] interval, and the return configuration is the same as in ValueBinning (left bin edge).\n\nImplements\n\ncodify. Used for encoding inputs where ordering matters (e.g. time series).\n\n\n\n\n\n","category":"type"},{"location":"api/discretization_counts_probs_api/#ComplexityMeasures.Dispersion","page":"Discretization API","title":"ComplexityMeasures.Dispersion","text":"Dispersion(; c = 5, m = 2, τ = 1, check_unique = true)\n\nAn OutcomeSpace based on dispersion patterns, originally used by Rostaghi and Azami (2016) to compute the \"dispersion entropy\", which characterizes the complexity and irregularity of a time series.\n\nRecommended parameter values (Li et al., 2019) are m ∈ [2, 3], τ = 1 for the embedding, and c ∈ [3, 4, …, 8] categories for the Gaussian symbol mapping.\n\nDescription\n\nAssume we have a univariate time series X = x_i_i=1^N. First, this time series is encoded into a symbol timeseries S using the Gaussian encoding GaussianCDFEncoding with empirical mean μ and empirical standard deviation σ (both determined from X), and c as given to Dispersion.\n\nThen, S is embedded into an m-dimensional time series, using an embedding lag of tau, which yields a total of N - (m - 1)tau delay vectors z_i, or \"dispersion patterns\". Since each element of z_i can take on c different values, and each delay vector has m entries, there are c^m possible dispersion patterns. This number is used for normalization when computing dispersion entropy.\n\nThe returned probabilities are simply the frequencies of the unique dispersion patterns present in S (i.e., the UniqueElements of S).\n\nOutcome space\n\nThe outcome space for Dispersion is the unique delay vectors whose elements are the the symbols (integers) encoded by the Gaussian CDF, i.e., the unique elements of S.\n\nData requirements and parameters\n\nThe input must have more than one unique element for the Gaussian mapping to be well-defined. Li et al. (2019) recommends that x has at least 1000 data points.\n\nIf check_unique == true (default), then it is checked that the input has more than one unique value. If check_unique == false and the input only has one unique element, then a InexactError is thrown when trying to compute probabilities.\n\nnote: Why 'dispersion patterns'?\nEach embedding vector is called a \"dispersion pattern\". Why? Let's consider the case when m = 5 and c = 3, and use some very imprecise terminology for illustration:When c = 3, values clustering far below mean are in one group, values clustered around the mean are in one group, and values clustering far above the mean are in a third group. Then the embedding vector 2 2 2 2 2 consists of values that are close together (close to the mean), so it represents a set of numbers that are not very spread out (less dispersed). The embedding vector 1 1 2 3 3, however, represents numbers that are much more spread out (more dispersed), because the categories representing \"outliers\" both above and below the mean are represented, not only values close to the mean.\n\nFor a version of this estimator that can be used on high-dimensional arrays, see SpatialDispersion.\n\nImplements\n\ncodify. Used for encoding inputs where ordering matters (e.g. time series).\n\n\n\n\n\n","category":"type"},{"location":"api/discretization_counts_probs_api/#ComplexityMeasures.OrdinalPatterns","page":"Discretization API","title":"ComplexityMeasures.OrdinalPatterns","text":"OrdinalPatterns <: OutcomeSpace\nOrdinalPatterns{m}(τ = 1, lt::Function = ComplexityMeasures.isless_rand)\n\nAn OutcomeSpace based on lengh-m ordinal permutation patterns, originally introduced in Bandt and Pompe (2002)'s paper on permutation entropy. Note that m is given as a type parameter, so that when it is a literal integer there are performance accelerations.\n\nWhen passed to probabilities the output depends on the input data type:\n\nUnivariate data. If applied to a univariate timeseries (AbstractVector), then the timeseries is first embedded using embedding delay τ and dimension m, resulting in embedding vectors bfx_i _i=1^N-(m-1)tau. Then, for each bfx_i, we find its permutation pattern pi_i. Probabilities are then estimated as the frequencies of the encoded permutation symbols by using UniqueElements. When giving the resulting probabilities to information, the original permutation entropy is computed (Bandt and Pompe, 2002).\nMultivariate data. If applied to a an D-dimensional StateSpaceSet, then no embedding is constructed, m must be equal to D and τ is ignored. Each vector bfx_i of the dataset is mapped directly to its permutation pattern pi_i by comparing the relative magnitudes of the elements of bfx_i. Like above, probabilities are estimated as the frequencies of the permutation symbols. The resulting probabilities can be used to compute multivariate permutation entropy (He et al., 2016), although here we don't perform any further subdivision of the permutation patterns (as in Figure 3 of He et al. (2016)).\n\nInternally, OrdinalPatterns uses the OrdinalPatternEncoding to represent ordinal patterns as integers for efficient computations.\n\nSee WeightedOrdinalPatterns and AmplitudeAwareOrdinalPatterns for estimators that not only consider ordinal (sorting) patterns, but also incorporate information about within-state-vector amplitudes. For a version of this estimator that can be used on spatial data, see SpatialOrdinalPatterns.\n\nnote: Handling equal values in ordinal patterns\nIn Bandt and Pompe (2002), equal values are ordered after their order of appearance, but this can lead to erroneous temporal correlations, especially for data with low amplitude resolution (Zunino et al., 2017). Here, by default, if two values are equal, then one of the is randomly assigned as \"the largest\", using lt = ComplexityMeasures.isless_rand. To get the behaviour from Bandt and Pompe (2002), use lt = Base.isless.\n\nOutcome space\n\nThe outcome space Ω for OrdinalPatterns is the set of length-m ordinal patterns (i.e. permutations) that can be formed by the integers 1, 2, …, m. There are factorial(m) such patterns.\n\nFor example, the outcome [2, 3, 1] corresponds to the ordinal pattern of having the smallest value in the second position, the next smallest value in the third position, and the next smallest, i.e. the largest value in the first position. See also OrdinalPatternEncoding.\n\nIn-place symbolization\n\nOrdinalPatterns also implements the in-place probabilities! for StateSpaceSet input (or embedded vector input) for reducing allocations in looping scenarios. The length of the pre-allocated symbol vector must be the length of the dataset. For example\n\nusing ComplexityMeasures\nm, N = 2, 100\nest = OrdinalPatterns{m}(τ)\nx = StateSpaceSet(rand(N, m)) # some input dataset\nπs_ts = zeros(Int, N) # length must match length of `x`\np = probabilities!(πs_ts, est, x)\n\n\n\n\n\n","category":"type"},{"location":"api/discretization_counts_probs_api/#ComplexityMeasures.BubbleSortSwaps","page":"Discretization API","title":"ComplexityMeasures.BubbleSortSwaps","text":"BubbleSortSwaps <: CountBasedOutcomeSpace\nBubbleSortSwaps(; m = 3, τ = 1)\n\nThe BubbleSortSwaps outcome space is based on Manis et al. (2017)'s paper on \"bubble entropy\". \n\nDescription\n\nBubbleSortSwaps does the following:\n\nEmbeds the input data using embedding dimension m and embedding lag τ\nFor each state vector in the embedding, counting how many swaps are necessary for the bubble sort algorithm to sort state vectors.\n\nFor counts_and_outcomes, we then define a distribution over the number of necessary swaps. This distribution can then be used to estimate probabilities using probabilities_and_outcomes, which again can be used to estimate any InformationMeasure. An example of how to compute the \"Shannon bubble entropy\" is given below.\n\nOutcome space\n\nThe outcome_space for BubbleSortSwaps are the integers 0:N, where N = (m * (m - 1)) / 2 + 1 (the worst-case number of swaps). Hence, the number of total_outcomes is N + 1.\n\nImplements\n\ncodify. Returns the number of swaps required for each embedded state vector.\n\nExamples\n\nWith the BubbleSortSwaps outcome space, we can easily compute a \"bubble entropy\" inspired by (Manis et al., 2017). Note: this is not actually a new entropy - it is just a new way of discretizing the input data. To reproduce the bubble entropy complexity measure from (Manis et al., 2017), see BubbleEntropy.\n\nExamples\n\nusing ComplexityMeasures\nx = rand(100000)\no = BubbleSortSwaps(; m = 5) # 5-dimensional embedding vectors\ninformation(Shannon(; base = 2), o, x)\n\n# We can also compute any other \"bubble quantity\", for example the \n# \"Tsallis bubble extropy\", with arbitrary probabilities estimators:\ninformation(TsallisExtropy(), BayesianRegularization(), o, x)\n\n\n\n\n\n","category":"type"},{"location":"api/discretization_counts_probs_api/#ComplexityMeasures.ValueBinning","page":"Discretization API","title":"ComplexityMeasures.ValueBinning","text":"ValueBinning(b::AbstractBinning) <: OutcomeSpace\n\nAn OutcomeSpace based on binning the values of the data as dictated by the binning scheme b and formally computing their histogram, i.e., the frequencies of points in the bins. An alias to this is VisitationFrequency. Available binnings are subtypes of AbstractBinning.\n\nThe ValueBinning estimator has a linearithmic time complexity (n log(n) for n = length(x)) and a linear space complexity (l for l = dimension(x)). This allows computation of probabilities (histograms) of high-dimensional datasets and with small box sizes ε without memory overflow and with maximum performance. For performance reasons, the probabilities returned never contain 0s and are arbitrarily ordered.\n\nValueBinning(ϵ::Union{Real,Vector})\n\nA convenience method that accepts same input as RectangularBinning and initializes this binning directly.\n\nOutcomes\n\nThe outcome space for ValueBinning is the unique bins constructed from b. Each bin is identified by its left (lowest-value) corner, because bins are always left-closed-right-open intervals [a, b). The bins are in data units, not integer (cartesian indices units), and are returned as SVectors, i.e., same type as input data.\n\nFor convenience, outcome_space returns the outcomes in the same array format as the underlying binning (e.g., Matrix for 2D input).\n\nFor FixedRectangularBinning the outcome_space is well-defined from the binning, but for RectangularBinning input x is needed as well.\n\nImplements\n\ncodify. Used for encoding inputs where ordering matters (e.g. time series).\n\n\n\n\n\n","category":"type"},{"location":"api/discretization_counts_probs_api/#ComplexityMeasures.RectangularBinning","page":"Discretization API","title":"ComplexityMeasures.RectangularBinning","text":"RectangularBinning(ϵ, precise = false) <: AbstractBinning\n\nRectangular box partition of state space using the scheme ϵ, deducing the histogram extent and bin width from the input data.\n\nRectangularBinning is a convenience struct. It is re-cast into FixedRectangularBinning once the data are provided, so see that docstring for info on the bin calculation and the meaning of precise.\n\nBinning instructions are deduced from the type of ϵ as follows:\n\nϵ::Int divides each coordinate axis into ϵ equal-length intervals that cover all data.\nϵ::Float64 divides each coordinate axis into intervals of fixed size ϵ, starting from the axis minima until the data is completely covered by boxes.\nϵ::Vector{Int} divides the i-th coordinate axis into ϵ[i] equal-length intervals that cover all data.\nϵ::Vector{Float64} divides the i-th coordinate axis into intervals of fixed size ϵ[i], starting from the axis minima until the data is completely covered by boxes.\n\nRectangularBinning ensures all input data are covered by extending the created ranges if need be.\n\n\n\n\n\n","category":"type"},{"location":"api/discretization_counts_probs_api/#ComplexityMeasures.FixedRectangularBinning","page":"Discretization API","title":"ComplexityMeasures.FixedRectangularBinning","text":"FixedRectangularBinning <: AbstractBinning\nFixedRectangularBinning(ranges::Tuple{<:AbstractRange...}, precise = false)\n\nRectangular box partition of state space where the partition along each dimension is explicitly given by each range ranges, which is a tuple of AbstractRange subtypes. Typically, each range is the output of the range Base function, e.g., ranges = (0:0.1:1, range(0, 1; length = 101), range(2.1, 3.2; step = 0.33)). All ranges must be sorted.\n\nThe optional second argument precise dictates whether Julia Base's TwicePrecision is used for when searching where a point falls into the range. Useful for edge cases of points being almost exactly on the bin edges, but it is exactly four times as slow, so by default it is false.\n\nPoints falling outside the partition do not contribute to probabilities. Bins are always left-closed-right-open: [a, b). This means that the last value of each of the ranges dictates the last right-closing value. This value does not belong to the histogram! E.g., if given a range r = range(0, 1; length = 11), with r[end] = 1, the value 1 is outside the partition and would not attribute any increase of the probability corresponding to the last bin (here [0.9, 1))!\n\nEquivalently, the size of the histogram is histsize = map(r -> length(r)-1, ranges)!\n\nFixedRectangularBinning leads to a well-defined outcome space without knowledge of input data, see ValueBinning.\n\n\n\n\n\n","category":"type"},{"location":"api/discretization_counts_probs_api/#Example:-encoding-*columns*-(one-variable-at-a-time)","page":"Discretization API","title":"Example: encoding columns (one variable at a time)","text":"","category":"section"},{"location":"api/discretization_counts_probs_api/","page":"Discretization API","title":"Discretization API","text":"Some OutcomeSpaces dictate a sliding window which has the width of one element when used with CodifyVariables. ValueBinning is such an outcome space.","category":"page"},{"location":"api/discretization_counts_probs_api/","page":"Discretization API","title":"Discretization API","text":"using Associations\nusing Random; rng = Xoshiro(1234)\n\nx = rand(rng, 100)\no = ValueBinning(3)\ncx = codify(CodifyVariables(o), x)","category":"page"},{"location":"api/discretization_counts_probs_api/","page":"Discretization API","title":"Discretization API","text":"We can verify that ValueBinning preserves the cardinality of the input dataset.","category":"page"},{"location":"api/discretization_counts_probs_api/","page":"Discretization API","title":"Discretization API","text":"length(x) == length(cx)","category":"page"},{"location":"api/discretization_counts_probs_api/","page":"Discretization API","title":"Discretization API","text":"Other outcome spaces such as Dispersion or OrdinalPatterns do not preserve the cardinality of the input dataset when used with CodifyVariables. This is because when they are applied in a sliding window, they compress sliding windows consisting of potentially multiple points into single integers. This means that some points at the end of each input variable are lost. For example, with OrdinalPatterns, the number of encoded points decrease with the embedding parameter m.","category":"page"},{"location":"api/discretization_counts_probs_api/","page":"Discretization API","title":"Discretization API","text":"using Associations\nusing Random; rng = Xoshiro(1234)\n\nx = rand(rng, 100)\no = OrdinalPatterns(m = 3)\ncx = codify(CodifyVariables(o), x)","category":"page"},{"location":"api/discretization_counts_probs_api/","page":"Discretization API","title":"Discretization API","text":"We can simultaneously encode multiple variable/columns of a StateSpaceSet using the same outcome space, as long as the operation will result in the same number of encoded data points for each column.","category":"page"},{"location":"api/discretization_counts_probs_api/","page":"Discretization API","title":"Discretization API","text":"using Associations\nusing Random; rng = Xoshiro(1234)\n\nx = rand(rng, 100)\ny = rand(rng, 100)\no = OrdinalPatterns(m = 3)\n# Alternatively provide a tuple of input time series: codify(CodifyVariables(o), (x, y))\ncx, cy = codify(CodifyVariables(o), StateSpaceSet(x, y)) \n\n[cx cy]","category":"page"},{"location":"examples/examples_infer_graphs/#examples_network_inference","page":"Causal graph inference","title":"Causal graphs","text":"","category":"section"},{"location":"examples/examples_infer_graphs/","page":"Causal graph inference","title":"Causal graph inference","text":"Before introducing the causal graph examples, let's create a function that can plot directed graphs that we'll use below.","category":"page"},{"location":"examples/examples_infer_graphs/","page":"Causal graph inference","title":"Causal graph inference","text":"using Graphs, CairoMakie, GraphMakie\n\nfunction plotgraph(g; nlabels = repr.(1:nv(g)))\n f, ax, p = graphplot(g,\n ilabels = nlabels,\n ilabels_color = [:white for i in 1:nv(g)],\n node_color = :blue,\n node_size = 80,\n arrow_size = 15,\n figure_padding = 10\n )\n offsets = 0.02 * (p[:node_pos][] .- p[:node_pos][][1])\n offsets[1] = Point2f(0, 0.2)\n p.nlabels_offset[] = offsets\n autolimits!(ax)\n hidedecorations!(ax)\n hidespines!(ax)\n ax.aspect = DataAspect()\n return f\nend","category":"page"},{"location":"examples/examples_infer_graphs/","page":"Causal graph inference","title":"Causal graph inference","text":"We'll also implement a set of chained logistic maps with unidirectional coupling.","category":"page"},{"location":"examples/examples_infer_graphs/","page":"Causal graph inference","title":"Causal graph inference","text":"using DynamicalSystemsBase\nBase.@kwdef struct Logistic4Chain{V, RX, RY, RZ, RW, C1, C2, C3, Σ1, Σ2, Σ3, RNG}\n xi::V = [0.1, 0.2, 0.3, 0.4]\n rx::RX = 3.9\n ry::RY = 3.6\n rz::RZ = 3.6\n rw::RW = 3.8\n c_xy::C1 = 0.4\n c_yz::C2 = 0.4\n c_zw::C3 = 0.35\n σ_xy::Σ1 = 0.05\n σ_yz::Σ2 = 0.05\n σ_zw::Σ3 = 0.05\n rng::RNG = Random.default_rng()\nend\n\nfunction eom_logistic4_chain(u, p::Logistic4Chain, t)\n (; xi, rx, ry, rz, rw, c_xy, c_yz, c_zw, σ_xy, σ_yz, σ_zw, rng) = p\n x, y, z, w = u\n f_xy = (y + c_xy*(x + σ_xy * rand(rng)) ) / (1 + c_xy*(1+σ_xy))\n f_yz = (z + c_yz*(y + σ_yz * rand(rng)) ) / (1 + c_yz*(1+σ_yz))\n f_zw = (w + c_zw*(z + σ_zw * rand(rng)) ) / (1 + c_zw*(1+σ_zw))\n dx = rx * x * (1 - x)\n dy = ry * (f_xy) * (1 - f_xy)\n dz = rz * (f_yz) * (1 - f_yz)\n dw = rw * (f_zw) * (1 - f_zw)\n return SVector{4}(dx, dy, dz, dw)\nend\n\n\nfunction system(definition::Logistic4Chain)\n return DiscreteDynamicalSystem(eom_logistic4_chain, definition.xi, definition)\nend","category":"page"},{"location":"examples/examples_infer_graphs/#oce_example","page":"Causal graph inference","title":"Optimal causation entropy","text":"","category":"section"},{"location":"examples/examples_infer_graphs/","page":"Causal graph inference","title":"Causal graph inference","text":"Here, we use the OCE algorithm to infer a time series graph. We use a SurrogateAssociationTest for the initial step, and a LocalPermutationTest for the conditional steps.","category":"page"},{"location":"examples/examples_infer_graphs/","page":"Causal graph inference","title":"Causal graph inference","text":"using Associations\nusing StableRNGs\nrng = StableRNG(123)\n\n# An example system where `X → Y → Z → W`.\nsys = system(Logistic4Chain(; rng))\nx, y, z, w = columns(first(trajectory(sys, 300, Ttr = 10000)))\n\n# Independence tests for unconditional and conditional stages.\nuest = KSG2(MIShannon(); k = 3, w = 1)\nutest = SurrogateAssociationTest(uest; rng, nshuffles = 19)\ncest = MesnerShalizi(CMIShannon(); k = 3, w = 1)\nctest = LocalPermutationTest(cest; rng, nshuffles = 19)\n\n# Infer graph\nalg = OCE(; utest, ctest, α = 0.05, τmax = 1)\nparents = infer_graph(alg, [x, y, z, w])\n\n# Convert to graph and inspect edges\ng = SimpleDiGraph(parents)\ncollect(edges(g))","category":"page"},{"location":"examples/examples_infer_graphs/","page":"Causal graph inference","title":"Causal graph inference","text":"The algorithm nicely recovers the true causal directions. We can also plot the graph using the function we made above.","category":"page"},{"location":"examples/examples_infer_graphs/","page":"Causal graph inference","title":"Causal graph inference","text":"plotgraph(g; nlabels = [\"x\", \"y\", \"z\", \"w\"])","category":"page"},{"location":"examples/examples_infer_graphs/#pc_examples","page":"Causal graph inference","title":"PC-algorithm","text":"","category":"section"},{"location":"examples/examples_infer_graphs/#pc_examples_corr","page":"Causal graph inference","title":"Correlation-based tests","text":"","category":"section"},{"location":"examples/examples_infer_graphs/","page":"Causal graph inference","title":"Causal graph inference","text":"Here, we demonstrate the use of the PC-algorithm with the correlation-based CorrTest both for the pairwise (i.e. using PearsonCorrelation) and conditional (i.e. using PartialCorrelation) case.","category":"page"},{"location":"examples/examples_infer_graphs/","page":"Causal graph inference","title":"Causal graph inference","text":"We'll reproduce the first example from CausalInference.jl, where they also use a parametric correlation test to infer the skeleton graph for some normally distributed data.","category":"page"},{"location":"examples/examples_infer_graphs/","page":"Causal graph inference","title":"Causal graph inference","text":"using Associations\nusing StableRNGs\nrng = StableRNG(123)\nn = 300\nv = randn(rng, n)\nx = v + randn(rng, n)*0.25\nw = x + randn(rng, n)*0.25\nz = v + w + randn(rng, n)*0.25\ns = z + randn(rng, n)*0.25\nX = [x, v, w, z, s]\n\n# Infer a completed partially directed acyclic graph (CPDAG)\nalg = PC(CorrTest(), CorrTest(); α = 0.05)\nest_cpdag_parametric = infer_graph(alg, X; verbose = false)\n\n# Plot the graph\nplotgraph(est_cpdag_parametric; nlabels = [\"x\", \"v\", \"w\", \"z\", \"s\"])","category":"page"},{"location":"examples/examples_infer_graphs/#pc_examples_nonparametric","page":"Causal graph inference","title":"Nonparametric tests","text":"","category":"section"},{"location":"examples/examples_infer_graphs/","page":"Causal graph inference","title":"Causal graph inference","text":"The main difference between the PC algorithm implementation here and in CausalInference.jl is that our implementation automatically works with any compatible and IndependenceTest, and thus any combination of (nondirectional) AssociationMeasure and estimator.","category":"page"},{"location":"examples/examples_infer_graphs/","page":"Causal graph inference","title":"Causal graph inference","text":"Here, we replicate the example above, but using a nonparametric SurrogateAssociationTest with the Shannon mutual information MIShannon measure and the GaoOhViswanath estimator for the pairwise independence tests, and a LocalPermutationTest with conditional mutual information CMIShannon and the MesnerShalizi.","category":"page"},{"location":"examples/examples_infer_graphs/","page":"Causal graph inference","title":"Causal graph inference","text":"using Associations\nusing StableRNGs\nrng = StableRNG(123)\n\n# Use fewer observations, because MI/CMI takes longer to estimate\nn = 300\nv = randn(rng, n)\nx = v + randn(rng, n)*0.25\nw = x + randn(rng, n)*0.25\nz = v + w + randn(rng, n)*0.25\ns = z + randn(rng, n)*0.25\nX = [x, v, w, z, s]\n\nest_pairwise = JointProbabilities(MIShannon(), CodifyVariables(ValueBinning(3)))\nest_cond = MesnerShalizi(CMIShannon(); k = 5)\npairwise_test = SurrogateAssociationTest(est_pairwise; rng, nshuffles = 50)\ncond_test = LocalPermutationTest(est_cond; rng, nshuffles = 50)\nalg = PC(pairwise_test, cond_test; α = 0.05)\nest_cpdag_nonparametric = infer_graph(alg, X; verbose = false)\nplotgraph(est_cpdag_nonparametric)","category":"page"},{"location":"examples/examples_infer_graphs/","page":"Causal graph inference","title":"Causal graph inference","text":"We get the same basic structure of the graph, but which directional associations are correctly ruled out varies. In general, using different types of association measures with different independence tests, applied to general non-gaussian data, will not give the same results as the correlation-based tests.","category":"page"},{"location":"api/information_multivariate_api/","page":"Multivariate information API","title":"Multivariate information API","text":"CollapsedDocStrings = true","category":"page"},{"location":"api/information_multivariate_api/#information_api","page":"Multivariate information API","title":"Multivariate information API","text":"","category":"section"},{"location":"api/information_multivariate_api/","page":"Multivariate information API","title":"Multivariate information API","text":"information(::MultivariateInformationMeasureEstimator)\nMultivariateInformationMeasureEstimator","category":"page"},{"location":"api/information_multivariate_api/#ComplexityMeasures.information-Tuple{MultivariateInformationMeasureEstimator}","page":"Multivariate information API","title":"ComplexityMeasures.information","text":"information(est::MultivariateInformationMeasureEstimator, x...)\n\nEstimate some MultivariateInformationMeasure on input data x..., using the given MultivariateInformationMeasureEstimator.\n\nThis is just a convenience wrapper around association(est, x...).\n\n\n\n\n\n","category":"method"},{"location":"api/information_multivariate_api/#Associations.MultivariateInformationMeasureEstimator","page":"Multivariate information API","title":"Associations.MultivariateInformationMeasureEstimator","text":"MultivariateInformationMeasureEstimator\n\nThe supertype for all estimators of multivariate information measures.\n\nGeneric implementations\n\nJointProbabilities\nEntropyDecomposition\nMIDecomposition\nCMIDecomposition\n\nDedicated implementations\n\nMutualInformationEstimators:\n\nKraskovStögbauerGrassberger1\nKraskovStögbauerGrassberger2\nGaoOhViswanath\nGaoKannanOhViswanath\nGaussianMI\n\nConditionalMutualInformationEstimators:\n\nFPVP\nMesnerShalizi\nRahimzamani\nPoczosSchneiderCMI\nGaussianCMI\n\nTransferEntropyEstimators:\n\nZhu1\nLindner\n\n\n\n\n\n","category":"type"},{"location":"api/information_multivariate_api/#Estimators","page":"Multivariate information API","title":"Estimators","text":"","category":"section"},{"location":"api/information_multivariate_api/#Generic-estimators","page":"Multivariate information API","title":"Generic estimators","text":"","category":"section"},{"location":"api/information_multivariate_api/","page":"Multivariate information API","title":"Multivariate information API","text":"We provide a set of generic estimators that can be used to calculate potentially several types of information measures.","category":"page"},{"location":"api/information_multivariate_api/","page":"Multivariate information API","title":"Multivariate information API","text":"JointProbabilities\nEntropyDecomposition\nMIDecomposition\nCMIDecomposition","category":"page"},{"location":"api/information_multivariate_api/#Associations.JointProbabilities","page":"Multivariate information API","title":"Associations.JointProbabilities","text":"JointProbabilities <: InformationMeasureEstimator\nJointProbabilities(\n definition::MultivariateInformationMeasure,\n discretization::Discretization\n)\n\nJointProbabilities is a generic estimator for multivariate discrete information measures.\n\nUsage\n\nUse with association to compute an information measure from input data.\n\nDescription\n\nIt first encodes the input data according to the given discretization, then constructs probs, a multidimensional Probabilities instance. Finally, probs are forwarded to a PlugIn estimator, which computes the measure according to definition.\n\nCompatible encoding schemes\n\nCodifyVariables (encode each variable/column of the input data independently by applying an encoding in a sliding window over each input variable). \nCodifyPoints (encode each point/column of the input data)\n\nWorks for any OutcomeSpace that implements codify.\n\nnote: Joint probabilities vs decomposition methods\nUsing JointProbabilities to compute an information measure, e.g. conditional mutual estimation, is typically slower than other dedicated estimation procedures like EntropyDecomposition. The reason is that measures such as CMIShannon can be formulated as a sum of four entropies, which can be estimated individually and summed afterwards. This decomposition is fast because because we avoid explicitly estimating the entire joint pmf, which demands many extra calculation steps, However, the decomposition is biased, because it fails to fully take into consideration the joint relationships between the variables. Pick your estimator according to your needs.\n\nSee also: Counts, Probabilities, ProbabilitiesEstimator, OutcomeSpace, DiscreteInfoEstimator.\n\n\n\n\n\n","category":"type"},{"location":"api/information_multivariate_api/#Associations.EntropyDecomposition","page":"Multivariate information API","title":"Associations.EntropyDecomposition","text":"EntropyDecomposition(definition::MultivariateInformationMeasure, \n est::DifferentialInfoEstimator)\nEntropyDecomposition(definition::MultivariateInformationMeasure,\n est::DiscreteInfoEstimator,\n discretization::CodifyVariables{<:OutcomeSpace},\n pest::ProbabilitiesEstimator = RelativeAmount())\n\nEstimate the multivariate information measure specified by definition by rewriting its formula into some combination of entropy terms. \n\nIf calling the second method (discrete variant), then discretization is always done per variable/column and each column is encoded into integers using codify.\n\nUsage\n\nUse with association to compute a MultivariateInformationMeasure from input data: association(est::EntropyDecomposition, x...).\nUse with some IndependenceTest to test for independence between variables.\n\nDescription\n\nThe entropy terms are estimated using est, and then combined to form the final estimate of definition. No bias correction is applied. If est is a DifferentialInfoEstimator, then discretization and pest are ignored. If est is a DiscreteInfoEstimator, then discretization and a probabilities estimator pest must also be provided (default to RelativeAmount, which uses naive plug-in probabilities).\n\nCompatible differential information estimators\n\nIf using the first signature, any compatible DifferentialInfoEstimator can be used.\n\nCompatible outcome spaces for discrete estimation\n\nIf using the second signature, the outcome spaces can be used for discretisation. Note that not all outcome spaces will work with all measures.\n\nEstimator Principle\nUniqueElements Count of unique elements\nValueBinning Binning (histogram)\nOrdinalPatterns Ordinal patterns\nDispersion Dispersion patterns\nBubbleSortSwaps Sorting complexity\nCosineSimilarityBinning Cosine similarities histogram\n\nBias\n\nEstimating the definition by decomposition into a combination of entropy terms, which are estimated independently, will in general be more biased than when using a dedicated estimator. One reason is that this decomposition may miss out on crucial information in the joint space. To remedy this, dedicated information measure estimators typically derive the marginal estimates by first considering the joint space, and then does some clever trick to eliminate the bias that is introduced through a naive decomposition. Unless specified below, no bias correction is applied for EntropyDecomposition.\n\nHandling of overlapping parameters\n\nIf there are overlapping parameters between the measure to be estimated, and the lower-level decomposed measures, then the top-level measure parameter takes precedence. For example, if we want to estimate CMIShannon(base = 2) through a decomposition of entropies using the Kraskov(Shannon(base = ℯ)) Shannon entropy estimator, then base = 2 is used.\n\ninfo: Info\nNot all measures have the property that they can be decomposed into more fundamental information theoretic quantities. For example, MITsallisMartin can be decomposed into a combination of marginal entropies, while MIRenyiSarbu cannot. An error will be thrown if decomposition is not possible.\n\nDiscrete entropy decomposition\n\nThe second signature is for discrete estimation using DiscreteInfoEstimators, for example PlugIn. The given discretization scheme (typically an OutcomeSpace) controls how the joint/marginals are discretized, and the probabilities estimator pest controls how probabilities are estimated from counts.\n\nnote: Bias\nLike for DifferentialInfoEstimator, using a dedicated estimator for the measure in question will be more reliable than using a decomposition estimate. Here's how different discretizations are applied:ValueBinning. Bin visitation frequencies are counted in the joint space XY, then marginal visitations are obtained from the joint bin visits. This behaviour is the same for both FixedRectangularBinning and RectangularBinning (which adapts the grid to the data). When using FixedRectangularBinning, the range along the first dimension is used as a template for all other dimensions. This is a bit slower than naively binning each marginal, but lessens bias.\nOrdinalPatterns. Each timeseries is separately codify-ed according to its ordinal pattern (no bias correction).\nDispersion. Each timeseries is separately codify-ed according to its dispersion pattern (no bias correction).\n\nExamples\n\nExample 1: MIShannon estimation using decomposition into discrete Shannon entropy estimated using CodifyVariables with ValueBinning.\nExample 2: MIShannon estimation using decomposition into discrete Shannon entropy estimated using CodifyVariables with BubbleSortSwaps.\nExample 3: MIShannon estimation using decomposition into differental Shannon entropy estimated using the Kraskov estimator.\n\nSee also: MutualInformationEstimator, MultivariateInformationMeasure.\n\n\n\n\n\n","category":"type"},{"location":"api/information_multivariate_api/#Associations.MIDecomposition","page":"Multivariate information API","title":"Associations.MIDecomposition","text":"MIDecomposition(definition::MultivariateInformationMeasure, \n est::MutualInformationEstimator)\n\nEstimate the MultivariateInformationMeasure specified by definition by by decomposing, the measure, if possible, into a combination of mutual information terms. These terms are individually estimated using the given MutualInformationEstimator est, and finally combined to form the final value of the measure. \n\nUsage\n\nUse with association to compute a MultivariateInformationMeasure from input data: association(est::MIDecomposition, x...).\nUse with some IndependenceTest to test for independence between variables.\n\nExamples\n\nExample 1: Estimating CMIShannon using a decomposition into MIShannon terms using the KraskovStögbauerGrassberger1 mutual information estimator.\n\nSee also: MultivariateInformationMeasureEstimator.\n\n\n\n\n\n","category":"type"},{"location":"api/information_multivariate_api/#Associations.CMIDecomposition","page":"Multivariate information API","title":"Associations.CMIDecomposition","text":"CMIDecomposition(definition::MultivariateInformationMeasure, \n est::ConditionalMutualInformationEstimator)\n\nEstimate some multivariate information measure specified by definition, by decomposing it into a combination of conditional mutual information terms. \n\nUsage\n\nUse with association to compute a MultivariateInformationMeasure from input data: association(est::CMIDecomposition, x...).\nUse with some IndependenceTest to test for independence between variables.\n\nDescription\n\nEach of the conditional mutual information terms are estimated using est, which can be any ConditionalMutualInformationEstimator. Finally, these estimates are combined according to the relevant decomposition formula.\n\nThis estimator is similar to EntropyDecomposition, but definition is expressed as conditional mutual information terms instead of entropy terms.\n\nExamples\n\nExample 1: Estimating TEShannon by decomposing it into CMIShannon which is estimated using the FPVP estimator.\n\nSee also: ConditionalMutualInformationEstimator, MultivariateInformationMeasureEstimator, MultivariateInformationMeasure.\n\n\n\n\n\n","category":"type"},{"location":"api/information_multivariate_api/#Mutual-information-estimators","page":"Multivariate information API","title":"Mutual information estimators","text":"","category":"section"},{"location":"api/information_multivariate_api/","page":"Multivariate information API","title":"Multivariate information API","text":"MutualInformationEstimator\nKraskovStögbauerGrassberger1\nKraskovStögbauerGrassberger2\nGaoKannanOhViswanath\nGaoOhViswanath\nGaussianMI","category":"page"},{"location":"api/information_multivariate_api/#Associations.MutualInformationEstimator","page":"Multivariate information API","title":"Associations.MutualInformationEstimator","text":"MutualInformationEstimator\n\nThe supertype for dedicated MutualInformation estimators.\n\nConcrete implementations\n\nKraskovStögbauerGrassberger1\nKraskovStögbauerGrassberger2\nGaoOhViswanath\nGaoKannanOhViswanath\nGaussianMI\n\n\n\n\n\n","category":"type"},{"location":"api/information_multivariate_api/#Associations.KraskovStögbauerGrassberger1","page":"Multivariate information API","title":"Associations.KraskovStögbauerGrassberger1","text":"KSG1 <: MutualInformationEstimator\nKraskovStögbauerGrassberger1 <: MutualInformationEstimator\nKraskovStögbauerGrassberger1(; k::Int = 1, w = 0, metric_marginals = Chebyshev())\n\nThe KraskovStögbauerGrassberger1 mutual information estimator (you can use KSG1 for short) is the I^(1) k-th nearest neighbor estimator from Kraskov et al. (2004).\n\nCompatible definitions\n\nMIShannon\n\nUsage\n\nUse with association to compute Shannon mutual information from input data.\nUse with some IndependenceTest to test for independence between variables.\n\nKeyword arguments\n\nk::Int: The number of nearest neighbors to consider. Only information about the k-th nearest neighbor is actually used.\nmetric_marginals: The distance metric for the marginals for the marginals can be any metric from Distances.jl. It defaults to metric_marginals = Chebyshev(), which is the same as in Kraskov et al. (2004).\nw::Int: The Theiler window, which determines if temporal neighbors are excluded during neighbor searches in the joint space. Defaults to 0, meaning that only the point itself is excluded.\n\nExample\n\nusing Associations\nusing Random; rng = MersenneTwister(1234)\nx = rand(rng, 10000); y = rand(rng, 10000)\nassociation(KSG1(; k = 10), x, y) # should be near 0 (and can be negative)\n\n\n\n\n\n","category":"type"},{"location":"api/information_multivariate_api/#Associations.KraskovStögbauerGrassberger2","page":"Multivariate information API","title":"Associations.KraskovStögbauerGrassberger2","text":"KSG2 <: MutualInformationEstimator\nKraskovStögbauerGrassberger2 <: MutualInformationEstimator\nKraskovStögbauerGrassberger2(; k::Int = 1, w = 0, metric_marginals = Chebyshev())\n\nThe KraskovStögbauerGrassberger2 mutual information estimator (you can use KSG2 for short) is the I^(2) k-th nearest neighbor estimator from (Kraskov et al., 2004).\n\nCompatible definitions\n\nMIShannon\n\nUsage\n\nUse with association to compute Shannon mutual information from input data.\nUse with some IndependenceTest to test for independence between variables.\n\nKeyword arguments\n\nk::Int: The number of nearest neighbors to consider. Only information about the k-th nearest neighbor is actually used.\nmetric_marginals: The distance metric for the marginals for the marginals can be any metric from Distances.jl. It defaults to metric_marginals = Chebyshev(), which is the same as in Kraskov et al. (2004).\nw::Int: The Theiler window, which determines if temporal neighbors are excluded during neighbor searches in the joint space. Defaults to 0, meaning that only the point itself is excluded.\n\nDescription\n\nLet the joint StateSpaceSet X = bfX_1 bfX_2 ldots bfX_m be defined by the concatenation of the marginal StateSpaceSets bfX_k _k=1^m, where each bfX_k is potentially multivariate. Let bfx_1 bfx_2 ldots bfx_N be the points in the joint space X.\n\nThe KraskovStögbauerGrassberger2 estimator first locates, for each bfx_i in X, the point bfn_i in X, the k-th nearest neighbor to bfx_i, according to the maximum norm (Chebyshev metric). Let epsilon_i be the distance d(bfx_i bfn_i).\n\nConsider x_i^m in bfX_m, the i-th point in the marginal space bfX_m. For each bfx_i^m, we determine theta_i^m := the number of points bfx_k^m in bfX_m that are a distance less than epsilon_i away from bfx_i^m. That is, we use the distance from a query point bfx_i in X (in the joint space) to count neighbors of x_i^m in bfX_m (in the marginal space).\n\nShannon mutual information between the variables bfX_1 bfX_2 ldots bfX_m is then estimated as\n\nhatI_KSG2(bfX) =\n psi(k) -\n dfracm - 1k +\n (m - 1)psi(N) -\n dfrac1N sum_i = 1^N sum_j = 1^m psi(theta_i^j + 1)\n\nExample\n\nusing Associations\nusing Random; rng = MersenneTwister(1234)\nx = rand(rng, 10000); y = rand(rng, 10000)\nassociation(KSG2(; k = 10), x, y) # should be near 0 (and can be negative)\n\n\n\n\n\n","category":"type"},{"location":"api/information_multivariate_api/#Associations.GaoKannanOhViswanath","page":"Multivariate information API","title":"Associations.GaoKannanOhViswanath","text":"GaoKannanOhViswanath <: MutualInformationEstimator\nGaoKannanOhViswanath(definition = MIShannon(); k = 1, w = 0)\n\nThe GaoKannanOhViswanath (Shannon) estimator is designed for estimating Shannon mutual information between variables that may be either discrete, continuous or a mixture of both (Gao et al., 2017).\n\nCompatible definitions\n\nMIShannon\n\nKeyword arguments\n\nk::Int: The number of nearest neighbors to consider. Only information about the k-th nearest neighbor is actually used.\nw::Int: The Theiler window, which determines if temporal neighbors are excluded during neighbor searches in the joint space. Defaults to 0, meaning that only the point itself is excluded.\n\nUsage\n\nUse with association to compute Shannon mutual information from input data.\nUse with some IndependenceTest to test for independence between variables.\n\nDescription\n\nThe estimator starts by expressing mutual information in terms of the Radon-Nikodym derivative, and then estimates these derivatives using k-nearest neighbor distances from empirical samples.\n\nThe estimator avoids the common issue of having to add noise to data before analysis due to tied points, which may bias other estimators. Citing their paper, the estimator \"strongly outperforms natural baselines of discretizing the mixed random variables (by quantization) or making it continuous by adding a small Gaussian noise.\"\n\nwarn: Implementation note\nIn Gao et al. (2017), they claim (roughly speaking) that the estimator reduces to the KraskovStögbauerGrassberger1 estimator for continuous-valued data. However, KraskovStögbauerGrassberger1 uses the digamma function, while GaoKannanOhViswanath uses the logarithm instead, so the estimators are not exactly equivalent for continuous data.Moreover, in their algorithm 1, it is clearly not the case that the method falls back on the KraskovStögbauerGrassberger1 approach. The KraskovStögbauerGrassberger1 estimator uses k-th neighbor distances in the joint space, while the GaoKannanOhViswanath algorithm selects the maximum k-th nearest distances among the two marginal spaces, which are in general not the same as the k-th neighbor distance in the joint space (unless both marginals are univariate). Therefore, our implementation here differs slightly from algorithm 1 in GaoKannanOhViswanath. We have modified it in a way that mimics KraskovStögbauerGrassberger1 for continous data. Note that because of using the log function instead of digamma, there will be slight differences between the methods. See the source code for more details.\n\nnote: Explicitly convert your discrete data to floats\nEven though the GaoKannanOhViswanath estimator is designed to handle discrete data, our implementation demands that all input data are StateSpaceSets whose data points are floats. If you have discrete data, such as strings or symbols, encode them using integers and convert those integers to floats before passing them to association.\n\nExamples\n\nusing Associations\nusing Random; rng = MersenneTwister(1234)\nx = rand(rng, 10000); y = rand(rng, 10000)\nassociation(GaoKannanOhViswanath(; k = 10), x, y) # should be near 0 (and can be negative)\n\n\n\n\n\n","category":"type"},{"location":"api/information_multivariate_api/#Associations.GaoOhViswanath","page":"Multivariate information API","title":"Associations.GaoOhViswanath","text":"GaoOhViswanath <: MutualInformationEstimator\nGaoOhViswanath(definition = MIShannon(); k = 1, w = 0)\n\nThe GaoOhViswanath is a mutual information estimator based on nearest neighbors, and is also called the bias-improved-KSG estimator, or BI-KSG, by (Gao et al., 2018).\n\nCompatible definitions\n\nMIShannon\n\nKeyword arguments\n\nk::Int: The number of nearest neighbors to consider. Only information about the k-th nearest neighbor is actually used.\nw::Int: The Theiler window, which determines if temporal neighbors are excluded during neighbor searches in the joint space. Defaults to 0, meaning that only the point itself is excluded.\n\nUsage\n\nUse with association to compute Shannon mutual information from input data.\nUse with some IndependenceTest to test for independence between variables.\n\nDescription\n\nThe estimator is given by\n\nbeginalign*\nhatH_GAO(X Y)\n= hatH_KSG(X) + hatH_KSG(Y) - hatH_KZL(X Y) \n= psi(k) +\n log(N) +\n log\n left(\n dfracc_d_x 2 c_d_y 2c_d_x + d_y 2\n right)\n - \n dfrac1N sum_i=1^N left( log(n_x i 2) + log(n_y i 2) right)\nendalign*\n\nwhere c_d 2 = dfracpi^fracd2Gamma(dfracd2 + 1) is the volume of a d-dimensional unit mathcall_2-ball.\n\nExample\n\nusing Associations\nusing Random; rng = MersenneTwister(1234)\nx = rand(rng, 10000); y = rand(rng, 10000)\nassociation(GaoOhViswanath(; k = 10), x, y) # should be near 0 (and can be negative)\n\n\n\n\n\n","category":"type"},{"location":"api/information_multivariate_api/#Associations.GaussianMI","page":"Multivariate information API","title":"Associations.GaussianMI","text":"GaussianMI <: MutualInformationEstimator\nGaussianMI(; normalize::Bool = false)\n\nGaussianMI is a parametric estimator for Shannon mutual information.\n\nCompatible definitions\n\nMIShannon\n\nUsage\n\nUse with association to compute Shannon mutual information from input data.\nUse with some IndependenceTest to test for independence between variables.\n\nDescription\n\nGiven d_x-dimensional and d_y-dimensional input data X and Y, GaussianMI first constructs the d_x + d_y-dimensional joint StateSpaceSet XY. If normalize == true, then we follow the approach in Vejmelka & Palus (2008)(Vejmelka and Paluš, 2008) and transform each column in XY to have zero mean and unit standard deviation. If normalize == false, then the algorithm proceeds without normalization.\n\nNext, the C_{XY}, the correlation matrix for the (normalized) joint data XY is computed. The mutual information estimate GaussianMI assumes the input variables are distributed according to normal distributions with zero means and unit standard deviations. Therefore, given d_x-dimensional and d_y-dimensional input data X and Y, GaussianMI first constructs the joint StateSpaceSet XY, then transforms each column in XY to have zero mean and unit standard deviation, and finally computes the \\Sigma, the correlation matrix for XY.\n\nThe mutual information estimated (for normalize == false) is then estimated as\n\nhatI^S_Gaussian(X Y) = dfrac12\ndfrac det(Sigma_X) det(Sigma_Y)) det(Sigma))\n\nwhere we Sigma_X and Sigma_Y appear in Sigma as\n\nSigma = beginbmatrix\nSigma_X Sigma^\nSigma^ Sigma_Y\nendbmatrix\n\nIf normalize == true, then the mutual information is estimated as\n\nhatI^S_Gaussian(X Y) = -dfrac12 sum_i = 1^d_x + d_y sigma_i\n\nwhere sigma_i are the eigenvalues for Sigma.\n\nExample\n\nusing Associations\nusing Random; rng = MersenneTwister(1234)\nx = rand(rng, 10000); y = rand(rng, 10000)\nassociation(GaussianMI(), x, y) # should be near 0 (and can be negative)\n\n\n\n\n\n","category":"type"},{"location":"api/information_multivariate_api/#Conditional-mutual-information-estimators","page":"Multivariate information API","title":"Conditional mutual information estimators","text":"","category":"section"},{"location":"api/information_multivariate_api/","page":"Multivariate information API","title":"Multivariate information API","text":"ConditionalMutualInformationEstimator\nGaussianCMI\nFPVP\nMesnerShalizi\nRahimzamani\nPoczosSchneiderCMI","category":"page"},{"location":"api/information_multivariate_api/#Associations.ConditionalMutualInformationEstimator","page":"Multivariate information API","title":"Associations.ConditionalMutualInformationEstimator","text":"ConditionalMutualInformationEstimator\n\nThe supertype for dedicated ConditionalMutualInformation estimators.\n\nConcrete implementations\n\nFPVP\nGaussianCMI\nMesnerShalizi\nRahimzamani\nPoczosSchneiderCMI\n\n\n\n\n\n","category":"type"},{"location":"api/information_multivariate_api/#Associations.GaussianCMI","page":"Multivariate information API","title":"Associations.GaussianCMI","text":"GaussianCMI <: MutualInformationEstimator\nGaussianCMI(definition = CMIShannon(); normalize::Bool = false)\n\nGaussianCMI is a parametric ConditionalMutualInformationEstimator (Vejmelka and Paluš, 2008).\n\nCompatible definitions\n\nCMIShannon\n\nUsage\n\nUse with association to compute CMIShannon from input data.\nUse with some IndependenceTest to test for independence between variables.\n\nDescription\n\nGaussianCMI estimates Shannon CMI through a sum of two mutual information terms that each are estimated using GaussianMI (the normalize keyword is the same as for GaussianMI):\n\nhatI_Gaussian(X Y Z) = hatI_Gaussian(X Y Z) - hatI_Gaussian(X Z)\n\nExamples\n\nExample 1. Estimating CMIShannon. \n\n\n\n\n\n","category":"type"},{"location":"api/information_multivariate_api/#Associations.FPVP","page":"Multivariate information API","title":"Associations.FPVP","text":"FPVP <: ConditionalMutualInformationEstimator\nFPVP(definition = CMIShannon(); k = 1, w = 0)\n\nThe Frenzel-Pompe-Vejmelka-Paluš (or FPVP for short) ConditionalMutualInformationEstimator is used to estimate the conditional mutual information using a k-th nearest neighbor approach that is analogous to that of the KraskovStögbauerGrassberger1 mutual information estimator from Frenzel and Pompe (2007) and Vejmelka and Paluš (2008).\n\nk is the number of nearest neighbors. w is the Theiler window, which controls the number of temporal neighbors that are excluded during neighbor searches.\n\nCompatible definitions\n\nCMIShannon\n\nUsage\n\nUse with association to compute ConditionalMutualInformation measure from input data.\nUse with some IndependenceTest to test for independence between variables.\n\nExamples\n\nExample 1: Estimating CMIShannon\n\n\n\n\n\n","category":"type"},{"location":"api/information_multivariate_api/#Associations.MesnerShalizi","page":"Multivariate information API","title":"Associations.MesnerShalizi","text":"MesnerShalizi <: ConditionalMutualInformationEstimator\nMesnerShalizi(definition = CMIShannon(); k = 1, w = 0)\n\nThe MesnerShalizi ConditionalMutualInformationEstimator is designed for data that can be mixtures of discrete and continuous data (Mesner and Shalizi, 2020).\n\nk is the number of nearest neighbors. w is the Theiler window, which controls the number of temporal neighbors that are excluded during neighbor searches.\n\nCompatible definitions\n\nCMIShannon\n\nUsage\n\nUse with association to compute CMIShannon from input data.\nUse with some IndependenceTest to test for independence between variables.\n\nExamples\n\nusing Associations\nusing Random; rng = MersenneTwister(1234)\nx = rand(rng, 10000)\ny = rand(rng, 10000) .+ x\nz = rand(rng, 10000) .+ y\nassociation(MesnerShalizi(; k = 10), x, z, y) # should be near 0 (and can be negative)\n\n\n\n\n\n","category":"type"},{"location":"api/information_multivariate_api/#Associations.Rahimzamani","page":"Multivariate information API","title":"Associations.Rahimzamani","text":"Rahimzamani <: ConditionalMutualInformationEstimator\nRahimzamani(k = 1, w = 0)\n\nThe Rahimzamani ConditionalMutualInformationEstimator is designed for data that can be mixtures of discrete and continuous data (Rahimzamani et al., 2018).\n\nCompatible definitions\n\nCMIShannon\n\nUsage\n\nUse with association to compute a CMIShannon from input data.\nUse with some IndependenceTest to test for independence between variables.\n\nDescription\n\nThis estimator is very similar to the GaoKannanOhViswanath mutual information estimator, but has been expanded to the conditional mutual information case.\n\nk is the number of nearest neighbors. w is the Theiler window, which controls the number of temporal neighbors that are excluded during neighbor searches.\n\nExamples\n\nusing Associations\nusing Random; rng = MersenneTwister(1234)\nx = rand(rng, 10000)\ny = rand(rng, 10000) .+ x\nz = rand(rng, 10000) .+ y\nassociation(Rahimzamani(; k = 10), x, z, y) # should be near 0 (and can be negative)\n\n\n\n\n\n","category":"type"},{"location":"api/information_multivariate_api/#Associations.PoczosSchneiderCMI","page":"Multivariate information API","title":"Associations.PoczosSchneiderCMI","text":"PoczosSchneiderCMI <: ConditionalMutualInformationEstimator\nPoczosSchneiderCMI(definition = CMIRenyiPoczos(); k = 1, w = 0)\n\nThe PoczosSchneiderCMI ConditionalMutualInformationEstimator computes conditional mutual informations using a k-th nearest neighbor approach (Póczos and Schneider, 2012).\n\nk is the number of nearest neighbors. w is the Theiler window, which controls the number of temporal neighbors that are excluded during neighbor searches.\n\nCompatible definitions\n\nCMIRenyiPoczos\n\nUsage\n\nUse with association to compute CMIRenyiPoczos from input data.\nUse with some IndependenceTest to test for independence between variables.\n\nExamples\n\nusing Associations\nusing Random; rng = MersenneTwister(1234)\nx = rand(rng, 10000)\ny = rand(rng, 10000) .+ x\nz = rand(rng, 10000) .+ y\nassociation(PoczosSchneiderCMI(CMIRenyiPoczos(), k = 10), x, z, y) # should be near 0 (and can be negative)\n\n\n\n\n\n","category":"type"},{"location":"api/information_multivariate_api/#Transfer-entropy-estimators","page":"Multivariate information API","title":"Transfer entropy estimators","text":"","category":"section"},{"location":"api/information_multivariate_api/","page":"Multivariate information API","title":"Multivariate information API","text":"TransferEntropyEstimator\nZhu1\nLindner\nSymbolicTransferEntropy\nHilbert\nPhase\nAmplitude","category":"page"},{"location":"api/information_multivariate_api/#Associations.TransferEntropyEstimator","page":"Multivariate information API","title":"Associations.TransferEntropyEstimator","text":"The supertype of all dedicated transfer entropy estimators.\n\n\n\n\n\n","category":"type"},{"location":"api/information_multivariate_api/#Associations.Zhu1","page":"Multivariate information API","title":"Associations.Zhu1","text":"Zhu1 <: TransferEntropyEstimator\nZhu1(k = 1, w = 0, base = MathConstants.e)\n\nThe Zhu1 transfer entropy estimator (Zhu et al., 2015) for normalized input data (as described in Zhu et al. (2015)) for both for pairwise and conditional transfer entropy.\n\nCompatible definitions\n\nTEShannon\n\nUsage\n\nUse with association to compute TEShannon from input data.\nUse with some IndependenceTest to test for independence between variables.\n\nDescription\n\nThis estimator approximates probabilities within hyperrectangles surrounding each point xᵢ ∈ x using using k nearest neighbor searches. However, it also considers the number of neighbors falling on the borders of these hyperrectangles. This estimator is an extension to the entropy estimator in Singh et al. (2003).\n\nw is the Theiler window, which determines if temporal neighbors are excluded during neighbor searches (defaults to 0, meaning that only the point itself is excluded when searching for neighbours).\n\nDescription\n\nFor a given points in the joint embedding space jᵢ, this estimator first computes the distance dᵢ from jᵢ to its k-th nearest neighbor. Then, for each point mₖ[i] in the k-th marginal space, it counts the number of points within radius dᵢ.\n\nThe Shannon transfer entropy is then computed as\n\nTE_S(X to Y) =\npsi(k) + dfrac1N sum_i^n\nleft\n sum_k=1^3 left( psi(m_ki + 1) right)\nright\n\nwhere the index k references the three marginal subspaces T, TTf and ST for which neighbor searches are performed. Here this estimator has been modified to allow for conditioning too (a simple modification to Lindner et al. (2011)'s equation 5 and 6). \n\nExample\n\nusing Associations\nusing Random; rng = MersenneTwister(1234)\nx = rand(rng, 10000)\ny = rand(rng, 10000) .+ x\nz = rand(rng, 10000) .+ y\nest = Zhu1(TEShannon(), k = 10)\nassociation(est, x, z, y) # should be near 0 (and can be negative)\n\n\n\n\n\n","category":"type"},{"location":"api/information_multivariate_api/#Associations.Lindner","page":"Multivariate information API","title":"Associations.Lindner","text":"Lindner <: TransferEntropyEstimator\nLindner(definition = Shannon(); k = 1, w = 0, base = 2)\n\nThe Lindner transfer entropy estimator (Lindner et al., 2011), which is also used in the Trentool MATLAB toolbox, and is based on nearest neighbor searches.\n\nCompatible definitions\n\nTEShannon\n\nUsage\n\nUse with association to compute TEShannon from input data.\nUse with some IndependenceTest to test for independence between variables.\n\nKeyword parameters\n\nw is the Theiler window, which determines if temporal neighbors are excluded during neighbor searches (defaults to 0, meaning that only the point itself is excluded when searching for neighbours).\n\nThe estimator can be used both for pairwise and conditional transfer entropy estimation.\n\nDescription\n\nFor a given points in the joint embedding space jᵢ, this estimator first computes the distance dᵢ from jᵢ to its k-th nearest neighbor. Then, for each point mₖ[i] in the k-th marginal space, it counts the number of points within radius dᵢ.\n\nThe Shannon transfer entropy is then computed as\n\nTE_S(X to Y) =\npsi(k) + dfrac1N sum_i^n\nleft\n sum_k=1^3 left( psi(m_ki + 1) right)\nright\n\nwhere the index k references the three marginal subspaces T, TTf and ST for which neighbor searches are performed. Here this estimator has been modified to allow for conditioning too (a simple modification to Lindner et al. (2011)'s equation 5 and 6). \n\nExample\n\nusing Associations\nusing Random; rng = MersenneTwister(1234)\nx = rand(rng, 10000)\ny = rand(rng, 10000) .+ x\nz = rand(rng, 10000) .+ y\nest = Lindner(TEShannon(), k = 10)\nassociation(est, x, z, y) # should be near 0 (and can be negative)\n\n\n\n\n\n","category":"type"},{"location":"api/information_multivariate_api/#Associations.SymbolicTransferEntropy","page":"Multivariate information API","title":"Associations.SymbolicTransferEntropy","text":"SymbolicTransferEntropy <: TransferEntropyEstimator\nSymbolicTransferEntropy(definition = TEShannon(); m = 3, τ = 1, \n lt = ComplexityMeasures.isless_rand\n\nA convenience estimator for symbolic transfer entropy (Staniek and Lehnertz, 2008).\n\nCompatible measures\n\nTEShannon\n\nDescription\n\nSymbolic transfer entropy consists of two simple steps. First, the input time series are encoded using codify with the CodifyVariables discretization and the OrdinalPatterns outcome space. This transforms the input time series into integer time series. Transfer entropy entropy is then estimated from the encoded time series by applying \n\nTransfer entropy is then estimated as usual on the encoded timeseries with the embedding dictated by definition and the JointProbabilities estimator.\n\nExamples\n\nExample 1\n\n\n\n\n\n","category":"type"},{"location":"api/information_multivariate_api/#Associations.Hilbert","page":"Multivariate information API","title":"Associations.Hilbert","text":"Hilbert(est;\n source::InstantaneousSignalProperty = Phase(),\n target::InstantaneousSignalProperty = Phase(),\n cond::InstantaneousSignalProperty = Phase())\n) <: TransferDifferentialEntropyEstimator\n\nCompute transfer entropy on instantaneous phases/amplitudes of relevant signals, which are obtained by first applying the Hilbert transform to each signal, then extracting the phases/amplitudes of the resulting complex numbers (Paluš, 2014). Original time series are thus transformed to instantaneous phase/amplitude time series. Transfer entropy is then estimated using the provided est on those phases/amplitudes (use e.g. ValueBinning, or OrdinalPatterns).\n\ninfo: Info\nDetails on estimation of the transfer entropy (conditional mutual information) following the phase/amplitude extraction step is not given in Palus (2014). Here, after instantaneous phases/amplitudes have been obtained, these are treated as regular time series, from which transfer entropy is then computed as usual.\n\nSee also: Phase, Amplitude.\n\n\n\n\n\n","category":"type"},{"location":"api/information_multivariate_api/#Associations.Phase","page":"Multivariate information API","title":"Associations.Phase","text":"Phase <: InstantaneousSignalProperty\n\nIndicates that the instantaneous phases of a signal should be used. \n\n\n\n\n\n","category":"type"},{"location":"api/information_multivariate_api/#Associations.Amplitude","page":"Multivariate information API","title":"Associations.Amplitude","text":"Amplitude <: InstantaneousSignalProperty\n\nIndicates that the instantaneous amplitudes of a signal should be used. \n\n\n\n\n\n","category":"type"},{"location":"api/information_multivariate_api/#tutorial_infomeasures","page":"Multivariate information API","title":"A small tutorial","text":"","category":"section"},{"location":"api/information_multivariate_api/","page":"Multivariate information API","title":"Multivariate information API","text":"Associations.jl extends the single-variate information API in ComplexityMeasures.jl to information measures of multiple variables. ","category":"page"},{"location":"api/information_multivariate_api/#Definitions","page":"Multivariate information API","title":"Definitions","text":"","category":"section"},{"location":"api/information_multivariate_api/","page":"Multivariate information API","title":"Multivariate information API","text":"We define \"information measure\" as some functional of probability mass functions or probability densities. This definition may or may not agree with literature usage, depending on the context. We made this choice pragmatically based on user-friendlyness and coding-friendlyness, but still trying to maintain some level of meaningful terminology.","category":"page"},{"location":"api/information_multivariate_api/","page":"Multivariate information API","title":"Multivariate information API","text":"note: A note on naming: the same name for different things?\nUpon doing a literature review on the possible variants of information theoretic measures, it become painstakingly obvious that authors use the same name for different concepts. For novices, and experienced practitioners too, this can be confusing. Our API clearly distinguishes between methods that are conceptually the same but named differently in the literature due to differing estimation strategies, from methods that actually have different definitions.Multiple, equivalent definitions occur for example for the Shannon mutual information (MI; MIShannon), which has both a discrete and continuous version, and there there are multiple equivalent mathematical formulas for them: a direct sum/integral over a joint probability mass function (pmf), as a sum of three entropy terms, and as a Kullback-Leibler divergence between the joint pmf and the product of the marginal distributions. Since these definitions are all equivalent, we only need once type (MIShannon) to represent them.\nBut Shannon MI is not the only type of mutual information! For example, \"Tsallis mutual information\" has been proposed in different variants by various authors. Despite sharing the same name, these are actually nonequivalent definitions. We've thus assigned them entirely different measure names (e.g. MITsallisFuruichi and MITsallisMartin), with the author name at the end.","category":"page"},{"location":"api/information_multivariate_api/#Basic-estimation-strategy","page":"Multivariate information API","title":"Basic estimation strategy","text":"","category":"section"},{"location":"api/information_multivariate_api/","page":"Multivariate information API","title":"Multivariate information API","text":"To estimate a multivariate information measure in practice, you must first specify the definition of the measure, which is then used as input to an estimator of that measure. This estimator is then given to association. Every information measure has at least one estimator: JointProbabilities. Many measures have several additional estimators, and an overview can be found in the docstring for MultivariateInformationMeasureEstimator.","category":"page"},{"location":"api/information_multivariate_api/#Distances/divergences","page":"Multivariate information API","title":"Distances/divergences","text":"","category":"section"},{"location":"api/information_multivariate_api/","page":"Multivariate information API","title":"Multivariate information API","text":"There are many information measures in the literature that aim to quantify the distance/divergence between two probability mass functions (pmf) or densities. You can find those that we implement here.","category":"page"},{"location":"api/information_multivariate_api/","page":"Multivariate information API","title":"Multivariate information API","text":"As an example, let's quantify the KLDivergence between two probability mass functions estimated by symbolizing two input vectors x and y using OrdinalPatterns. Since the discrete KLDivergence can be expressed as a function of a joint pmf, we can use the JointProbabilities estimator.","category":"page"},{"location":"api/information_multivariate_api/","page":"Multivariate information API","title":"Multivariate information API","text":"using Associations\nusing Random; rng = MersenneTwister(1234)\nx, y = rand(rng, 1000), rand(rng, 1000)\n\n# Specify a discretization. We discretize per column.\ndisc = CodifyVariables(OrdinalPatterns(m=2))\n\ndef = KLDivergence()\nest = JointProbabilities(def, disc)\nassociation(est, x, y) # should be close to 0","category":"page"},{"location":"api/information_multivariate_api/","page":"Multivariate information API","title":"Multivariate information API","text":"Divergences are examples of asymmetric information measures, which we can see by flipping the order of the input data.","category":"page"},{"location":"api/information_multivariate_api/","page":"Multivariate information API","title":"Multivariate information API","text":"association(est, y, x)","category":"page"},{"location":"api/information_multivariate_api/#Conditional-entropies","page":"Multivariate information API","title":"Conditional entropies","text":"","category":"section"},{"location":"api/information_multivariate_api/","page":"Multivariate information API","title":"Multivariate information API","text":"Conditional entropies are another example of asymmetric information measures. They all have in common that they are functions of a joint pmf, and can therefore also be estimated using the JointProbabilities estimator. This time, we'll use a rectangular binning with 3 bins along each dimension to discretize the data.","category":"page"},{"location":"api/information_multivariate_api/","page":"Multivariate information API","title":"Multivariate information API","text":"using Associations\nusing Random; rng = Xoshiro(1234)\n\nx, y = randn(rng, 1000), randn(rng, 1000)\ndisc = CodifyVariables(ValueBinning(3))\ndef = ConditionalEntropyShannon(base = 2)\nest = JointProbabilities(def, disc)\nassociation(est, x, y)","category":"page"},{"location":"api/information_multivariate_api/#Joint-entropies","page":"Multivariate information API","title":"Joint entropies","text":"","category":"section"},{"location":"api/information_multivariate_api/","page":"Multivariate information API","title":"Multivariate information API","text":"Joint entropies, on the other hand, are symmetric. Joint entropies are functionals of a joint pmf, so we can still use the JointProbabilities estimator. This time, we use a Dispersion based discretization.","category":"page"},{"location":"api/information_multivariate_api/","page":"Multivariate information API","title":"Multivariate information API","text":"using Associations\nusing Random; rng = Xoshiro(1234)\n\nx, y = randn(rng, 1000), randn(rng, 1000)\ndisc = CodifyVariables(Dispersion())\nest = JointProbabilities(JointEntropyShannon(base = 2), disc)\nassociation(est, x, y) ≈ association(est, y, x) # should be true","category":"page"},{"location":"api/information_multivariate_api/#Mutual-informations","page":"Multivariate information API","title":"Mutual informations","text":"","category":"section"},{"location":"api/information_multivariate_api/","page":"Multivariate information API","title":"Multivariate information API","text":"Mutual informations, in particular MIShannon is an often-used symmetric measure for quantifing the (possibly nonlinear) association between variables. It appears in both discrete and differential form, and can be estimated in a multitude of ways. For example, one can use dedicated MutualInformationEstimators such as KraskovStögbauerGrassberger2 or GaussianMI:","category":"page"},{"location":"api/information_multivariate_api/","page":"Multivariate information API","title":"Multivariate information API","text":"using Associations\nusing StateSpaceSets\n# We'll construct two state space sets, to illustrate how we can discretize \n# multidimensional inputs using `CodifyPoints`.\nx, y = StateSpaceSet(rand(rng, 1000, 2)), StateSpaceSet(rand(rng, 1000, 2))\nest = KSG1(MIShannon(base = 2), k = 10)\nassociation(est, x, y)","category":"page"},{"location":"api/information_multivariate_api/","page":"Multivariate information API","title":"Multivariate information API","text":"The result should be symmetric:","category":"page"},{"location":"api/information_multivariate_api/","page":"Multivariate information API","title":"Multivariate information API","text":"association(est, x, y) ≈ association(est, y, x) # should be true","category":"page"},{"location":"api/information_multivariate_api/","page":"Multivariate information API","title":"Multivariate information API","text":"One can also estimate mutual information using the EntropyDecomposition estimator, or (like above) using the JointProbabilities estimator. Let's construct a differential entropy based estimator based on the Kraskov estimator.","category":"page"},{"location":"api/information_multivariate_api/","page":"Multivariate information API","title":"Multivariate information API","text":"est_diff = EntropyDecomposition(MIShannon(base = 2), Kraskov(Shannon(), k=10))","category":"page"},{"location":"api/information_multivariate_api/","page":"Multivariate information API","title":"Multivariate information API","text":"association(est_diff, x, y)","category":"page"},{"location":"api/information_multivariate_api/","page":"Multivariate information API","title":"Multivariate information API","text":"We can also construct a discrete entropy based estimator based on e.g. PlugIn estimator of Shannon entropy.","category":"page"},{"location":"api/information_multivariate_api/","page":"Multivariate information API","title":"Multivariate information API","text":"# We know that `x` and `y` were generated from a uniform distribution above,\n# so we set the minimum and maximum values of the encoding to 0 and 1,\n# respectively.\nencoding = RelativeMeanEncoding(0.0, 1.0; n = 4)\ndisc = CodifyPoints(encoding)\nest_disc = JointProbabilities(MIShannon(base = 2), disc)\nassociation(est_disc, x, y)","category":"page"},{"location":"api/information_multivariate_api/#JointProbabilities:-fine-grained-discretization-control","page":"Multivariate information API","title":"JointProbabilities: fine grained discretization control","text":"","category":"section"},{"location":"api/information_multivariate_api/","page":"Multivariate information API","title":"Multivariate information API","text":"For numerical data, we can estimate both counts and probabilities using CodifyVariables with any count-based OutcomeSpace. Here, we'll estimate MIShannon using one type of encoding for the first variable, and another type of encoding for the second variable.","category":"page"},{"location":"api/information_multivariate_api/","page":"Multivariate information API","title":"Multivariate information API","text":"using Associations\nusing Random; rng = Xoshiro(1234)\nx, y = rand(rng, 100), rand(rng, 100)\n\n# We must use outcome spaces with the same number of total outcomes.\n# This works becuase these outcome spaces construct embedding points\n# (\"windows\") in the same way/order; be careful if that isn't the case!\nox = CosineSimilarityBinning(nbins = factorial(3))\noy = OrdinalPatterns(m = 3)\n\n# Now estimate mutual information\ndiscretization = CodifyVariables((ox, oy))\nest = JointProbabilities(MIShannon(), discretization)\nassociation(est, x, y)","category":"page"},{"location":"api/information_multivariate_api/","page":"Multivariate information API","title":"Multivariate information API","text":"For more fine-grained control than CodifyVariables can offer, we can use CodifyPoints with one or several Encodings. Here's how we can estimate MIShannon one multivariate input data by discretizing each input variable in arbitrary ways.","category":"page"},{"location":"api/information_multivariate_api/","page":"Multivariate information API","title":"Multivariate information API","text":"using Associations\nusing Random; rng = Xoshiro(1234)\nx, y = StateSpaceSet(rand(rng, 1000, 2)), StateSpaceSet(rand(rng, 1000, 3))\n\n # min/max of the `rand` call is 0 and 1\nprecise = true # precise bin edges\nr = range(0, 1; length = 3)\nbinning = FixedRectangularBinning(r, dimension(x), precise)\nencoding_x = RectangularBinEncoding(binning, x)\nencoding_y = CombinationEncoding(RelativeMeanEncoding(0.0, 1, n = 2), OrdinalPatternEncoding(3))\ndiscretization = CodifyPoints(encoding_x, encoding_y)\n\n# Now estimate mutual information\nest = JointProbabilities(MIShannon(), discretization)\nassociation(est, x, y)","category":"page"},{"location":"associations/","page":"Association measures","title":"Association measures","text":"CollapsedDocStrings = true","category":"page"},{"location":"associations/#association_measures","page":"Association measures","title":"Associations","text":"","category":"section"},{"location":"associations/#Association-API","page":"Association measures","title":"Association API","text":"","category":"section"},{"location":"associations/","page":"Association measures","title":"Association measures","text":"The most basic components of Associations.jl are a collection of statistics that in some manner quantify the \"association\" between input datasets. Precisely what is meant by \"association\" depends on the measure, and precisely what is meant by \"quantify\" depends on the estimator of that measure. We formalize this notion below with the association function, which dispatches on AssociationMeasureEstimator and AssociationMeasure.","category":"page"},{"location":"associations/","page":"Association measures","title":"Association measures","text":"association\nAssociationMeasure\nAssociationMeasureEstimator","category":"page"},{"location":"associations/#Associations.association","page":"Association measures","title":"Associations.association","text":"association(estimator::AssociationMeasureEstimator, x, y, [z, ...]) → r\nassociation(definition::AssociationMeasure, x, y, [z, ...]) → r\n\nEstimate the (conditional) association between input variables x, y, z, … using the given estimator (an AssociationMeasureEstimator) or definition (an AssociationMeasure). \n\ninfo: Info\nThe type of the return value r depends on the measure/estimator. The interpretation of the returned value also depends on the specific measure and estimator used.\n\nExamples\n\nThe examples section of the online documentation has numerous using association.\n\n\n\n\n\n","category":"function"},{"location":"associations/#Associations.AssociationMeasure","page":"Association measures","title":"Associations.AssociationMeasure","text":"AssociationMeasure\n\nThe supertype of all association measures. \n\nAbstract implementations\n\nCurrently, the association measures are classified by abstract classes listed below. These abstract classes offer common functionality among association measures that are conceptually similar. This makes maintenance and framework extension easier than if each measure was implemented \"in isolation\".\n\nMultivariateInformationMeasure\nCrossmapMeasure\nClosenessMeasure\nCorrelationMeasure\n\nConcrete implementations\n\nConcrete subtypes are given as input to association. Many of these types require an AssociationMeasureEstimator to compute.\n\nType AssociationMeasure Pairwise Conditional\nCorrelation PearsonCorrelation ✓ ✖\nCorrelation PartialCorrelation ✓ ✓\nCorrelation DistanceCorrelation ✓ ✓\nCorrelation ChatterjeeCorrelation ✓ ✖\nCorrelation AzadkiaChatterjeeCoefficient ✓ ✓\nCloseness SMeasure ✓ ✖\nCloseness HMeasure ✓ ✖\nCloseness MMeasure ✓ ✖\nCloseness (ranks) LMeasure ✓ ✖\nCloseness JointDistanceDistribution ✓ ✖\nCross-mapping PairwiseAsymmetricInference ✓ ✖\nCross-mapping ConvergentCrossMapping ✓ ✖\nConditional recurrence MCR ✓ ✖\nConditional recurrence RMCD ✓ ✓\nShared information MIShannon ✓ ✖\nShared information MIRenyiJizba ✓ ✖\nShared information MIRenyiSarbu ✓ ✖\nShared information MITsallisFuruichi ✓ ✖\nShared information PartialCorrelation ✖ ✓\nShared information CMIShannon ✖ ✓\nShared information CMIRenyiSarbu ✖ ✓\nShared information CMIRenyiJizba ✖ ✓\nShared information CMIRenyiPoczos ✖ ✓\nShared information CMITsallisPapapetrou ✖ ✓\nInformation transfer TEShannon ✓ ✓\nInformation transfer TERenyiJizba ✓ ✓\nPartial mutual information PartialMutualInformation ✖ ✓\nInformation measure JointEntropyShannon ✓ ✖\nInformation measure JointEntropyRenyi ✓ ✖\nInformation measure JointEntropyTsallis ✓ ✖\nInformation measure ConditionalEntropyShannon ✓ ✖\nInformation measure ConditionalEntropyTsallisAbe ✓ ✖\nInformation measure ConditionalEntropyTsallisFuruichi ✓ ✖\nDivergence HellingerDistance ✓ ✖\nDivergence KLDivergence ✓ ✖\nDivergence RenyiDivergence ✓ ✖\nDivergence VariationDistance ✓ ✖\n\n\n\n\n\n","category":"type"},{"location":"associations/#Associations.AssociationMeasureEstimator","page":"Association measures","title":"Associations.AssociationMeasureEstimator","text":"AssociationMeasureEstimator\n\nThe supertype of all association measure estimators.\n\nConcrete subtypes are given as input to association.\n\nAbstract subtypes\n\nMultivariateInformationMeasureEstimator\nCrossmapEstimator\n\nConcrete implementations\n\nAssociationMeasure Estimators\nPearsonCorrelation Not required\nDistanceCorrelation Not required\nPartialCorrelation Not required\nChatterjeeCorrelation Not required\nAzadkiaChatterjeeCoefficient Not required\nSMeasure Not required\nHMeasure Not required\nMMeasure Not required\nLMeasure Not required\nJointDistanceDistribution Not required\nPairwiseAsymmetricInference RandomVectors, RandomSegment\nConvergentCrossMapping RandomVectors, RandomSegment\nMCR Not required\nRMCD Not required\nMIShannon JointProbabilities, EntropyDecomposition, KraskovStögbauerGrassberger1, KraskovStögbauerGrassberger2, GaoOhViswanath, GaoKannanOhViswanath, GaussianMI\nMIRenyiJizba JointProbabilities, EntropyDecomposition\nMIRenyiSarbu JointProbabilities\nMITsallisFuruichi JointProbabilities, EntropyDecomposition\nMITsallisMartin JointProbabilities, EntropyDecomposition\nCMIShannon JointProbabilities, EntropyDecomposition, MIDecomposition, GaussianCMI, FPVP, MesnerShalizi, Rahimzamani\nCMIRenyiSarbu JointProbabilities\nCMIRenyiJizba JointProbabilities, EntropyDecomposition\nCMIRenyiPoczos PoczosSchneiderCMI\nCMITsallisPapapetrou JointProbabilities\nTEShannon JointProbabilities, EntropyDecomposition, Zhu1, Lindner\nTERenyiJizba JointProbabilities\nPartialMutualInformation JointProbabilities\nJointEntropyShannon JointProbabilities\nJointEntropyRenyi JointProbabilities\nJointEntropyTsallis JointProbabilities\nConditionalEntropyShannon JointProbabilities\nConditionalEntropyTsallisAbe JointProbabilities\nConditionalEntropyTsallisFuruichi JointProbabilities\nHellingerDistance JointProbabilities\nKLDivergence JointProbabilities\nRenyiDivergence JointProbabilities\nVariationDistance JointProbabilities\n\n\n\n\n\n","category":"type"},{"location":"associations/","page":"Association measures","title":"Association measures","text":"Here are some examples of how to use association.","category":"page"},{"location":"associations/","page":"Association measures","title":"Association measures","text":"using Associations\nx, y, z = rand(1000), rand(1000), rand(1000);\nassociation(LMeasure(), x, y)\nassociation(DistanceCorrelation(), x, y)\nassociation(JointProbabilities(JointEntropyShannon(), CodifyVariables(Dispersion(c = 3, m = 2))), x, y)\nassociation(EntropyDecomposition(MIShannon(), PlugIn(Shannon()), CodifyVariables(OrdinalPatterns(m=3))), x, y)\nassociation(KSG2(MIShannon(base = 2)), x, y)\nassociation(JointProbabilities(PartialMutualInformation(), CodifyVariables(OrdinalPatterns(m=3))), x, y, z)\nassociation(FPVP(CMIShannon(base = 2)), x, y, z)","category":"page"},{"location":"associations/#information_api","page":"Association measures","title":"Information measures","text":"","category":"section"},{"location":"associations/","page":"Association measures","title":"Association measures","text":"MultivariateInformationMeasure","category":"page"},{"location":"associations/#Associations.MultivariateInformationMeasure","page":"Association measures","title":"Associations.MultivariateInformationMeasure","text":"MultivariateInformationMeasure <: AssociationMeasure\n\nThe supertype for all multivariate information-based measure definitions.\n\nDefinition\n\nFollowing Datseris and Haaga (2024), we define a multivariate information measure as any functional of a multidimensional probability mass functions (PMFs) or multidimensional probability density.\n\nImplementations\n\nJointEntropy definitions:\n\nJointEntropyShannon\nJointEntropyRenyi\nJointEntropyTsallis\n\nConditionalEntropy definitions:\n\nConditionalEntropyShannon\nConditionalEntropyTsallisAbe\nConditionalEntropyTsallisFuruichi\n\nDivergenceOrDistance definitions:\n\nHellingerDistance\nKLDivergence\nRenyiDivergence\nVariationDistance\n\nMutualInformation definitions:\n\nMIShannon\nMIRenyiJizba\nMIRenyiSarbu\nMITsallisMartin\nMITsallisFuruichi\n\nConditionalMutualInformation definitions:\n\nCMIShannon\nCMITsallisPapapetrou\nCMIRenyiJizba\nCMIRenyiPoczos\nCMIRenyiSarbu\n\nTransferEntropy definitions:\n\nTEShannon\nTERenyiJizba\n\nOther definitions:\n\nPartialMutualInformation\n\n\n\n\n\n","category":"type"},{"location":"associations/#conditional_entropies","page":"Association measures","title":"Conditional entropies","text":"","category":"section"},{"location":"associations/","page":"Association measures","title":"Association measures","text":"ConditionalEntropy\nConditionalEntropyShannon\nConditionalEntropyTsallisFuruichi\nConditionalEntropyTsallisAbe","category":"page"},{"location":"associations/#Associations.ConditionalEntropy","page":"Association measures","title":"Associations.ConditionalEntropy","text":"ConditionalEntropy <: MultivariateInformationMeasure\n\nThe supertype for all conditional entropy measures.\n\nConcrete subtypes\n\nConditionalEntropyShannon\nConditionalEntropyTsallisAbe\nConditionalEntropyTsallisFuruichi\n\n\n\n\n\n","category":"type"},{"location":"associations/#Associations.ConditionalEntropyShannon","page":"Association measures","title":"Associations.ConditionalEntropyShannon","text":"ConditionalEntropyShannon <: ConditionalEntropy\nConditionalEntropyShannon(; base = 2)\n\nThe Shannon conditional entropy measure.\n\nUsage\n\nUse with association to compute the Shannon conditional entropy between two variables.\n\nCompatible estimators\n\nJointProbabilities\n\nDiscrete definition\n\nSum formulation\n\nThe conditional entropy between discrete random variables X and Y with finite ranges mathcalX and mathcalY is defined as\n\nH^S(X Y) = -sum_x in mathcalX y in mathcalY p(x y) log(p(x y))\n\nThis is the definition used when calling association with a JointProbabilities estimator.\n\nTwo-entropies formulation\n\nEquivalently, the following differenConditionalEntropy of entropies hold\n\nH^S(X Y) = H^S(X Y) - H^S(Y)\n\nwhere H^S(cdot) and H^S(cdot cdot) are the Shannon entropy and Shannon joint entropy, respectively. This is the definition used when calling association with a ProbabilitiesEstimator.\n\nDifferential definition\n\nThe differential conditional Shannon entropy is analogously defined as\n\nH^S(X Y) = h^S(X Y) - h^S(Y)\n\nwhere h^S(cdot) and h^S(cdot cdot) are the Shannon differential entropy and Shannon joint differential entropy, respectively. This is the definition used when calling association with a DifferentialInfoEstimator.\n\nEstimation\n\nExample 1: Analytical example from Cover & Thomas's book.\nExample 2: JointProbabilities estimator withCodifyVariables discretization and UniqueElements outcome space on categorical data.\nExample 3: JointProbabilities estimator with CodifyPoints discretization and UniqueElementsEncoding encoding of points on numerical data.\n\n\n\n\n\n","category":"type"},{"location":"associations/#Associations.ConditionalEntropyTsallisFuruichi","page":"Association measures","title":"Associations.ConditionalEntropyTsallisFuruichi","text":"ConditionalEntropyTsallisFuruichi <: ConditionalEntropy\nConditionalEntropyTsallisFuruichi(; base = 2, q = 1.5)\n\nFuruichi (2006)'s discrete Tsallis conditional entropy definition.\n\nUsage\n\nUse with association to compute the Tsallis-Furuichi conditional entropy between two variables.\n\nCompatible estimators\n\nJointProbabilities\n\nDefinition\n\nFuruichi's Tsallis conditional entropy between discrete random variables X and Y with finite ranges mathcalX and mathcalY is defined as\n\nH_q^T(X Y) = -sum_x in mathcalX y in mathcalY\np(x y)^q log_q(p(x y))\n\nln_q(x) = fracx^1-q - 11 - q and q neq 1. For q = 1, H_q^T(X Y) reduces to the Shannon conditional entropy:\n\nH_q=1^T(X Y) = -sum_x in mathcalX y in mathcalY =\np(x y) log(p(x y))\n\nIf any of the entries of the marginal distribution for Y are zero, or the q-logarithm is undefined for a particular value, then the measure is undefined and NaN is returned.\n\nEstimation\n\nExample 1: JointProbabilities estimator withCodifyVariables discretization and UniqueElements outcome space on categorical data.\nExample 2: JointProbabilities estimator with CodifyPoints discretization and UniqueElementsEncoding encoding of points on numerical data.\n\n\n\n\n\n","category":"type"},{"location":"associations/#Associations.ConditionalEntropyTsallisAbe","page":"Association measures","title":"Associations.ConditionalEntropyTsallisAbe","text":"ConditionalEntropyTsallisAbe <: ConditionalEntropy\nConditionalEntropyTsallisAbe(; base = 2, q = 1.5)\n\nAbe and Rajagopal (2001)'s discrete Tsallis conditional entropy measure.\n\nUsage\n\nUse with association to compute the Tsallis-Abe conditional entropy between two variables.\n\nCompatible estimators\n\nJointProbabilities\n\nDefinition\n\nAbe & Rajagopal's Tsallis conditional entropy between discrete random variables X and Y with finite ranges mathcalX and mathcalY is defined as\n\nH_q^T_A(X Y) = dfracH_q^T(X Y) - H_q^T(Y)1 + (1-q)H_q^T(Y)\n\nwhere H_q^T(cdot) and H_q^T(cdot cdot) is the Tsallis entropy and the joint Tsallis entropy.\n\nEstimation\n\nExample 1: JointProbabilities estimator withCodifyVariables discretization and UniqueElements outcome space on categorical data.\nExample 2: JointProbabilities estimator with CodifyPoints discretization and UniqueElementsEncoding encoding of points on numerical data.\n\n\n\n\n\n","category":"type"},{"location":"associations/#divergences_and_distances","page":"Association measures","title":"Divergences and distances","text":"","category":"section"},{"location":"associations/","page":"Association measures","title":"Association measures","text":"DivergenceOrDistance\nHellingerDistance\nKLDivergence\nRenyiDivergence\nVariationDistance","category":"page"},{"location":"associations/#Associations.DivergenceOrDistance","page":"Association measures","title":"Associations.DivergenceOrDistance","text":"DivergenceOrDistance <: BivariateInformationMeasure\n\nThe supertype for bivariate information measures aiming to quantify some sort of divergence, distance or closeness between two probability distributions.\n\nSome of these measures are proper metrics, while others are not, but they have in common that they aim to quantify how \"far from each other\" two probabilities distributions are.\n\nConcrete implementations\n\nHellingerDistance\nKLDivergence\nRenyiDivergence\nVariationDistance\n\n\n\n\n\n","category":"type"},{"location":"associations/#Associations.HellingerDistance","page":"Association measures","title":"Associations.HellingerDistance","text":"HellingerDistance <: DivergenceOrDistance\n\nThe Hellinger distance.\n\nUsage\n\nUse with association to compute the compute the Hellinger distance between two pre-computed probability distributions, or from raw data using one of the estimators listed below.\n\nCompatible estimators\n\nJointProbabilities\n\nDescription\n\nThe Hellinger distance between two probability distributions P_X = (p_x(omega_1) ldots p_x(omega_n)) and P_Y = (p_y(omega_1) ldots p_y(omega_m)), both defined over the same OutcomeSpace Omega = omega_1 ldots omega_n , is defined as\n\nD_H(P_Y(Omega) P_Y(Omega)) =\ndfrac1sqrt2 sum_omega in Omega (sqrtp_x(omega) - sqrtp_y(omega))^2\n\nEstimation\n\nExample 1: From precomputed probabilities\nExample 2: JointProbabilities with OrdinalPatterns outcome space\n\n\n\n\n\n","category":"type"},{"location":"associations/#Associations.KLDivergence","page":"Association measures","title":"Associations.KLDivergence","text":"KLDivergence <: DivergenceOrDistance\n\nThe Kullback-Leibler (KL) divergence.\n\nUsage\n\nUse with association to compute the compute the KL-divergence between two pre-computed probability distributions, or from raw data using one of the estimators listed below.\n\nCompatible estimators\n\nJointDistanceDistribution\n\nEstimators\n\nJointProbabilities.\n\nDescription\n\nThe KL-divergence between two probability distributions P_X = (p_x(omega_1) ldots p_x(omega_n)) and P_Y = (p_y(omega_1) ldots p_y(omega_m)), both defined over the same OutcomeSpace Omega = omega_1 ldots omega_n , is defined as\n\nD_KL(P_Y(Omega) P_Y(Omega)) =\nsum_omega in Omega p_x(omega) logdfracp_x(omega)p_y(omega)\n\nImplements\n\nassociation. Used to compute the KL-divergence between two pre-computed probability distributions. If used with RelativeAmount, the KL divergence may be undefined to due some outcomes having zero counts. Use some other ProbabilitiesEstimator like BayesianRegularization to ensure all estimated probabilities are nonzero.\n\nnote: Note\nDistances.jl also defines KLDivergence. Quality it if you're loading both packages, i.e. do association(Associations.KLDivergence(), x, y).\n\nEstimation\n\nExample 1: From precomputed probabilities\nExample 2: JointProbabilities with OrdinalPatterns outcome space\n\n\n\n\n\n","category":"type"},{"location":"associations/#Associations.RenyiDivergence","page":"Association measures","title":"Associations.RenyiDivergence","text":"RenyiDivergence <: DivergenceOrDistance\nRenyiDivergence(q; base = 2)\n\nThe Rényi divergence of positive order q.\n\nUsage\n\nUse with association to compute the compute the Rényi divergence between two pre-computed probability distributions, or from raw data using one of the estimators listed below.\n\nCompatible estimators\n\nJointDistanceDistribution\n\nDescription\n\nThe Rényi divergence between two probability distributions P_X = (p_x(omega_1) ldots p_x(omega_n)) and P_Y = (p_y(omega_1) ldots p_y(omega_m)), both defined over the same OutcomeSpace Omega = omega_1 ldots omega_n , is defined as van Erven and Harremos (2014).\n\nD_q(P_Y(Omega) P_Y(Omega)) =\ndfrac1q - 1 log sum_omega in Omegap_x(omega)^qp_y(omega)^1-alpha\n\nImplements\n\ninformation. Used to compute the Rényi divergence between two pre-computed probability distributions. If used with RelativeAmount, the KL divergence may be undefined to due some outcomes having zero counts. Use some other ProbabilitiesEstimator like BayesianRegularization to ensure all estimated probabilities are nonzero.\n\nnote: Note\nDistances.jl also defines RenyiDivergence. Quality it if you're loading both packages, i.e. do association(Associations.RenyiDivergence(), x, y).\n\nEstimation\n\nExample 1: From precomputed probabilities\nExample 2: JointProbabilities with OrdinalPatterns outcome space\n\n\n\n\n\n","category":"type"},{"location":"associations/#Associations.VariationDistance","page":"Association measures","title":"Associations.VariationDistance","text":"VariationDistance <: DivergenceOrDistance\n\nThe variation distance.\n\nUsage\n\nUse with association to compute the compute the variation distance between two pre-computed probability distributions, or from raw data using one of the estimators listed below.\n\nCompatible estimators\n\nJointDistanceDistribution\n\nDescription\n\nThe variation distance between two probability distributions P_X = (p_x(omega_1) ldots p_x(omega_n)) and P_Y = (p_y(omega_1) ldots p_y(omega_m)), both defined over the same OutcomeSpace Omega = omega_1 ldots omega_n , is defined as\n\nD_V(P_Y(Omega) P_Y(Omega)) =\ndfrac12 sum_omega in Omega p_x(omega) - p_y(omega) \n\nExamples\n\nExample 1: From precomputed probabilities\nExample 2: JointProbabilities with OrdinalPatterns outcome space\n\n\n\n\n\n","category":"type"},{"location":"associations/#joint_entropies","page":"Association measures","title":"Joint entropies","text":"","category":"section"},{"location":"associations/","page":"Association measures","title":"Association measures","text":"JointEntropy\nJointEntropyShannon\nJointEntropyTsallis\nJointEntropyRenyi","category":"page"},{"location":"associations/#Associations.JointEntropy","page":"Association measures","title":"Associations.JointEntropy","text":"JointEntropy <: BivariateInformationMeasure\n\nThe supertype for all joint entropy measures.\n\nConcrete implementations\n\nJointEntropyShannon\nJointEntropyRenyi\nJointEntropyTsallis\n\n\n\n\n\n","category":"type"},{"location":"associations/#Associations.JointEntropyShannon","page":"Association measures","title":"Associations.JointEntropyShannon","text":"JointEntropyShannon <: JointEntropy\nJointEntropyShannon(; base = 2)\n\nThe Shannon joint entropy measure (Cover, 1999).\n\nUsage\n\nUse with association to compute the Shannon joint entropy between two variables.\n\nCompatible estimators\n\nJointProbabilities\n\nDefinition\n\nGiven two two discrete random variables X and Y with ranges mathcalX and mathcalX, Cover (1999) defines the Shannon joint entropy as\n\nH^S(X Y) = -sum_xin mathcalX y in mathcalY p(x y) log p(x y)\n\nwhere we define log(p(x y)) = 0 if p(x y) = 0.\n\nEstimation\n\nExample 1: JointProbabilities with Dispersion outcome space\n\n\n\n\n\n","category":"type"},{"location":"associations/#Associations.JointEntropyTsallis","page":"Association measures","title":"Associations.JointEntropyTsallis","text":"JointEntropyTsallis <: JointEntropy\nJointEntropyTsallis(; base = 2, q = 1.5)\n\nThe Tsallis joint entropy definition from Furuichi (2006). \n\nUsage\n\nUse with association to compute the Furuichi-Tsallis joint entropy between two variables.\n\nCompatible estimators\n\nJointProbabilities\n\nDefinition\n\nGiven two two discrete random variables X and Y with ranges mathcalX and mathcalX, Furuichi (2006) defines the Tsallis joint entropy as\n\nH_q^T(X Y) = -sum_xin mathcalX y in mathcalY p(x y)^q log_q p(x y)\n\nwhere log_q(x q) = dfracx^1-q - 11-q is the q-logarithm, and we define log_q(x q) = 0 if q = 0.\n\nEstimation\n\nExample 1: JointProbabilities with OrdinalPatterns outcome space\n\n\n\n\n\n","category":"type"},{"location":"associations/#Associations.JointEntropyRenyi","page":"Association measures","title":"Associations.JointEntropyRenyi","text":"JointEntropyRenyi <: JointEntropy\nJointEntropyRenyi(; base = 2, q = 1.5)\n\nThe Rényi joint entropy measure (Golshani et al., 2009).\n\nUsage\n\nUse with association to compute the Golshani-Rényi joint entropy between two variables.\n\nCompatible estimators\n\nJointProbabilities\n\nDefinition\n\nGiven two two discrete random variables X and Y with ranges mathcalX and mathcalX, Golshani et al. (2009) defines the Rényi joint entropy as\n\nH_q^R(X Y) = dfrac11-alpha log sum_i = 1^N p_i^q\n\nwhere q 0 and q = 1.\n\nEstimation\n\nExample 1: JointProbabilities with ValueBinning outcome space\n\n\n\n\n\n","category":"type"},{"location":"associations/#Mutual-informations","page":"Association measures","title":"Mutual informations","text":"","category":"section"},{"location":"associations/","page":"Association measures","title":"Association measures","text":"MutualInformation\nMIShannon\nMITsallisFuruichi\nMITsallisMartin\nMIRenyiJizba\nMIRenyiSarbu","category":"page"},{"location":"associations/#Associations.MutualInformation","page":"Association measures","title":"Associations.MutualInformation","text":"MutualInformation\n\nAbstract type for all mutual information measures.\n\nConcrete implementations\n\nMIShannon\nMITsallisMartin\nMITsallisFuruichi\nMIRenyiJizba\nMIRenyiSarbu\n\nSee also: MutualInformationEstimator\n\n\n\n\n\n","category":"type"},{"location":"associations/#Associations.MIShannon","page":"Association measures","title":"Associations.MIShannon","text":"MIShannon <: BivariateInformationMeasure\nMIShannon(; base = 2)\n\nThe Shannon mutual information I_S(X Y).\n\nUsage\n\nUse with association to compute the raw Shannon mutual information from input data using of of the estimators listed below.\nUse with independence to perform a formal hypothesis test for pairwise dependence using the Shannon mutual information.\n\nCompatible estimators\n\nJointProbabilities (generic)\nEntropyDecomposition (generic)\nKraskovStögbauerGrassberger1\nKraskovStögbauerGrassberger2\nGaoOhViswanath\nGaoKannanOhViswanath\nGaussianMI\n\nDiscrete definition\n\nThere are many equivalent formulations of discrete Shannon mutual information, meaning that it can be estimated in several ways, either using JointProbabilities (double-sum formulation), EntropyDecomposition (three-entropies decomposition), or some dedicated estimator.\n\nDouble sum formulation\n\nAssume we observe samples barbfX_1N_y = barbfX_1 ldots barbfX_n and barbfY_1N_x = barbfY_1 ldots barbfY_n from two discrete random variables X and Y with finite supports mathcalX = x_1 x_2 ldots x_M_x and mathcalY = y_1 y_2 ldots x_M_y. The double-sum estimate is obtained by replacing the double sum\n\nhatI_DS(X Y) =\n sum_x_i in mathcalX y_i in mathcalY p(x_i y_j) log left( dfracp(x_i y_i)p(x_i)p(y_j) right)\n\nwhere hatp(x_i) = fracn(x_i)N_x, hatp(y_i) = fracn(y_j)N_y, and hatp(x_i x_j) = fracn(x_i)N, and N = N_x N_y. This definition is used by association when called with a JointProbabilities estimator.\n\nThree-entropies formulation\n\nAn equivalent formulation of discrete Shannon mutual information is\n\nI^S(X Y) = H^S(X) + H_q^S(Y) - H^S(X Y)\n\nwhere H^S(cdot) and H^S(cdot cdot) are the marginal and joint discrete Shannon entropies. This definition is used by association when called with a EntropyDecomposition estimator and a discretization.\n\nDifferential mutual information\n\nOne possible formulation of differential Shannon mutual information is\n\nI^S(X Y) = h^S(X) + h_q^S(Y) - h^S(X Y)\n\nwhere h^S(cdot) and h^S(cdot cdot) are the marginal and joint differential Shannon entropies. This definition is used by association when called with EntropyDecomposition estimator and a DifferentialInfoEstimator.\n\nEstimation\n\nExample 1: JointProbabilities with ValueBinning outcome space.\nExample 2: JointProbabilities with UniqueElements outcome space on string data.\nExample 3: Dedicated GaussianMI estimator.\nExample 4: Dedicated KraskovStögbauerGrassberger1 estimator.\nExample 5: Dedicated KraskovStögbauerGrassberger2 estimator.\nExample 6: Dedicated GaoKannanOhViswanath estimator.\nExample 7: EntropyDecomposition with Kraskov estimator.\nExample 8: EntropyDecomposition with BubbleSortSwaps.\nExample 9: EntropyDecomposition with Jackknife estimator and ValueBinning outcome space.\nExample 10: Reproducing Kraskov et al. (2004).\n\n\n\n\n\n","category":"type"},{"location":"associations/#Associations.MITsallisFuruichi","page":"Association measures","title":"Associations.MITsallisFuruichi","text":"MITsallisFuruichi <: BivariateInformationMeasure\nMITsallisFuruichi(; base = 2, q = 1.5)\n\nThe discrete Tsallis mutual information from Furuichi (2006)(Furuichi, 2006), which in that paper is called the mutual entropy.\n\nUsage\n\nUse with association to compute the raw Tsallis-Furuichi mutual information from input data using of of the estimators listed below.\nUse with independence to perform a formal hypothesis test for pairwise dependence using the Tsallis-Furuichi mutual information.\n\nCompatible estimators\n\nJointProbabilities\nEntropyDecomposition\n\nDescription\n\nFuruichi's Tsallis mutual entropy between variables X in mathbbR^d_X and Y in mathbbR^d_Y is defined as\n\nI_q^T(X Y) = H_q^T(X) - H_q^T(X Y) = H_q^T(X) + H_q^T(Y) - H_q^T(X Y)\n\nwhere H^T(cdot) and H^T(cdot cdot) are the marginal and joint Tsallis entropies, and q is the Tsallis-parameter.\n\nEstimation\n\nExample 1: JointProbabilities with UniqueElements outcome space.\nExample 2: EntropyDecomposition with LeonenkoProzantoSavani estimator.\nExample 3: EntropyDecomposition with Dispersion\n\n\n\n\n\n","category":"type"},{"location":"associations/#Associations.MITsallisMartin","page":"Association measures","title":"Associations.MITsallisMartin","text":"MITsallisMartin <: BivariateInformationMeasure\nMITsallisMartin(; base = 2, q = 1.5)\n\nThe discrete Tsallis mutual information from Martin et al. (2004).\n\nUsage\n\nUse with association to compute the raw Tsallis-Martin mutual information from input data using of of the estimators listed below.\nUse with independence to perform a formal hypothesis test for pairwise dependence using the Tsallis-Martin mutual information.\n\nCompatible estimators\n\nJointProbabilities\nEntropyDecomposition\n\nDescription\n\nMartin et al.'s Tsallis mutual information between variables X in mathbbR^d_X and Y in mathbbR^d_Y is defined as\n\nI_textMartin^T(X Y q) = H_q^T(X) + H_q^T(Y) - (1 - q) H_q^T(X) H_q^T(Y) - H_q(X Y)\n\nwhere H^S(cdot) and H^S(cdot cdot) are the marginal and joint Shannon entropies, and q is the Tsallis-parameter.\n\nEstimation\n\nExample 1: JointProbabilities with UniqueElements outcome space.\nExample 2: EntropyDecomposition with LeonenkoProzantoSavani estimator.\nExample 3: EntropyDecomposition with OrdinalPatterns outcome space.\n\n\n\n\n\n","category":"type"},{"location":"associations/#Associations.MIRenyiJizba","page":"Association measures","title":"Associations.MIRenyiJizba","text":"MIRenyiJizba <: <: BivariateInformationMeasure\nMIRenyiJizba(; q = 1.5, base = 2)\n\nThe Rényi mutual information I_q^R_J(X Y) defined in (Jizba et al., 2012).\n\nUsage\n\nUse with association to compute the raw Rényi-Jizba mutual information from input data using of of the estimators listed below.\nUse with independence to perform a formal hypothesis test for pairwise dependence using the Rényi-Jizba mutual information.\n\nCompatible estimators\n\nJointProbabilities.\nEntropyDecomposition.\n\nDefinition\n\nI_q^R_J(X Y) = H_q^R(X) + H_q^R(Y) - H_q^R(X Y)\n\nwhere H_q^R(cdot) is the Rényi entropy.\n\nEstimation\n\nExample 1: JointProbabilities with UniqueElements outcome space.\nExample 2: EntropyDecomposition with LeonenkoProzantoSavani.\nExample 3: EntropyDecomposition with ValueBinning.\n\n\n\n\n\n","category":"type"},{"location":"associations/#Associations.MIRenyiSarbu","page":"Association measures","title":"Associations.MIRenyiSarbu","text":"MIRenyiSarbu <: BivariateInformationMeasure\nMIRenyiSarbu(; base = 2, q = 1.5)\n\nThe discrete Rényi mutual information from Sarbu (2014).\n\nUsage\n\nUse with association to compute the raw Rényi-Sarbu mutual information from input data using of of the estimators listed below.\nUse with independence to perform a formal hypothesis test for pairwise dependence using the Rényi-Sarbu mutual information.\n\nCompatible estimators\n\nJointProbabilities.\n\nDescription\n\nSarbu (2014) defines discrete Rényi mutual information as the Rényi alpha-divergence between the conditional joint probability mass function p(x y) and the product of the conditional marginals, p(x) cdot p(y):\n\nI(X Y)^R_q =\ndfrac1q-1\nlog left(\n sum_x in X y in Y\n dfracp(x y)^qleft( p(x)cdot p(y) right)^q-1\nright)\n\nEstimation\n\nExample 1: JointProbabilities with UniqueElements for categorical data.\nExample 2: JointProbabilities with CosineSimilarityBinning for numerical data.\n\n\n\n\n\n","category":"type"},{"location":"associations/#Conditional-mutual-informations","page":"Association measures","title":"Conditional mutual informations","text":"","category":"section"},{"location":"associations/","page":"Association measures","title":"Association measures","text":"ConditionalMutualInformation\nCMIShannon\nCMIRenyiSarbu\nCMIRenyiJizba\nCMIRenyiPoczos\nCMITsallisPapapetrou","category":"page"},{"location":"associations/#Associations.ConditionalMutualInformation","page":"Association measures","title":"Associations.ConditionalMutualInformation","text":"CondiitionalMutualInformation\n\nAbstract type for all mutual information measures.\n\nConcrete implementations\n\nCMIShannon\nCMITsallisPapapetrou\nCMIRenyiJizba\nCMIRenyiSarbu\nCMIRenyiPoczos\n\nSee also: ConditionalMutualInformationEstimator\n\n\n\n\n\n","category":"type"},{"location":"associations/#Associations.CMIShannon","page":"Association measures","title":"Associations.CMIShannon","text":"CMIShannon <: ConditionalMutualInformation\nCMIShannon(; base = 2)\n\nThe Shannon conditional mutual information (CMI) I^S(X Y Z).\n\nUsage\n\nUse with association to compute the raw Shannon conditional mutual information using of of the estimators listed below.\nUse with independence to perform a formal hypothesis test for pairwise conditional independence using the Shannon conditional mutual information.\n\nCompatible estimators\n\nJointProbabilities\nEntropyDecomposition\nMIDecomposition\nFPVP\nMesnerShalizi\nRahimzamani\nPoczosSchneiderCMI\nGaussianCMI\n\nSupported definitions\n\nConsider random variables X in mathbbR^d_X and Y in mathbbR^d_Y, given Z in mathbbR^d_Z. The Shannon conditional mutual information is defined as\n\nbeginalign*\nI(X Y Z)\n= H^S(X Z) + H^S(Y z) - H^S(X Y Z) - H^S(Z) \n= I^S(X Y Z) + I^S(X Y)\nendalign*\n\nwhere I^S(cdot cdot) is the Shannon mutual information MIShannon, and H^S(cdot) is the Shannon entropy.\n\nDifferential Shannon CMI is obtained by replacing the entropies by differential entropies.\n\nEstimation\n\nExample 1: EntropyDecomposition with Kraskov estimator.\nExample 2: EntropyDecomposition with ValueBinning estimator.\nExample 3: MIDecomposition with KraskovStögbauerGrassberger1 estimator.\n\n\n\n\n\n","category":"type"},{"location":"associations/#Associations.CMIRenyiSarbu","page":"Association measures","title":"Associations.CMIRenyiSarbu","text":"CMIRenyiSarbu <: ConditionalMutualInformation\nCMIRenyiSarbu(; base = 2, q = 1.5)\n\nThe Rényi conditional mutual information from Sarbu (2014).\n\nUsage\n\nUse with association to compute the raw Rényi-Sarbu conditional mutual information using of of the estimators listed below.\nUse with independence to perform a formal hypothesis test for pairwise conditional independence using the Rényi-Sarbu conditional mutual information.\n\nCompatible estimators\n\nJointProbabilities\n\nDiscrete description\n\nAssume we observe three discrete random variables X, Y and Z. Sarbu (2014) defines discrete conditional Rényi mutual information as the conditional Rényi alpha-divergence between the conditional joint probability mass function p(x y z) and the product of the conditional marginals, p(x z) cdot p(yz):\n\nI(X Y Z)^R_q =\ndfrac1q-1 sum_z in Z p(Z = z)\nlog left(\n sum_x in Xsum_y in Y\n dfracp(x yz)^qleft( p(xz)cdot p(yz) right)^q-1\nright)\n\n\n\n\n\n","category":"type"},{"location":"associations/#Associations.CMIRenyiJizba","page":"Association measures","title":"Associations.CMIRenyiJizba","text":"CMIRenyiJizba <: ConditionalMutualInformation\nCMIRenyiJizba(; base = 2, q = 1.5)\n\nThe Rényi conditional mutual information I_q^R_J(X Y Z) defined in Jizba et al. (2012).\n\nUsage\n\nUse with association to compute the raw Rényi-Jizba conditional mutual information using of of the estimators listed below.\nUse with independence to perform a formal hypothesis test for pairwise conditional independence using the Rényi-Jizba conditional mutual information.\n\nCompatible estimators\n\nJointProbabilities\nEntropyDecomposition\n\nDefinition\n\nI_q^R_J(X Y Z) = I_q^R_J(X Y Z) - I_q^R_J(X Z)\n\nwhere I_q^R_J(X Z) is the MIRenyiJizba mutual information.\n\nEstimation\n\nExample 1: JointProbabilities with BubbleSortSwaps outcome space.\nExample 2: EntropyDecomposition with OrdinalPatterns outcome space.\nExample 3: EntropyDecomposition with differential entropy estimator LeonenkoProzantoSavani.\n\n\n\n\n\n","category":"type"},{"location":"associations/#Associations.CMIRenyiPoczos","page":"Association measures","title":"Associations.CMIRenyiPoczos","text":"CMIRenyiPoczos <: ConditionalMutualInformation\nCMIRenyiPoczos(; base = 2, q = 1.5)\n\nThe differential Rényi conditional mutual information I_q^R_P(X Y Z) defined in Póczos and Schneider (2012).\n\nUsage\n\nUse with association to compute the raw Rényi-Poczos conditional mutual information using of of the estimators listed below.\nUse with independence to perform a formal hypothesis test for pairwise conditional independence using the Rényi-Poczos conditional mutual information.\n\nCompatible estimators\n\nPoczosSchneiderCMI\n\nDefinition\n\nbeginalign*\nI_q^R_P(X Y Z) = dfrac1q-1\nint int int dfracp_Z(z) p_X Y Z^q( p_XZ(xz) p_YZ(yz) )^q-1 \n= mathbbE_X Y Z sim p_X Y Z\nleft dfracp_X Z^1-q(X Z) p_Y Z^1-q(Y Z) p_X Y Z^1-q(X Y Z) p_Z^1-q(Z) right\nendalign*\n\nEstimation\n\nExample 1: Dedicated PoczosSchneiderCMI estimator.\n\n\n\n\n\n","category":"type"},{"location":"associations/#Associations.CMITsallisPapapetrou","page":"Association measures","title":"Associations.CMITsallisPapapetrou","text":"CMITsallisPapapetrou <: ConditionalMutualInformation\nCMITsallisPapapetrou(; base = 2, q = 1.5)\n\nThe Tsallis-Papapetrou conditional mutual information (Papapetrou and Kugiumtzis, 2020).\n\nUsage\n\nUse with association to compute the raw Tsallis-Papapetrou conditional mutual information using of of the estimators listed below.\nUse with independence to perform a formal hypothesis test for pairwise conditional independence using the Tsallis-Papapetrou conditional mutual information.\n\nCompatible estimators\n\nJointProbabilities\n\nDefinition\n\nTsallis-Papapetrou conditional mutual information is defined as \n\nI_T^q(X Y mid Z) = frac11 - q left( 1 - sum_XYZ fracp(x y z)^qp(x mid z)^q-1 p(y mid z)^q-1 p(z)^q-1 right)\n\n\n\n\n\n","category":"type"},{"location":"associations/#Transfer-entropy","page":"Association measures","title":"Transfer entropy","text":"","category":"section"},{"location":"associations/","page":"Association measures","title":"Association measures","text":"TransferEntropy\nTEShannon\nTERenyiJizba","category":"page"},{"location":"associations/#Associations.TransferEntropy","page":"Association measures","title":"Associations.TransferEntropy","text":"TransferEntropy <: AssociationMeasure\n\nThe supertype of all transfer entropy measures. Concrete subtypes are\n\nTEShannon\nTERenyiJizba\n\n\n\n\n\n","category":"type"},{"location":"associations/#Associations.TEShannon","page":"Association measures","title":"Associations.TEShannon","text":"TEShannon <: TransferEntropy\nTEShannon(; base = 2; embedding = EmbeddingTE()) <: TransferEntropy\n\nThe Shannon-type transfer entropy measure.\n\nUsage\n\nUse with association to compute the raw transfer entropy.\nUse with an IndependenceTest to perform a formal hypothesis test for pairwise and conditional dependence.\n\nDescription\n\nThe transfer entropy from source S to target T, potentially conditioned on C is defined as\n\nbeginalign*\nTE(S to T) = I^S(T^+ S^- T^-) \nTE(S to T C) = I^S(T^+ S^- T^- C^-)\nendalign*\n\nwhere I(T^+ S^- T^-) is the Shannon conditional mutual information (CMIShannon). The - and + subscripts on the marginal variables T^+, T^-, S^- and C^- indicate that the embedding vectors for that marginal are constructed using present/past values and future values, respectively.\n\nEstimation\n\nExample 1: EntropyDecomposition with TransferOperator outcome space.\nExample 2: Estimation using the SymbolicTransferEntropy estimator.\n\n\n\n\n\n","category":"type"},{"location":"associations/#Associations.TERenyiJizba","page":"Association measures","title":"Associations.TERenyiJizba","text":"TERenyiJizba() <: TransferEntropy\n\nThe Rényi transfer entropy from Jizba et al. (2012).\n\nUsage\n\nUse with association to compute the raw transfer entropy.\nUse with an IndependenceTest to perform a formal hypothesis test for pairwise and conditional dependence.\n\nDescription\n\nThe transfer entropy from source S to target T, potentially conditioned on C is defined as\n\nbeginalign*\nTE(S to T) = I_q^R_J(T^+ S^- T^-) \nTE(S to T C) = I_q^R_J(T^+ S^- T^- C^-)\nendalign*\n\nwhere I_q^R_J(T^+ S^- T^-) is Jizba et al. (2012)'s definition of conditional mutual information (CMIRenyiJizba). The - and + subscripts on the marginal variables T^+, T^-, S^- and C^- indicate that the embedding vectors for that marginal are constructed using present/past values and future values, respectively.\n\nEstimation\n\nEstimating Jizba's Rényi transfer entropy is a bit complicated, since it doesn't have a dedicated estimator. Instead, we re-write the Rényi transfer entropy as a Rényi conditional mutual information, and estimate it using an EntropyDecomposition with a suitable discrete/differential Rényi entropy estimator from the list below as its input.\n\nEstimator Sub-estimator Principle\nEntropyDecomposition LeonenkoProzantoSavani Four-entropies decomposition\nEntropyDecomposition ValueBinning Four-entropies decomposition\nEntropyDecomposition Dispersion Four-entropies decomposition\nEntropyDecomposition OrdinalPatterns Four-entropies decomposition\nEntropyDecomposition UniqueElements Four-entropies decomposition\nEntropyDecomposition TransferOperator Four-entropies decomposition\n\nAny of these estimators must be given as input to a `CMIDecomposition estimator.\n\nEstimation\n\nExample 1: EntropyDecomposition with TransferOperator outcome space.\n\n\n\n\n\n","category":"type"},{"location":"associations/","page":"Association measures","title":"Association measures","text":"The following utility functions and types are also useful for transfer entropy estimation.","category":"page"},{"location":"associations/","page":"Association measures","title":"Association measures","text":"optimize_marginals_te\nEmbeddingTE","category":"page"},{"location":"associations/#Associations.optimize_marginals_te","page":"Association measures","title":"Associations.optimize_marginals_te","text":"optimize_marginals_te([scheme = OptimiseTraditional()], s, t, [c]) → EmbeddingTE\n\nOptimize marginal embeddings for transfer entropy computation from source time series s to target time series t, conditioned on c if c is given, using the provided optimization scheme.\n\n\n\n\n\n","category":"function"},{"location":"associations/#Associations.EmbeddingTE","page":"Association measures","title":"Associations.EmbeddingTE","text":"EmbeddingTE(; dS = 1, dT = 1, dTf = 1, dC = 1, τS = -1, τT = -1, ηTf = 1, τC = -1)\nEmbeddingTE(opt::OptimiseTraditional, s, t, [c])\n\nEmbeddingTE provide embedding parameters for transfer entropy analysis using either TEShannon, TERenyiJizba, or in general any subtype of TransferEntropy.\n\nThe second method finds parameters using the \"traditional\" optimised embedding techniques from DynamicalSystems.jl\n\nConvention for generalized delay reconstruction\n\nWe use the following convention. Let s(i) be time series for the source variable, t(i) be the time series for the target variable and c(i) the time series for the conditional variable. To compute transfer entropy, we need the following marginals:\n\nbeginaligned\nT^+ = t(i+eta^1) t(i+eta^2) ldots (t(i+eta^d_T^+) \nT^- = (t(i+tau^0_T) t(i+tau^1_T) t(i+tau^2_T) ldots t(t + tau^d_T - 1_T)) \nS^- = (s(i+tau^0_S) s(i+tau^1_S) s(i+tau^2_S) ldots s(t + tau^d_S - 1_S)) \nC^- = (c(i+tau^0_C) c(i+tau^1_C) c(i+tau^2_C) ldots c(t + tau^d_C - 1_C)) \nendaligned\n\nDepending on the application, the delay reconstruction lags tau^k_T leq 0, tau^k_S leq 0, and tau^k_C leq 0 may be equally spaced, or non-equally spaced. The same applied to the prediction lag(s), but typically only a only a single predictions lag eta^k is used (so that d_T^+ = 1).\n\nFor transfer entropy, traditionally at least one tau^k_T, one tau^k_S and one tau^k_C equals zero. This way, the T^-, S^- and C^- marginals always contains present/past states, while the mathcal T marginal contain future states relative to the other marginals. However, this is not a strict requirement, and modern approaches that searches for optimal embeddings can return embeddings without the intantaneous lag.\n\nCombined, we get the generalized delay reconstruction mathbbE = (T^+_(d_T^+) T^-_(d_T) S^-_(d_S) C^-_(d_C)). Transfer entropy is then computed as\n\nbeginaligned\nTE_S rightarrow T C = int_mathbbE P(T^+ T^- S^- C^-)\nlog_bleft(fracP(T^+ T^- S^- C^-)P(T^+ T^- C^-)right)\nendaligned\n\nor, if conditionals are not relevant,\n\nbeginaligned\nTE_S rightarrow T = int_mathbbE P(T^+ T^- S^-)\nlog_bleft(fracP(T^+ T^- S^-)P(T^+ T^-)right)\nendaligned\n\nHere,\n\nT^+ denotes the d_T^+-dimensional set of vectors furnishing the future states of T (almost always equal to 1 in practical applications),\nT^- denotes the d_T-dimensional set of vectors furnishing the past and present states of T,\nS^- denotes the d_S-dimensional set of vectors furnishing the past and present of S, and\nC^- denotes the d_C-dimensional set of vectors furnishing the past and present of C.\n\nKeyword arguments\n\ndS, dT, dC, dTf (f for future) are the dimensions of the S^-, T^-, C^- and T^+ marginals. The parameters dS, dT, dC and dTf must each be a positive integer number.\nτS, τT, τC are the embedding lags for S^-, T^-, C^-. Each parameter are integers ∈ 𝒩⁰⁻, or a vector of integers ∈ 𝒩⁰⁻, so that S^-, T^-, C^- always represents present/past values. If e.g. τT is an integer, then for the T^- marginal is constructed using lags tau_T = 0 tau 2tau ldots (d_T- 1)tau_T . If is a vector, e.g. τΤ = [-1, -5, -7], then the dimension dT must match the lags, and precisely those lags are used: tau_T = -1 -5 -7 .\nThe prediction lag(s) ηTf is a positive integer. Combined with the requirement that the other delay parameters are zero or negative, this ensures that we're always predicting from past/present to future. In typical applications, ηTf = 1 is used for transfer entropy.\n\nExamples\n\nSay we wanted to compute the Shannon transfer entropy TE^S(S to T) = I^S(T^+ S^- T^-). Using some modern procedure for determining optimal embedding parameters using methods from DynamicalSystems.jl, we find that the optimal embedding of T^- is three-dimensional and is given by the lags [0, -5, -8]. Using the same procedure, we find that the optimal embedding of S^- is two-dimensional with lags -1 -8. We want to predicting a univariate version of the target variable one time step into the future (ηTf = 1). The total embedding is then the set of embedding vectors\n\nE_TE = (T(i+1) S(i-1) S(i-8) T(i) T(i-5) T(i-8)) . Translating this to code, we get:\n\nusing Associations\njulia> EmbeddingTE(dT=3, τT=[0, -5, -8], dS=2, τS=[-1, -4], ηTf=1)\n\n# output\nEmbeddingTE(dS=2, dT=3, dC=1, dTf=1, τS=[-1, -4], τT=[0, -5, -8], τC=-1, ηTf=1)\n\n\n\n\n\n","category":"type"},{"location":"associations/#Partial-mutual-information","page":"Association measures","title":"Partial mutual information","text":"","category":"section"},{"location":"associations/","page":"Association measures","title":"Association measures","text":"PartialMutualInformation","category":"page"},{"location":"associations/#Associations.PartialMutualInformation","page":"Association measures","title":"Associations.PartialMutualInformation","text":"PartialMutualInformation <: MultivariateInformationMeasure\nPartialMutualInformation(; base = 2)\n\nThe partial mutual information (PMI) measure of conditional association (Zhao et al., 2016).\n\nDefinition\n\nPMI is defined as for variables X, Y and Z as\n\nPMI(X Y Z) = D(p(x y z) p^*(xz) p^*(yz) p(z))\n\nwhere p(x y z) is the joint distribution for X, Y and Z, and D(cdot cdot) is the extended Kullback-Leibler divergence from p(x y z) to p^*(xz) p^*(yz) p(z). See Zhao et al. (2016) for details.\n\nEstimation\n\nThe PMI is estimated by first estimating a 3D probability mass function using probabilities, then computing PMI(X Y Z) from those probaiblities.\n\nProperties\n\nFor the discrete case, the following identities hold in theory (when estimating PMI, they may not).\n\nPMI(X, Y, Z) >= CMI(X, Y, Z) (where CMI is the Shannon CMI). Holds in theory, but when estimating PMI, the identity may not hold.\nPMI(X, Y, Z) >= 0. Holds both in theory and when estimating using discrete estimators.\nX ⫫ Y | Z => PMI(X, Y, Z) = CMI(X, Y, Z) = 0 (in theory, but not necessarily for estimation).\n\n\n\n\n\n","category":"type"},{"location":"associations/#correlation_api","page":"Association measures","title":"Correlation measures","text":"","category":"section"},{"location":"associations/","page":"Association measures","title":"Association measures","text":"CorrelationMeasure\nPearsonCorrelation\nPartialCorrelation\nDistanceCorrelation\nChatterjeeCorrelation\nAzadkiaChatterjeeCoefficient","category":"page"},{"location":"associations/#Associations.CorrelationMeasure","page":"Association measures","title":"Associations.CorrelationMeasure","text":"CorrelationMeasure <: AssociationMeasure end\n\nThe supertype for correlation measures.\n\nConcrete implementations\n\nPearsonCorrelation\nPartialCorrelation\nDistanceCorrelation\nChatterjeeCorrelation\nAzadkiaChatterjeeCoefficient\n\n\n\n\n\n","category":"type"},{"location":"associations/#Associations.PearsonCorrelation","page":"Association measures","title":"Associations.PearsonCorrelation","text":"PearsonCorrelation\n\nThe Pearson correlation of two variables.\n\nUsage\n\nUse with association to compute the raw Pearson correlation coefficient.\nUse with independence to perform a formal hypothesis test for pairwise dependence using the Pearson correlation coefficient.\n\nDescription\n\nThe sample Pearson correlation coefficient for real-valued random variables X and Y with associated samples x_i_i=1^N and y_i_i=1^N is defined as\n\nrho_xy = dfracsum_i=1^n (x_i - barx)(y_i - bary) sqrtsum_i=1^N (x_i - barx)^2sqrtsum_i=1^N (y_i - bary)^2\n\nwhere barx and bary are the means of the observations x_k and y_k, respectively.\n\n\n\n\n\n","category":"type"},{"location":"associations/#Associations.PartialCorrelation","page":"Association measures","title":"Associations.PartialCorrelation","text":"PartialCorrelation <: AssociationMeasure\n\nThe correlation of two variables, with the effect of a set of conditioning variables removed.\n\nUsage\n\nUse with association to compute the raw partial correlation coefficient.\nUse with independence to perform a formal hypothesis test for correlated-based conditional independence.\n\nDescription\n\nThere are several ways of estimating the partial correlation. We follow the matrix inversion method, because for StateSpaceSets, we can very efficiently compute the required joint covariance matrix Sigma for the random variables.\n\nFormally, let X_1 X_2 ldots X_n be a set of n real-valued random variables. Consider the joint precision matrix,P = (p_ij) = Sigma^-1. The partial correlation of any pair of variables (X_i X_j), given the remaining variables bfZ = X_k_i=1 i neq i j^n, is defined as\n\nrho_X_i X_j bfZ = -dfracp_ijsqrt p_ii p_jj \n\nIn practice, we compute the estimate\n\nhatrho_X_i X_j bfZ =\n-dfrachatp_ijsqrt hatp_ii hatp_jj \n\nwhere hatP = hatSigma^-1 is the sample precision matrix.\n\n\n\n\n\n","category":"type"},{"location":"associations/#Associations.DistanceCorrelation","page":"Association measures","title":"Associations.DistanceCorrelation","text":"DistanceCorrelation\n\nThe distance correlation (Székely et al., 2007) measure quantifies potentially nonlinear associations between pairs of variables. If applied to three variables, the partial distance correlation (Székely and Rizzo, 2014) is computed.\n\nUsage\n\nUse with association to compute the raw (partial) distance correlation coefficient.\nUse with independence to perform a formal hypothesis test for pairwise dependence.\n\nDescription\n\nThe distance correlation can be used to compute the association between two variables, or the conditional association between three variables, like so:\n\nassociation(DistanceCorrelation(), x, y) → dcor ∈ [0, 1]\nassociation(DistanceCorrelation(), x, y, z) → pdcor\n\nWith two variable, we comptue dcor, which is called the empirical/sample distance correlation (Székely et al., 2007). With three variables, the partial distance correlation pdcor is computed (Székely and Rizzo, 2014).\n\nwarn: Warn\nA partial distance correlation distance_correlation(X, Y, Z) = 0 doesn't always guarantee conditional independence X ⫫ Y | Z. Székely and Rizzo (2014) for an in-depth discussion.\n\n\n\n\n\n","category":"type"},{"location":"associations/#Associations.ChatterjeeCorrelation","page":"Association measures","title":"Associations.ChatterjeeCorrelation","text":"ChatterjeeCorrelation <: CorrelationMeasure\nChatterjeeCorrelation(; handle_ties = true, rng = Random.default_rng())\n\nThe Chatterjee correlation measure (Chatterjee, 2021) is an asymmetric measure of dependence between two variables. \n\ninfo: Speeding up computations\nIf handle_ties == true, then the first formula below is used. If you know for sure that there are no ties in your data, then set handle_ties == false, which will use the second (faster) formula below.\n\nnote: Randomization and reproducibility\nWhen rearranging the input datasets, the second variable y is sorted according to a sorting of the first variable x. If x has ties, then these ties are broken randomly and uniformly. For complete reproducibility in this step, you can specify rng. If x has no ties, then no randomization is performed.\n\nUsage\n\nUse with association to compute the raw Chatterjee correlation coefficient.\nUse with SurrogateAssociationTest to perform a surrogate test for significance of a Chatterjee-type association (example). When using a surrogate test for significance, the first input variable is shuffled according to the given surrogate method.\n\nDescription\n\nThe correlation statistic is defined as\n\nepsilon_n(X Y) = \n1 - dfracnsum_i=1^n-1 r_i+1 - r_i2sum_i=1^n \n\nWhen there are no ties among the Y_1 Y_2 ldots Y_n, the measure is \n\nepsilon_n(X Y) = \n1 - dfrac3sum_i=1^n-1 r_i+1 - r_in^2 - 1\n\nThis statistic estimates a quantity proposed by Dette et al. (2013), as indicated in Shi et al. (2022). It can therefore also be called the Chatterjee-Dette-Siburg-Stoimenov correlation coefficient.\n\nEstimation\n\nExample 1. Estimating the Chatterjee correlation coefficient for independent and for dependent variables. \nExample 2. Testing the significance of a Chatterjee-type association using a surrogate test.\n\n\n\n\n\n","category":"type"},{"location":"associations/#Associations.AzadkiaChatterjeeCoefficient","page":"Association measures","title":"Associations.AzadkiaChatterjeeCoefficient","text":"AzadkiaChatterjeeCoefficient <: AssociationMeasure\nAzadkiaChatterjeeCoefficient(; theiler::Int = 0)\n\nThe Azadkia-Chatterjee coefficient (Azadkia and Chatterjee, 2021) is a coefficient for pairwise and conditional association inspired by the Chatterjee-Dette-Siburg-Stoimenov coefficient (Chatterjee, 2021; Dette et al., 2013) (see ChatterjeeCorrelation).\n\nUsage\n\nUse with association to compute the raw Azadkia-Chatterjee coefficient.\nUse with SurrogateAssociationTest to perform a surrogate test for significance of a pairwise or conditional Azadkia-Chatterjee-type association (example). When using a surrogate test for significance, only the first input variable is shuffled according to the given surrogate method.\nUse with LocalPermutationTest to perform a test of conditional independence (example).\n\nDescription\n\nThe pairwise statistic is \n\nT_n(Y boldsymbolZ boldsymbolX) = dfracsum_i=1^n left( min(R_i R_M_(i)) - min(R_i R_N_(i)) right) sum_i=1^n left(R_i - min(R_i R_N_(i)) right)\n\nwhere R_i is the rank of the point Y_i among all Y_is, and M_(i) and N_(i) are indices of nearest neighbors of the points boldsymbolX_i and (boldsymbolX_i boldsymbolZ_i), respectively (given appropriately constructed marginal spaces). The theiler keyword argument is an integer controlling the number of nearest neighbors to exclude during neighbor searches. The Theiler window defaults to 0, which excludes self-neighbors, and is the only option considered in Azadkia and Chatterjee (2021).\n\nIn the case where boldsymbolX has no components (i.e. we're not conditioning), we also consider L_i as the number of j such that Y_j geq Y_i. The measure is then defined as \n\nT_n(Y boldsymbolZ) = \ndfracsum_i=1^n left( n min(R_i R_M_(i)) - L_i^2 right) sum_i=1^n left( L_i (n - L_i) right)\n\nThe value of the coefficient is on [0, 1] when the number of samples goes to ∞, but is not restricted to this interval in practice. \n\nInput data\n\nIf the input data contain duplicate points, consider adding a small magnitude of noise to the input data. Otherwise, errors will occur when locating nearest neighbors.\n\nEstimation\n\nExample 1. Estimating the Azadkia-Chatterjee coefficient to quantify associations for a chain of unidirectionally coupled variables, showcasing both pairwise and conditional associations.\nExample 2. Using SurrogateAssociationTest in combination with the Azadkia-Chatterjee coefficient to quantify significance of pairwise and conditional associations.\nExample 3. Using LocalPermutationTest in combination with the Azadkia-Chatterjee coefficient to perform a test for conditional independence.\n\n\n\n\n\n","category":"type"},{"location":"associations/#cross_map_api","page":"Association measures","title":"Cross-map measures","text":"","category":"section"},{"location":"associations/","page":"Association measures","title":"Association measures","text":"The cross-map measures define different ways of quantifying association based on the concept of \"cross mapping\", which has appeared in many contexts in the literature, and gained huge popularity with Sugihara et al. (2012)'s on convergent cross mapping.","category":"page"},{"location":"associations/","page":"Association measures","title":"Association measures","text":"Since their paper, several cross mapping methods and frameworks have emerged in the literature. In Associations.jl, we provide a unified interface for using these cross mapping methods.","category":"page"},{"location":"associations/","page":"Association measures","title":"Association measures","text":"CrossmapMeasure\nConvergentCrossMapping\nPairwiseAsymmetricInference","category":"page"},{"location":"associations/#Associations.CrossmapMeasure","page":"Association measures","title":"Associations.CrossmapMeasure","text":"CrossmapMeasure <: AssociationMeasure\n\nThe supertype for all cross-map measures. Concrete subtypes are\n\nConvergentCrossMapping, or CCM for short.\nPairwiseAsymmetricInference, or PAI for short.\n\nSee also: CrossmapEstimator.\n\n\n\n\n\n","category":"type"},{"location":"associations/#Associations.ConvergentCrossMapping","page":"Association measures","title":"Associations.ConvergentCrossMapping","text":"ConvergentCrossMapping <: CrossmapMeasure\nConvergentCrossMapping(; d::Int = 2, τ::Int = -1, w::Int = 0,\n f = Statistics.cor, embed_warn = true)\n\nThe convergent cross mapping measure (Sugihara et al., 2012).\n\nUsage\n\nUse with association together with a CrossmapEstimator to compute the cross-map correlation between input variables.\n\nCompatible estimators\n\nRandomSegment\nRandomVectors\nExpandingSegment\n\nDescription\n\nThe Theiler window w controls how many temporal neighbors are excluded during neighbor searches (w = 0 means that only the point itself is excluded). f is a function that computes the agreement between observations and predictions (the default, f = Statistics.cor, gives the Pearson correlation coefficient).\n\nEmbedding\n\nLet S(i) be the source time series variable and T(i) be the target time series variable. This version produces regular embeddings with fixed dimension d and embedding lag τ as follows:\n\n( S(i) S(i+tau) S(i+2tau) ldots S(i+(d-1)tau T(i))_i=1^N-(d-1)tau\n\nIn this joint embedding, neighbor searches are performed in the subspace spanned by the first D-1 variables, while the last (D-th) variable is to be predicted.\n\nWith this convention, τ < 0 implies \"past/present values of source used to predict target\", and τ > 0 implies \"future/present values of source used to predict target\". The latter case may not be meaningful for many applications, so by default, a warning will be given if τ > 0 (embed_warn = false turns off warnings).\n\nEstimation\n\nExample 1. Estimation with RandomVectors estimator.\nExample 2. Estimation with RandomSegment estimator.\nExample 3: Reproducing figures from Sugihara et al. (2012).\n\n\n\n\n\n","category":"type"},{"location":"associations/#Associations.PairwiseAsymmetricInference","page":"Association measures","title":"Associations.PairwiseAsymmetricInference","text":"PairwiseAsymmetricInference <: CrossmapMeasure\nPairwiseAsymmetricInference(; d::Int = 2, τ::Int = -1, w::Int = 0,\n f = Statistics.cor, embed_warn = true)\n\nThe pairwise asymmetric inference (PAI) measure (McCracken and Weigel, 2014) is a version of ConvergentCrossMapping that searches for neighbors in mixed embeddings (i.e. both source and target variables included); otherwise, the algorithms are identical.\n\nUsage\n\nUse with association to compute the pairwise asymmetric inference measure between variables.\n\nCompatible estimators\n\nRandomSegment\nRandomVectors\nExpandingSegment\n\nDescription\n\nThe Theiler window w controls how many temporal neighbors are excluded during neighbor searches (w = 0 means that only the point itself is excluded). f is a function that computes the agreement between observations and predictions (the default, f = Statistics.cor, gives the Pearson correlation coefficient).\n\nEmbedding\n\nThere are many possible ways of defining the embedding for PAI. Currently, we only implement the \"add one non-lagged source timeseries to an embedding of the target\" approach, which is used as an example in McCracken & Weigel's paper. Specifically: Let S(i) be the source time series variable and T(i) be the target time series variable. PairwiseAsymmetricInference produces regular embeddings with fixed dimension d and embedding lag τ as follows:\n\n(S(i) T(i+(d-1)tau ldots T(i+2tau) T(i+tau) T(i)))_i=1^N-(d-1)tau\n\nIn this joint embedding, neighbor searches are performed in the subspace spanned by the first D variables, while the last variable is to be predicted.\n\nWith this convention, τ < 0 implies \"past/present values of source used to predict target\", and τ > 0 implies \"future/present values of source used to predict target\". The latter case may not be meaningful for many applications, so by default, a warning will be given if τ > 0 (embed_warn = false turns off warnings).\n\nEstimation\n\nExample 1. Estimation with RandomVectors estimator.\nExample 2. Estimation with RandomSegment estimator.\nExample 3. Reproducing McCracken & Weigel's results from the original paper.\n\n\n\n\n\n","category":"type"},{"location":"associations/#closeness_api","page":"Association measures","title":"Closeness measures","text":"","category":"section"},{"location":"associations/","page":"Association measures","title":"Association measures","text":"ClosenessMeasure\nJointDistanceDistribution\nSMeasure\nHMeasure\nMMeasure\nLMeasure","category":"page"},{"location":"associations/#Associations.ClosenessMeasure","page":"Association measures","title":"Associations.ClosenessMeasure","text":"ClosenessMeasure <: AssociationMeasure\n\nThe supertype for all multivariate information-based measure definitions.\n\nImplementations\n\nJointDistanceDistribution\nSMeasure\nHMeasure\nMMeasure\nLMeasure\n\n\n\n\n\n","category":"type"},{"location":"associations/#Associations.JointDistanceDistribution","page":"Association measures","title":"Associations.JointDistanceDistribution","text":"JointDistanceDistribution <: AssociationMeasure end\nJointDistanceDistribution(; metric = Euclidean(), B = 10, D = 2, τ = -1, μ = 0.0)\n\nThe joint distance distribution (JDD) measure (Amigó and Hirata, 2018).\n\nUsage\n\nUse with association to compute the joint distance distribution measure Δ from Amigó and Hirata (2018).\nUse with independence to perform a formal hypothesis test for directional dependence.\n\nKeyword arguments\n\ndistance_metric::Metric: An instance of a valid distance metric from Distances.jl. Defaults to Euclidean().\nB::Int: The number of equidistant subintervals to divide the interval [0, 1] into when comparing the normalised distances.\nD::Int: Embedding dimension.\nτ::Int: Embedding delay. By convention, τ is negative.\nμ: The hypothetical mean value of the joint distance distribution if there is no coupling between x and y (default is μ = 0.0).\n\nDescription\n\nFrom input time series x(t) and y(t), we first construct the delay embeddings (note the positive sign in the embedding lags; therefore the input parameter τ is by convention negative).\n\nbeginalign*\nbfx_i = (x_i x_i+tau ldots x_i+(d_x - 1)tau) \nbfy_i = (y_i y_i+tau ldots y_i+(d_y - 1)tau) \nendalign*\n\nThe algorithm then proceeds to analyze the distribution of distances between points of these embeddings, as described in Amigó and Hirata (2018).\n\nExamples\n\nIndependence testing using JDD\n\n\n\n\n\n","category":"type"},{"location":"associations/#Associations.SMeasure","page":"Association measures","title":"Associations.SMeasure","text":"SMeasure < ClosenessMeasure\nSMeasure(; K::Int = 2, dx = 2, dy = 2, τx = - 1, τy = -1, w = 0)\n\nSMeasure is a bivariate association measure from Arnhold et al. (1999) and Quiroga et al. (2000) that measure directional dependence between two input (potentially multivariate) time series.\n\nNote that τx and τy are negative; see explanation below.\n\nUsage\n\nUse with association to compute the raw s-measure statistic.\nUse with independence to perform a formal hypothesis test for directional dependence.\n\nDescription\n\nThe steps of the algorithm are:\n\nFrom input time series x(t) and y(t), construct the delay embeddings (note the positive sign in the embedding lags; therefore inputs parameters τx and τy are by convention negative).\n\nbeginalign*\nbfx_i = (x_i x_i+tau_x ldots x_i+(d_x - 1)tau_x) \nbfy_i = (y_i y_i+tau_y ldots y_i+(d_y - 1)tau_y) \nendalign*\n\nLet r_ij and s_ij be the indices of the K-th nearest neighbors of bfx_i and bfy_i, respectively. Neighbors closed than w time indices are excluded during searches (i.e. w is the Theiler window).\nCompute the the mean squared Euclidean distance to the K nearest neighbors for each x_i, using the indices r_i j.\n\nR_i^(k)(x) = dfrac1k sum_i=1^k(bfx_i bfx_r_ij)^2\n\nCompute the y-conditioned mean squared Euclidean distance to the K nearest neighbors for each x_i, now using the indices s_ij.\n\nR_i^(k)(xy) = dfrac1k sum_i=1^k(bfx_i bfx_s_ij)^2\n\nDefine the following measure of independence, where 0 leq S leq 1, and low values indicate independence and values close to one occur for synchronized signals.\n\nS^(k)(xy) = dfrac1N sum_i=1^N dfracR_i^(k)(x)R_i^(k)(xy)\n\nInput data\n\nThe algorithm is slightly modified from (Arnhold et al., 1999) to allow univariate timeseries as input.\n\nIf x and y are StateSpaceSets then use x and y as is and ignore the parameters dx/τx and dy/τy.\nIf x and y are scalar time series, then create dx and dy dimensional embeddings, respectively, of both x and y, resulting in N different m-dimensional embedding points X = x_1 x_2 ldots x_N and Y = y_1 y_2 ldots y_N . τx and τy control the embedding lags for x and y.\nIf x is a scalar-valued vector and y is a StateSpaceSet, or vice versa, then create an embedding of the scalar timeseries using parameters dx/τx or dy/τy.\n\nIn all three cases, input StateSpaceSets are length-matched by eliminating points at the end of the longest StateSpaceSet (after the embedding step, if relevant) before analysis.\n\nSee also: ClosenessMeasure.\n\n\n\n\n\n","category":"type"},{"location":"associations/#Associations.HMeasure","page":"Association measures","title":"Associations.HMeasure","text":"HMeasure <: AssociationMeasure\nHMeasure(; K::Int = 2, dx = 2, dy = 2, τx = - 1, τy = -1, w = 0)\n\nThe HMeasure (Arnhold et al., 1999) is a pairwise association measure. It quantifies the probability with which close state of a target timeseries/embedding are mapped to close states of a source timeseries/embedding.\n\nNote that τx and τy are negative by convention. See docstring for SMeasure for an explanation.\n\nUsage\n\nUse with association to compute the raw h-measure statistic.\nUse with independence to perform a formal hypothesis test for directional dependence.\n\nDescription\n\nThe HMeasure (Arnhold et al., 1999) is similar to the SMeasure, but the numerator of the formula is replaced by R_i(x), the mean squared Euclidean distance to all other points, and there is a log-term inside the sum:\n\nH^(k)(xy) = dfrac1N sum_i=1^N\nlog left( dfracR_i(x)R_i^(k)(xy) right)\n\nParameters are the same and R_i^(k)(xy) is computed as for SMeasure.\n\nSee also: ClosenessMeasure.\n\n\n\n\n\n","category":"type"},{"location":"associations/#Associations.MMeasure","page":"Association measures","title":"Associations.MMeasure","text":"MMeasure <: ClosenessMeasure\nMMeasure(; K::Int = 2, dx = 2, dy = 2, τx = - 1, τy = -1, w = 0)\n\nThe MMeasure (Andrzejak et al., 2003) is a pairwise association measure. It quantifies the probability with which close state of a target timeseries/embedding are mapped to close states of a source timeseries/embedding.\n\nNote that τx and τy are negative by convention. See docstring for SMeasure for an explanation.\n\nUsage\n\nUse with association to compute the raw m-measure statistic.\nUse with independence to perform a formal hypothesis test for directional dependence.\n\nDescription\n\nThe MMeasure is based on SMeasure and HMeasure. It is given by\n\nM^(k)(xy) = dfrac1N sum_i=1^N\nlog left( dfracR_i(x) - R_i^(k)(xy)R_i(x) - R_i^k(x) right)\n\nwhere R_i(x) is computed as for HMeasure, while R_i^k(x) and R_i^(k)(xy) is computed as for SMeasure. Parameters also have the same meaning as for SMeasure/HMeasure.\n\nSee also: ClosenessMeasure.\n\n\n\n\n\n","category":"type"},{"location":"associations/#Associations.LMeasure","page":"Association measures","title":"Associations.LMeasure","text":"LMeasure <: ClosenessMeasure\nLMeasure(; K::Int = 2, dx = 2, dy = 2, τx = - 1, τy = -1, w = 0)\n\nThe LMeasure (Chicharro and Andrzejak, 2009) is a pairwise association measure. It quantifies the probability with which close state of a target timeseries/embedding are mapped to close states of a source timeseries/embedding.\n\nNote that τx and τy are negative by convention. See docstring for SMeasure for an explanation.\n\nUsage\n\nUse with association to compute the raw L-measure statistic.\nUse with independence to perform a formal hypothesis test for directional dependence.\n\nDescription\n\nLMeasure is similar to MMeasure, but uses distance ranks instead of the raw distances.\n\nLet bfx_i be an embedding vector, and let g_ij denote the rank that the distance between bfx_i and some other vector bfx_j in a sorted ascending list of distances between bfx_i and bfx_i neq j In other words, g_ij this is just the N-1 nearest neighbor distances sorted )\n\nLMeasure is then defined as\n\nL^(k)(xy) = dfrac1N sum_i=1^N\nlog left( dfracG_i(x) - G_i^(k)(xy)G_i(x) - G_i^k(x) right)\n\nwhere G_i(x) = fracN2 and G_i^K(x) = frack+12 are the mean and minimal rank, respectively.\n\nThe y-conditioned mean rank is defined as\n\nG_i^(k)(xy) = dfrac1Ksum_j=1^K g_iw_i j\n\nwhere w_ij is the index of the j-th nearest neighbor of bfy_i.\n\nSee also: ClosenessMeasure.\n\n\n\n\n\n","category":"type"},{"location":"associations/#Recurrence-measures","page":"Association measures","title":"Recurrence measures","text":"","category":"section"},{"location":"associations/","page":"Association measures","title":"Association measures","text":"MCR\nRMCD","category":"page"},{"location":"associations/#Associations.MCR","page":"Association measures","title":"Associations.MCR","text":"MCR <: AssociationMeasure\nMCR(; r, metric = Euclidean())\n\nAn association measure based on mean conditional probabilities of recurrence (MCR) introduced by Romano et al. (2007).\n\nUsage\n\nUse with association to compute the raw MCR for pairwise or conditional association.\nUse with IndependenceTest to perform a formal hypothesis test for pairwise or conditional association.\n\nDescription\n\nr is mandatory keyword which specifies the recurrence threshold when constructing recurrence matrices. It can be instance of any subtype of AbstractRecurrenceType from RecurrenceAnalysis.jl. To use any r that is not a real number, you have to do using RecurrenceAnalysis first. The metric is any valid metric from Distances.jl.\n\nFor input variables X and Y, the conditional probability of recurrence is defined as\n\nM(X Y) = dfrac1N sum_i=1^N p(bfy_i bfx_i) =\ndfrac1N sum_i=1^N dfracsum_i=1^N J_R_i j^X Ysum_i=1^N R_i j^X\n\nwhere R_i j^X is the recurrence matrix and J_R_i j^X Y is the joint recurrence matrix, constructed using the given metric. The measure M(Y X) is defined analogously.\n\nRomano et al. (2007)'s interpretation of this quantity is that if X drives Y, then M(X|Y) > M(Y|X), if Y drives X, then M(Y|X) > M(X|Y), and if coupling is symmetric, then M(Y|X) = M(X|Y).\n\nInput data\n\nX and Y can be either both univariate timeseries, or both multivariate StateSpaceSets.\n\nEstimation\n\nExample 1. Pairwise versus conditional MCR.\n\n\n\n\n\n","category":"type"},{"location":"associations/#Associations.RMCD","page":"Association measures","title":"Associations.RMCD","text":"RMCD <: AssociationMeasure\nRMCD(; r, metric = Euclidean(), base = 2)\n\nThe recurrence measure of conditional dependence, or RMCD (Ramos et al., 2017), is a recurrence-based measure that mimics the conditional mutual information, but uses recurrence probabilities.\n\nUsage\n\nUse with association to compute the raw RMCD for pairwise or conditional association.\nUse with IndependenceTest to perform a formal hypothesis test for pairwise or conditional association.\n\nDescription\n\nr is a mandatory keyword which specifies the recurrence threshold when constructing recurrence matrices. It can be instance of any subtype of AbstractRecurrenceType from RecurrenceAnalysis.jl. To use any r that is not a real number, you have to do using RecurrenceAnalysis first. The metric is any valid metric from Distances.jl.\n\nBoth the pairwise and conditional RMCD is non-negative, but due to round-off error, negative values may occur. If that happens, an RMCD value of 0.0 is returned.\n\nDescription\n\nThe RMCD measure is defined by\n\nI_RMCD(X Y Z) = dfrac1N\nsum_i left\ndfrac1N sum_j R_ij^X Y Z\nlog left(\n dfracsum_j R_ij^X Y Z sum_j R_ij^Z sum_j sum_j R_ij^X Z sum_j sum_j R_ij^Y Z\n right)\nright\n\nwhere base controls the base of the logarithm. I_RMCD(X Y Z) is zero when Z = X, Z = Y or when X, Y and Z are mutually independent.\n\nOur implementation allows dropping the third/last argument, in which case the following mutual information-like quantitity is computed (not discussed in Ramos et al. (2017).\n\nI_RMCD(X Y) = dfrac1N\nsum_i left\ndfrac1N sum_j R_ij^X Y\nlog left(\n dfracsum_j R_ij^X R_ij^Y sum_j R_ij^X Y\n right)\nright\n\nEstimation\n\nExample 1. Pairwise versus conditional RMCD.\n\n\n\n\n\n","category":"type"},{"location":"api/counts_and_probabilities_api/","page":"Multivariate counts and probabilities API","title":"Multivariate counts and probabilities API","text":"CollapsedDocStrings = true","category":"page"},{"location":"api/counts_and_probabilities_api/#counts_and_probabilities_api","page":"Multivariate counts and probabilities API","title":"Multivariate counts and probabilities API","text":"","category":"section"},{"location":"api/counts_and_probabilities_api/","page":"Multivariate counts and probabilities API","title":"Multivariate counts and probabilities API","text":"For counting and probabilities, Associations.jl extends the single-variable machinery in ComplexityMeasures.jl to multiple variables.","category":"page"},{"location":"api/counts_and_probabilities_api/","page":"Multivariate counts and probabilities API","title":"Multivariate counts and probabilities API","text":"Associations.Counts\nAssociations.counts(::OutcomeSpace)","category":"page"},{"location":"api/counts_and_probabilities_api/#ComplexityMeasures.Counts","page":"Multivariate counts and probabilities API","title":"ComplexityMeasures.Counts","text":"Counts <: Array{<:Integer, N}\nCounts(counts [, outcomes [, dimlabels]]) → c\n\nCounts stores an N-dimensional array of integer counts corresponding to a set of outcomes. This is typically called a \"frequency table\" or \"contingency table\".\n\nIf c isa Counts, then c.outcomes[i] is an abstract vector containing the outcomes along the i-th dimension, where c[i][j] is the count corresponding to the outcome c.outcomes[i][j], and c.dimlabels[i] is the label of the i-th dimension. Both labels and outcomes are assigned automatically if not given. c itself can be manipulated and iterated over like its stored array.\n\n\n\n\n\n","category":"type"},{"location":"api/counts_and_probabilities_api/#ComplexityMeasures.counts-Tuple{OutcomeSpace}","page":"Multivariate counts and probabilities API","title":"ComplexityMeasures.counts","text":"counts(o::UniqueElements, x₁, x₂, ..., xₙ) → Counts{N}\ncounts(encoding::CodifyPoints, x₁, x₂, ..., xₙ) → Counts{N}\ncounts(encoding::CodifyVariables, x₁, x₂, ..., xₙ) → Counts{N}\n\nConstruct an N-dimensional contingency table from the input iterables x₁, x₂, ..., xₙ which are such that length(x₁) == length(x₂) == ⋯ == length(xₙ).\n\nIf x₁, x₂, ..., xₙ are already discrete, then use UniqueElements as the first argument to directly construct the joint contingency table.\n\nIf x₁, x₂, ..., xₙ need to be discretized, provide as the first argument\n\nCodifyPoints (encodes every point in each of the input variables xᵢs individually)\nCodifyVariables (encodes every xᵢ individually using a sliding window encoding). NB: If using different OutcomeSpaces for the different xᵢ, then total_outcomes must be the same for every outcome space.\n\nExamples\n\n# Discretizing some non-discrete data using a sliding-window encoding for each variable\nx, y = rand(100), rand(100)\nc = CodifyVariables(OrdinalPatterns(m = 4))\ncounts(c, x, y)\n\n# Discretizing the data by binning each individual data point\nbinning = RectangularBinning(3)\nencoding = RectangularBinEncoding(binning, [x; y]) # give input values to ensure binning covers all data\nc = CodifyPoints(encoding)\ncounts(c, x, y)\n\n# Counts table for already discrete data\nn = 50 # all variables must have the same number of elements\nx = rand([\"dog\", \"cat\", \"mouse\"], n)\ny = rand(1:3, n)\nz = rand([(1, 2), (2, 1)], n)\n\ncounts(UniqueElements(), x, y, z)\n\nSee also: CodifyPoints, CodifyVariables, UniqueElements, OutcomeSpace, probabilities.\n\n\n\n\n\n","category":"method"},{"location":"api/counts_and_probabilities_api/","page":"Multivariate counts and probabilities API","title":"Multivariate counts and probabilities API","text":"Associations.Probabilities\nAssociations.probabilities(::OutcomeSpace)","category":"page"},{"location":"api/counts_and_probabilities_api/#ComplexityMeasures.Probabilities","page":"Multivariate counts and probabilities API","title":"ComplexityMeasures.Probabilities","text":"Probabilities <: Array{<:AbstractFloat, N}\nProbabilities(probs::Array [, outcomes [, dimlabels]]) → p\nProbabilities(counts::Counts [, outcomes [, dimlabels]]) → p\n\nProbabilities stores an N-dimensional array of probabilities, while ensuring that the array sums to 1 (normalized probability mass). In most cases the array is a standard vector. p itself can be manipulated and iterated over, just like its stored array.\n\nThe probabilities correspond to outcomes that describe the axes of the array. If p isa Probabilities, then p.outcomes[i] is an an abstract vector containing the outcomes along the i-th dimension. The outcomes have the same ordering as the probabilities, so that p[i][j] is the probability for outcome p.outcomes[i][j]. The dimensions of the array are named, and can be accessed by p.dimlabels, where p.dimlabels[i] is the label of the i-th dimension. Both outcomes and dimlabels are assigned automatically if not given. If the input is a set of Counts, and outcomes and dimlabels are not given, then the labels and outcomes are inherited from the counts.\n\nExamples\n\njulia> probs = [0.2, 0.2, 0.2, 0.2]; Probabilities(probs) # will be normalized to sum to 1\n Probabilities{Float64,1} over 4 outcomes\n Outcome(1) 0.25\n Outcome(2) 0.25\n Outcome(3) 0.25\n Outcome(4) 0.25\n\njulia> c = Counts([12, 16, 12], [\"out1\", \"out2\", \"out3\"]); Probabilities(c)\n Probabilities{Float64,1} over 3 outcomes\n \"out1\" 0.3\n \"out2\" 0.4\n \"out3\" 0.3\n\n\n\n\n\n","category":"type"},{"location":"api/counts_and_probabilities_api/#ComplexityMeasures.probabilities-Tuple{OutcomeSpace}","page":"Multivariate counts and probabilities API","title":"ComplexityMeasures.probabilities","text":"probabilities(o::UniqueElements, x₁, x₂, ..., xₙ) → Counts{N}\nprobabilities(encoding::CodifyPoints, x₁, x₂, ..., xₙ) → Counts{N}\nprobabilities(encoding::CodifyVariables, x₁, x₂, ..., xₙ) → Counts{N}\n\nConstruct an N-dimensional Probabilities array from the input iterables x₁, x₂, ..., xₙ which are such that length(x₁) == length(x₂) == ⋯ == length(xₙ).\n\nDescription\n\nProbabilities are computed by first constructing a joint contingency matrix in the form of a Counts instance. \n\nIf x₁, x₂, ..., xₙ are already discrete, then use UniqueElements as the first argument to directly construct the joint contingency table.\n\nIf x₁, x₂, ..., xₙ need to be discretized, provide as the first argument\n\nCodifyPoints (encodes every point in each of the input variables xᵢs individually)\nCodifyVariables (encodes every xᵢ individually using a sliding window encoding).\n\nExamples\n\n# Discretizing some non-discrete data using a sliding-window encoding for each variable\nx, y = rand(100), rand(100)\nc = CodifyVariables(OrdinalPatterns(m = 4))\nprobabilities(c, x, y)\n\n# Discretizing the data by binning each individual data point\nbinning = RectangularBinning(3)\nencoding = RectangularBinEncoding(binning, [x; y]) # give input values to ensure binning covers all data\nc = CodifyPoints(encoding)\nprobabilities(c, x, y)\n\n# Joint probabilities for already discretized data\nn = 50 # all variables must have the same number of elements\nx = rand([\"dog\", \"cat\", \"mouse\"], n)\ny = rand(1:3, n)\nz = rand([(1, 2), (2, 1)], n)\n\nprobabilities(UniqueElements(), x, y, z)\n\nSee also: CodifyPoints, CodifyVariables, UniqueElements, OutcomeSpace.\n\n\n\n\n\n","category":"method"},{"location":"api/counts_and_probabilities_api/","page":"Multivariate counts and probabilities API","title":"Multivariate counts and probabilities API","text":"The utility function marginal is also useful.","category":"page"},{"location":"api/counts_and_probabilities_api/","page":"Multivariate counts and probabilities API","title":"Multivariate counts and probabilities API","text":"marginal","category":"page"},{"location":"api/counts_and_probabilities_api/#Associations.marginal","page":"Multivariate counts and probabilities API","title":"Associations.marginal","text":"marginal(p::Probabilities; dims = 1:ndims(p))\nmarginal(c::Counts; dims = 1:ndims(p))\n\nGiven a set of counts c (a contingency table), or a multivariate probability mass function p, return the marginal counts/probabilities along the given dims.\n\n\n\n\n\n","category":"function"},{"location":"api/counts_and_probabilities_api/#tutorial_probabilities","page":"Multivariate counts and probabilities API","title":"Example: estimating Counts and Probabilities","text":"","category":"section"},{"location":"api/counts_and_probabilities_api/","page":"Multivariate counts and probabilities API","title":"Multivariate counts and probabilities API","text":"Estimating multivariate counts (contingency matrices) and PMFs is simple. If the data are pre-discretized, then we can use UniqueElements to simply count the number of occurrences.","category":"page"},{"location":"api/counts_and_probabilities_api/","page":"Multivariate counts and probabilities API","title":"Multivariate counts and probabilities API","text":"using Associations\nn = 50 # the number of samples must be the same for each input variable\nx = rand([\"dog\", \"cat\", \"snake\"], n)\ny = rand(1:4, n)\nz = rand([(2, 1), (0, 0), (1, 1)], n)\ndiscretization = CodifyVariables(UniqueElements())\ncounts(discretization, x, y, z)","category":"page"},{"location":"api/counts_and_probabilities_api/","page":"Multivariate counts and probabilities API","title":"Multivariate counts and probabilities API","text":"Probabilities are computed analogously, except counts are normalized to sum to 1.","category":"page"},{"location":"api/counts_and_probabilities_api/","page":"Multivariate counts and probabilities API","title":"Multivariate counts and probabilities API","text":"discretization = CodifyVariables(UniqueElements())\nprobabilities(discretization, x, y, z)","category":"page"},{"location":"api/counts_and_probabilities_api/","page":"Multivariate counts and probabilities API","title":"Multivariate counts and probabilities API","text":"For numerical data, we can estimate both counts and probabilities using CodifyVariables with any count-based OutcomeSpace.","category":"page"},{"location":"api/counts_and_probabilities_api/","page":"Multivariate counts and probabilities API","title":"Multivariate counts and probabilities API","text":"using Associations\nx, y = rand(100), rand(100)\ndiscretization = CodifyVariables(BubbleSortSwaps(m = 4))\nprobabilities(discretization, x, y)","category":"page"},{"location":"api/counts_and_probabilities_api/","page":"Multivariate counts and probabilities API","title":"Multivariate counts and probabilities API","text":"For more fine-grained control, we can use CodifyPoints with one or several Encodings.","category":"page"},{"location":"api/counts_and_probabilities_api/","page":"Multivariate counts and probabilities API","title":"Multivariate counts and probabilities API","text":"using Associations\nx, y = StateSpaceSet(rand(1000, 2)), StateSpaceSet(rand(1000, 3))\n\n # min/max of the `rand` call is 0 and 1\nprecise = true # precise bin edges\nr = range(0, 1; length = 3)\nbinning = FixedRectangularBinning(r, dimension(x), precise)\nencoding_x = RectangularBinEncoding(binning, x)\nencoding_y = CombinationEncoding(RelativeMeanEncoding(0.0, 1, n = 2), OrdinalPatternEncoding(3))\ndiscretization = CodifyPoints(encoding_x, encoding_y)\n\n# now estimate probabilities\nprobabilities(discretization, x, y)","category":"page"},{"location":"examples/examples_associations/#examples_associations","page":"Associations","title":"Examples of association measure estimation","text":"","category":"section"},{"location":"examples/examples_associations/#[HellingerDistance](@ref)","page":"Associations","title":"HellingerDistance","text":"","category":"section"},{"location":"examples/examples_associations/#example_HellingerDistance_precomputed_probabilities","page":"Associations","title":"From precomputed probabilities","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\n# From pre-computed PMFs\np1 = Probabilities([0.1, 0.5, 0.2, 0.2])\np2 = Probabilities([0.3, 0.3, 0.2, 0.2])\nassociation(HellingerDistance(), p1, p2)","category":"page"},{"location":"examples/examples_associations/#example_HellingerDistance_JointProbabilities_OrdinalPatterns","page":"Associations","title":"JointProbabilities + OrdinalPatterns","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"We expect the Hellinger distance between two uncorrelated variables to be close to zero.","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Random; rng = Xoshiro(1234)\nn = 100000\nx, y = rand(rng, n), rand(rng, n)\nest = JointProbabilities(HellingerDistance(), CodifyVariables(OrdinalPatterns(m=3)))\ndiv_hd = association(est, x, y) # pretty close to zero","category":"page"},{"location":"examples/examples_associations/#[KLDivergence](@ref)","page":"Associations","title":"KLDivergence","text":"","category":"section"},{"location":"examples/examples_associations/#example_KLDivergence_precomputed_probabilities","page":"Associations","title":"From precomputed probabilities","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\n# From pre-computed PMFs\np1 = Probabilities([0.1, 0.5, 0.2, 0.2])\np2 = Probabilities([0.3, 0.3, 0.2, 0.2])\nassociation(KLDivergence(), p1, p2)","category":"page"},{"location":"examples/examples_associations/#example_KLDivergence_JointProbabilities_OrdinalPatterns","page":"Associations","title":"JointProbabilities + OrdinalPatterns","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"We expect the KLDivergence between two uncorrelated variables to be close to zero.","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Random; rng = Xoshiro(1234)\nn = 100000\nx, y = rand(rng, n), rand(rng, n)\nest = JointProbabilities(KLDivergence(), CodifyVariables(OrdinalPatterns(m=3)))\ndiv_hd = association(est, x, y) # pretty close to zero","category":"page"},{"location":"examples/examples_associations/#[RenyiDivergence](@ref)","page":"Associations","title":"RenyiDivergence","text":"","category":"section"},{"location":"examples/examples_associations/#example_RenyiDivergence_precomputed_probabilities","page":"Associations","title":"From precomputed probabilities","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\n# From pre-computed PMFs\np1 = Probabilities([0.1, 0.5, 0.2, 0.2])\np2 = Probabilities([0.3, 0.3, 0.2, 0.2])\nassociation(RenyiDivergence(), p1, p2)","category":"page"},{"location":"examples/examples_associations/#example_RenyiDivergence_JointProbabilities_OrdinalPatterns","page":"Associations","title":"JointProbabilities + OrdinalPatterns","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"We expect the RenyiDivergence between two uncorrelated variables to be close to zero.","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Random; rng = Xoshiro(1234)\nn = 100000\nx, y = rand(rng, n), rand(rng, n)\nest = JointProbabilities(RenyiDivergence(), CodifyVariables(OrdinalPatterns(m=3)))\ndiv_hd = association(est, x, y) # pretty close to zero","category":"page"},{"location":"examples/examples_associations/#[VariationDistance](@ref)","page":"Associations","title":"VariationDistance","text":"","category":"section"},{"location":"examples/examples_associations/#example_VariationDistance_precomputed_probabilities","page":"Associations","title":"From precomputed probabilities","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\n# From pre-computed PMFs\np1 = Probabilities([0.1, 0.5, 0.2, 0.2])\np2 = Probabilities([0.3, 0.3, 0.2, 0.2])\nassociation(VariationDistance(), p1, p2)","category":"page"},{"location":"examples/examples_associations/#example_VariationDistance_JointProbabilities_OrdinalPatterns","page":"Associations","title":"JointProbabilities + OrdinalPatterns","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"We expect the VariationDistance between two uncorrelated variables to be close to zero.","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Random; rng = Xoshiro(1234)\nn = 100000\nx, y = rand(rng, n), rand(rng, n)\nest = JointProbabilities(VariationDistance(), CodifyVariables(OrdinalPatterns(m=3)))\ndiv_hd = association(est, x, y) # pretty close to zero","category":"page"},{"location":"examples/examples_associations/#[JointEntropyShannon](@ref)","page":"Associations","title":"JointEntropyShannon","text":"","category":"section"},{"location":"examples/examples_associations/#example_JointEntropyShannon_Dispersion","page":"Associations","title":"JointProbabilities with Dispersion","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Random; rng = Xoshiro(1234)\nx, y = rand(rng, 100), rand(rng, 100)\nmeasure = JointEntropyShannon()\ndiscretization = CodifyVariables(Dispersion(m = 2, c = 3))\nest = JointProbabilities(measure, discretization)\nassociation(est, x, y)","category":"page"},{"location":"examples/examples_associations/#[JointEntropyTsallis](@ref)","page":"Associations","title":"JointEntropyTsallis","text":"","category":"section"},{"location":"examples/examples_associations/#example_JointEntropyTsallis_OrdinalPatterns","page":"Associations","title":"JointProbabilities with OrdinalPatterns","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Random; rng = Xoshiro(1234)\nx, y = rand(rng, 100), rand(rng, 100)\nmeasure = JointEntropyTsallis()\ndiscretization = CodifyVariables(OrdinalPatterns(m = 3))\nest = JointProbabilities(measure, discretization)\nassociation(est, x, y)","category":"page"},{"location":"examples/examples_associations/#[JointEntropyRenyi](@ref)","page":"Associations","title":"JointEntropyRenyi","text":"","category":"section"},{"location":"examples/examples_associations/#example_JointEntropyRenyi_ValueBinning","page":"Associations","title":"JointProbabilities with OrdinalPatterns","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Random; rng = Xoshiro(1234)\nx, y = rand(rng, 100), rand(rng, 100)\nmeasure = JointEntropyRenyi(q = 0.5)\ndiscretization = CodifyVariables(ValueBinning(2))\nest = JointProbabilities(measure, discretization)\nassociation(est, x, y)","category":"page"},{"location":"examples/examples_associations/#[ConditionalEntropyShannon](@ref)","page":"Associations","title":"ConditionalEntropyShannon","text":"","category":"section"},{"location":"examples/examples_associations/#example_ConditionalEntropyShannon_analytical","page":"Associations","title":"Analytical examples","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"This is essentially example 2.2.1 in Cover & Thomas (2006), where they use the following relative frequency table as an example. Notethat Julia is column-major, so we need to transpose their example. Then their X is in the first dimension of our table (along columns) and their Y is our second dimension (rows).","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nfreqs_yx = [1//8 1//16 1//32 1//32; \n 1//16 1//8 1//32 1//32;\n 1//16 1//16 1//16 1//16; \n 1//4 0//1 0//1 0//1];\n# `freqs_yx` is already normalized, se we can feed it directly to `Probabilities`\npxy = Probabilities(freqs_yx)","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"The marginal distribution for x (first dimension) is","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"marginal(pxy, dims = 2)","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"The marginal distribution for y (second dimension) is","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"marginal(pxy, dims = 1)","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"And the Shannon conditional entropy H^S(X Y)","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"ce_x_given_y = association(ConditionalEntropyShannon(), pxy) |> Rational","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"This is the same as in their example. Hooray! To compute H^S(Y X), we just need to flip the contingency matrix.","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"pyx = Probabilities(transpose(freqs_yx))\nce_y_given_x = association(ConditionalEntropyShannon(), pyx) |> Rational","category":"page"},{"location":"examples/examples_associations/#example_ConditionalEntropyShannon_JointProbabilities_CodifyVariables_UniqueElements","page":"Associations","title":"JointProbabilities + CodifyVariables + UniqueElements","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"We can of course also estimate conditional entropy from data. To do so, we'll use the JointProbabilities estimator, which constructs a multivariate PMF for us. Thus, we don't explicitly need a set of counts, like in the example above, because they are estimated under the hood for us. ","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"Let's first demonstrate on some categorical data. For that, we must use UniqueElements as the discretization (i.e. just count unique elements).","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Random; rng = Xoshiro(1234)\nn = 1000\nrating = rand(rng, 1:6, n)\nmovie = rand(rng, [\"The Witcher: the movie\", \"Lord of the Rings\"], n)\n\ndisc = CodifyVariables(UniqueElements())\nest = JointProbabilities(ConditionalEntropyShannon(), disc)\nassociation(est, rating, movie)","category":"page"},{"location":"examples/examples_associations/#example_ConditionalEntropyShannon_JointProbabilities_CodifyPoints_UniqueElementsEncoding","page":"Associations","title":"JointProbabilities + CodifyPoints + UniqueElementsEncoding","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Random; rng = Xoshiro(1234)\nx, y, z = rand(rng, 1:5, 100), rand(rng, 1:5, 100), rand(rng, 1:3, 100)\nX = StateSpaceSet(x, z)\nY = StateSpaceSet(y, z)\ndisc = CodifyPoints(UniqueElementsEncoding(X), UniqueElementsEncoding(Y));\nest = JointProbabilities(ConditionalEntropyShannon(), disc);\nassociation(est, X, Y)","category":"page"},{"location":"examples/examples_associations/#[ConditionalEntropyTsallisAbe](@ref)","page":"Associations","title":"ConditionalEntropyTsallisAbe","text":"","category":"section"},{"location":"examples/examples_associations/#example_ConditionalEntropyTsallisAbe_JointProbabilities_CodifyVariables_UniqueElements","page":"Associations","title":"JointProbabilities + CodifyVariables + UniqueElements","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"We'll here repeat the analysis we did for ConditionalEntropyShannon above.","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Random; rng = Xoshiro(1234)\nn = 1000\nrating = rand(rng, 1:6, n)\nmovie = rand(rng, [\"The Witcher: the movie\", \"Lord of the Rings\"], n)\n\ndisc = CodifyVariables(UniqueElements())\nest = JointProbabilities(ConditionalEntropyTsallisAbe(q =1.5), disc)\nassociation(est, rating, movie)","category":"page"},{"location":"examples/examples_associations/#example_ConditionalEntropyTsallisAbe_JointProbabilities_CodifyPoints_UniqueElementsEncoding","page":"Associations","title":"JointProbabilities + CodifyPoints + UniqueElementsEncoding","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Random; rng = Xoshiro(1234)\nx, y, z = rand(rng, 1:5, 100), rand(rng, 1:5, 100), rand(rng, 1:3, 100)\nX = StateSpaceSet(x, z)\nY = StateSpaceSet(y, z)\ndisc = CodifyPoints(UniqueElementsEncoding(X), UniqueElementsEncoding(Y));\nest = JointProbabilities(ConditionalEntropyTsallisAbe(q = 1.5), disc);\nassociation(est, X, Y)","category":"page"},{"location":"examples/examples_associations/#[ConditionalEntropyTsallisFuruichi](@ref)","page":"Associations","title":"ConditionalEntropyTsallisFuruichi","text":"","category":"section"},{"location":"examples/examples_associations/#example_ConditionalEntropyTsallisFuruichi_JointProbabilities_CodifyVariables_UniqueElements","page":"Associations","title":"JointProbabilities + CodifyVariables + UniqueElements","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"We'll here repeat the analysis we did for ConditionalEntropyShannon and ConditionalEntropyTsallisAbe above.","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Random; rng = Xoshiro(1234)\nn = 1000\nrating = rand(rng, 1:6, n)\nmovie = rand(rng, [\"The Witcher: the movie\", \"Lord of the Rings\"], n)\n\ndisc = CodifyVariables(UniqueElements())\nest = JointProbabilities(ConditionalEntropyTsallisFuruichi(q =0.5), disc)\nassociation(est, rating, movie)","category":"page"},{"location":"examples/examples_associations/#example_ConditionalEntropyTsallisFuruichi_JointProbabilities_CodifyPoints_UniqueElementsEncoding","page":"Associations","title":"JointProbabilities + CodifyPoints + UniqueElementsEncoding","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Random; rng = Xoshiro(1234)\nx, y, z = rand(rng, 1:5, 100), rand(rng, 1:5, 100), rand(rng, 1:3, 100)\nX = StateSpaceSet(x, z)\nY = StateSpaceSet(y, z)\ndisc = CodifyPoints(UniqueElementsEncoding(X), UniqueElementsEncoding(Y));\nest = JointProbabilities(ConditionalEntropyTsallisFuruichi(q = 0.5), disc);\nassociation(est, X, Y)","category":"page"},{"location":"examples/examples_associations/#[MIShannon](@ref)","page":"Associations","title":"MIShannon","text":"","category":"section"},{"location":"examples/examples_associations/#example_MIShannon_JointProbabilities_ValueBinning","page":"Associations","title":"JointProbabilities + ValueBinning","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Random; rng = MersenneTwister(1234)\nx = rand(rng, 1000)\ny = rand(rng, 1000)\ndiscretization = CodifyVariables(ValueBinning(FixedRectangularBinning(0, 1, 5)))\nest = JointProbabilities(MIShannon(), discretization)\nassociation(est, x, y)","category":"page"},{"location":"examples/examples_associations/#example_MIShannon_JointProbabilities_UniqueElements","page":"Associations","title":"JointProbabilities + UniqueElements","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"The JointProbabilities estimator can also be used with categorical data. For example, let's compare the Shannon mutual information between the preferences of a population sample with regards to different foods.","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nn = 1000\npreferences = rand([\"neutral\", \"like it\", \"hate it\"], n);\nrandom_foods = rand([\"water\", \"flour\", \"bananas\", \"booze\", \"potatoes\", \"beans\", \"soup\"], n)\nbiased_foods = map(preferences) do preference\n if cmp(preference, \"neutral\") == 1\n return rand([\"water\", \"flour\"])\n elseif cmp(preference, \"like it\") == 1\n return rand([\"bananas\", \"booze\"])\n else\n return rand([\"potatoes\", \"beans\", \"soup\"])\n end\nend\n\nest = JointProbabilities(MIShannon(), UniqueElements())\nassociation(est, preferences, biased_foods), association(est, preferences, random_foods)","category":"page"},{"location":"examples/examples_associations/#example_MIShannon_GaussianMI","page":"Associations","title":"Dedicated GaussianMI estimator","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Distributions\nusing Statistics\n\nn = 1000\nusing Associations\nx = randn(1000)\ny = rand(1000) .+ x\nassociation(GaussianMI(MIShannon()), x, y) # defaults to `MIShannon()`","category":"page"},{"location":"examples/examples_associations/#example_MIShannon_KSG1","page":"Associations","title":"Dedicated KraskovStögbauerGrassberger1 estimator","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nx, y = rand(1000), rand(1000)\nassociation(KSG1(MIShannon(); k = 5), x, y)","category":"page"},{"location":"examples/examples_associations/#example_MIShannon_KSG2","page":"Associations","title":"Dedicated KraskovStögbauerGrassberger2 estimator","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nx, y = rand(1000), rand(1000)\nassociation(KSG2(MIShannon(); k = 5), x, y)","category":"page"},{"location":"examples/examples_associations/#example_MIShannon_GaoKannanOhViswanath","page":"Associations","title":"Dedicated GaoKannanOhViswanath estimator","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nx, y = rand(1000), rand(1000)\nassociation(GaoKannanOhViswanath(MIShannon(); k = 10), x, y)","category":"page"},{"location":"examples/examples_associations/#example_MIShannon_EntropyDecomposition_Kraskov","page":"Associations","title":"EntropyDecomposition + Kraskov","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"We can compute MIShannon by naively applying a DifferentialInfoEstimator. Note that this doesn't apply any bias correction.","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nx, y = rand(1000), rand(1000)\nassociation(EntropyDecomposition(MIShannon(), Kraskov(k = 3)), x, y)","category":"page"},{"location":"examples/examples_associations/#example_MIShannon_EntropyDecomposition_BubbleSortSwaps","page":"Associations","title":"EntropyDecomposition + BubbleSortSwaps","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"We can also compute MIShannon by naively applying a DiscreteInfoEstimator. Note that this doesn't apply any bias correction.","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nx, y = rand(1000), rand(1000)\ndisc = CodifyVariables(BubbleSortSwaps(m=5))\nhest = PlugIn(Shannon())\nassociation(EntropyDecomposition(MIShannon(), hest, disc), x, y)","category":"page"},{"location":"examples/examples_associations/#example_MIShannon_EntropyDecomposition_Jackknife_ValueBinning","page":"Associations","title":"EntropyDecomposition + Jackknife + ValueBinning","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"Shannon mutual information can be written as a sum of marginal entropy terms. Here, we use CodifyVariables with ValueBinning bin the data and compute discrete Shannon mutual information.","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Random; rng = MersenneTwister(1234)\nx = rand(rng, 50)\ny = rand(rng, 50)\n\n# Use the H3-estimation method with a discrete visitation frequency based \n# probabilities estimator over a fixed grid covering the range of the data,\n# which is on [0, 1].\ndiscretization = CodifyVariables(ValueBinning(FixedRectangularBinning(0, 1, 5)))\nhest = Jackknife(Shannon())\nest = EntropyDecomposition(MIShannon(), hest, discretization)\nassociation(est, x, y)","category":"page"},{"location":"examples/examples_associations/#example_MIShannon_reproducing_Kraskov","page":"Associations","title":"Reproducing Kraskov et al. (2004)","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"Here, we'll reproduce Figure 4 from Kraskov et al. (2004)'s seminal paper on the nearest-neighbor based mutual information estimator. We'll estimate the mutual information between marginals of a bivariate Gaussian for a fixed time series length of 1000, varying the number of neighbors. Note: in the original paper, they show multiple curves corresponding to different time series length. We only show two single curves: one for the KraskovStögbauerGrassberger1 estimator and one for the KraskovStögbauerGrassberger2 estimator.","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing LinearAlgebra: det\nusing Distributions: MvNormal\nusing StateSpaceSets: StateSpaceSet\nusing CairoMakie\nusing Statistics\n\nN = 800\nc = 0.9\nΣ = [1 c; c 1]\nN2 = MvNormal([0, 0], Σ)\nmitrue = -0.5*log(det(Σ)) # in nats\nks = [2; 5; 7; 10:10:70] .* 2\n\nnreps = 10 # plot average over 10 independent realizations\nmis_ksg1 = zeros(nreps, length(ks))\nmis_ksg2 = zeros(nreps, length(ks))\nfor i = 1:nreps\n D2 = StateSpaceSet([rand(N2) for i = 1:N])\n X = D2[:, 1] |> StateSpaceSet\n Y = D2[:, 2] |> StateSpaceSet\n for (j, k) in enumerate(ks)\n est1 = KSG1(MIShannon(; base = ℯ); k)\n est2 = KSG2(MIShannon(; base = ℯ); k)\n mis_ksg1[i, j] = association(est1, X, Y)\n mis_ksg2[i, j] = association(est2, X, Y)\n end\nend\nfig = Figure()\nax = Axis(fig[1, 1], xlabel = \"k / N\", ylabel = \"Mutual infomation (nats)\")\nscatterlines!(ax, ks ./ N, mean(mis_ksg1, dims = 1) |> vec, label = \"KSG1\")\nscatterlines!(ax, ks ./ N, mean(mis_ksg2, dims = 1) |> vec, label = \"KSG2\")\nhlines!(ax, [mitrue], color = :black, linewidth = 3, label = \"I (true)\")\naxislegend()\nfig","category":"page"},{"location":"examples/examples_associations/#Estimator-comparison-for-[MIShannon](@ref)","page":"Associations","title":"Estimator comparison for MIShannon","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"Most estimators suffer from significant bias when applied to discrete, finite data. One possible resolution is to add a small amount of noise to discrete variables, so that the data becomes continuous in practice.","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"But instead of adding noise to your data, you can also consider using an estimator that is specifically designed to deal with continuous-discrete mixture data. One example is the GaoKannanOhViswanath estimator. Below, we compare its performance to KraskovStögbauerGrassberger1 on uniformly distributed discrete multivariate data. The true mutual information is zero. While the \"naive\" KraskovStögbauerGrassberger1 estimator diverges from the true value for these data, the GaoKannanOhViswanath converges to the true value.","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Statistics\nusing StateSpaceSets: StateSpaceSet\nusing Statistics: mean\nusing CairoMakie\n\nfunction compare_ksg_gkov(;\n k = 5,\n base = 2,\n nreps = 10,\n Ls = [500:100:1000; 1500; 2500; 5000; 7000])\n\n\n mis_ksg1_mix = zeros(nreps, length(Ls))\n mis_ksg1_discrete = zeros(nreps, length(Ls))\n mis_ksg1_cont = zeros(nreps, length(Ls))\n mis_gkov_mix = zeros(nreps, length(Ls))\n mis_gkov_discrete = zeros(nreps, length(Ls))\n mis_gkov_cont = zeros(nreps, length(Ls))\n\n for (j, L) in enumerate(Ls)\n for i = 1:nreps\n X = StateSpaceSet(float.(rand(1:8, L, 2)))\n Y = StateSpaceSet(float.(rand(1:8, L, 2)))\n Z = StateSpaceSet(rand(L, 2))\n W = StateSpaceSet(rand(L, 2))\n est_gkov = GaoKannanOhViswanath(MIShannon(; base = ℯ); k)\n est_ksg1 = KSG1(MIShannon(; base = ℯ); k)\n mis_ksg1_discrete[i, j] = association(est_ksg1, X, Y)\n mis_gkov_discrete[i, j] = association(est_gkov, X, Y)\n mis_ksg1_mix[i, j] = association(est_ksg1, X, Z)\n mis_gkov_mix[i, j] = association(est_gkov, X, Z)\n mis_ksg1_cont[i, j] = association(est_ksg1, Z, W)\n mis_gkov_cont[i, j] = association(est_gkov, Z, W)\n end\n end\n return mis_ksg1_mix, mis_ksg1_discrete, mis_ksg1_cont,\n mis_gkov_mix, mis_gkov_discrete, mis_gkov_cont\nend\n\nfig = Figure()\nax = Axis(fig[1, 1], \n xlabel = \"Sample size\", \n ylabel = \"Mutual information (bits)\")\nLs = [100; 200; 500; 1000; 2500; 5000; 7000]\nnreps = 5\nk = 3\nmis_ksg1_mix, mis_ksg1_discrete, mis_ksg1_cont,\n mis_gkov_mix, mis_gkov_discrete, mis_gkov_cont = \n compare_ksg_gkov(; nreps, k, Ls)\n\nscatterlines!(ax, Ls, mean(mis_ksg1_mix, dims = 1) |> vec, \n label = \"KSG1 (mixed)\", color = :black, \n marker = :utriangle)\nscatterlines!(ax, Ls, mean(mis_ksg1_discrete, dims = 1) |> vec, \n label = \"KSG1 (discrete)\", color = :black, \n linestyle = :dash, marker = '▲')\nscatterlines!(ax, Ls, mean(mis_ksg1_cont, dims = 1) |> vec, \n label = \"KSG1 (continuous)\", color = :black, \n linestyle = :dot, marker = '●')\nscatterlines!(ax, Ls, mean(mis_gkov_mix, dims = 1) |> vec, \n label = \"GaoKannanOhViswanath (mixed)\", color = :red, \n marker = :utriangle)\nscatterlines!(ax, Ls, mean(mis_gkov_discrete, dims = 1) |> vec, \n label = \"GaoKannanOhViswanath (discrete)\", color = :red, \n linestyle = :dash, marker = '▲')\nscatterlines!(ax, Ls, mean(mis_gkov_cont, dims = 1) |> vec, \n label = \"GaoKannanOhViswanath (continuous)\", color = :red, \n linestyle = :dot, marker = '●')\naxislegend(position = :rb)\nfig","category":"page"},{"location":"examples/examples_associations/#Estimation-using-[DifferentialInfoEstimator](@ref)s:-a-comparison","page":"Associations","title":"Estimation using DifferentialInfoEstimators: a comparison","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"Let's compare the performance of a subset of the implemented mutual information estimators. We'll use example data from Lord et al., where the analytical mutual information is known.","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing LinearAlgebra: det\nusing StateSpaceSets: StateSpaceSet\nusing Distributions: MvNormal\nusing LaTeXStrings\nusing CairoMakie\n\n# adapted from https://juliadatascience.io/makie_colors\nfunction new_cycle_theme()\n # https://nanx.me/ggsci/reference/pal_locuszoom.html\n my_colors = [\"#D43F3AFF\", \"#EEA236FF\", \"#5CB85CFF\", \"#46B8DAFF\",\n \"#357EBDFF\", \"#9632B8FF\", \"#B8B8B8FF\"]\n cycle = Cycle([:color, :linestyle, :marker], covary=true) # alltogether\n my_markers = [:circle, :rect, :utriangle, :dtriangle, :diamond,\n :pentagon, :cross, :xcross]\n my_linestyle = [nothing, :dash, :dot, :dashdot, :dashdotdot]\n return Theme(\n fontsize = 22, font=\"CMU Serif\",\n colormap = :linear_bmy_10_95_c78_n256,\n palette = (\n color = my_colors, \n marker = my_markers, \n linestyle = my_linestyle,\n ),\n Axis = (\n backgroundcolor= (:white, 0.2), \n xgridstyle = :dash, \n ygridstyle = :dash\n ),\n Lines = (\n cycle= cycle,\n ), \n ScatterLines = (\n cycle = cycle,\n ),\n Scatter = (\n cycle = cycle,\n ),\n Legend = (\n bgcolor = (:grey, 0.05), \n framecolor = (:white, 0.2),\n labelsize = 13,\n )\n )\nend\n\nrun(est; f::Function, # function that generates data\n base::Real = ℯ, \n nreps::Int = 10, \n αs = [1e-6, 1e-5, 1e-4, 1e-3, 1e-2, 1e-1], \n n::Int = 1000) =\n map(α -> association(est, f(α, n)...), αs)\n\nfunction compute_results(f::Function; estimators, k = 5, k_lord = 20,\n n = 1000, base = ℯ, nreps = 10,\n as = 7:-1:0,\n αs = [1/10^(a) for a in as])\n \n is = [zeros(length(αs)) for est in estimators]\n for (k, est) in enumerate(estimators)\n tmp = zeros(length(αs))\n for i = 1:nreps\n tmp .+= run(est; f = f, αs, base, n)\n end\n is[k] .= tmp ./ nreps\n end\n\n return is\nend\n\nfunction plot_results(f::Function, ftrue::Function; \n base, estimators, k_lord, k, \n as = 7:-1:0, αs = [1/10^(a) for a in as], kwargs...\n )\n is = compute_results(f; \n base, estimators, k_lord, k, as, αs, kwargs...)\n itrue = [ftrue(α; base) for α in αs]\n\n xmin, xmax = minimum(αs), maximum(αs)\n \n ymin = floor(Int, min(minimum(itrue), minimum(Iterators.flatten(is))))\n ymax = ceil(Int, max(maximum(itrue), maximum(Iterators.flatten(is))))\n f = Figure()\n ax = Axis(f[1, 1],\n xlabel = \"α\", ylabel = \"I (nats)\",\n xscale = log10, aspect = 1,\n xticks = (αs, [latexstring(\"10^{$(-a)}\") for a in as]),\n yticks = (ymin:ymax)\n )\n xlims!(ax, (1/10^first(as), 1/10^last(as)))\n ylims!(ax, (ymin, ymax))\n lines!(ax, αs, itrue, \n label = \"I (true)\", linewidth = 4, color = :black)\n for (i, est) in enumerate(estimators)\n if est isa EntropyDecomposition\n es = typeof(est.est).name.name |> String\n else\n es = typeof(est).name.name |> String\n end\n @show es\n lbl = occursin(\"Lord\", es) ? \"$es (k = $k_lord)\" : \"$es (k = $k)\"\n scatter!(ax, αs, is[i], label = lbl)\n lines!(ax, αs, is[i])\n\n end\n axislegend()\n return f\nend\n\nset_theme!(new_cycle_theme())\nk_lord = 20\nk = 5\nbase = ℯ\n\ndef = MIShannon(base = ℯ)\nestimators = [\n EntropyDecomposition(def, Kraskov(; k)),\n EntropyDecomposition(def, KozachenkoLeonenko()),\n EntropyDecomposition(def, Zhu(; k)),\n EntropyDecomposition(def, ZhuSingh(; k)),\n EntropyDecomposition(def, Gao(; k)),\n EntropyDecomposition(def, Lord(; k = k_lord)),\n EntropyDecomposition(def, LeonenkoProzantoSavani(Shannon(); k)),\n KSG1(def; k),\n KSG2(def; k),\n GaoOhViswanath(def; k),\n GaoKannanOhViswanath(def; k),\n GaussianMI(def),\n];","category":"page"},{"location":"examples/examples_associations/#Example-system:-family-1","page":"Associations","title":"Example system: family 1","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"In this system, samples are concentrated around the diagonal X = Y, and the strip of samples gets thinner as alpha to 0.","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"function family1(α, n::Int)\n x = rand(n)\n v = rand(n)\n y = x + α * v\n return StateSpaceSet(x), StateSpaceSet(y)\nend\n\n# True mutual information values for these data\nfunction ifamily1(α; base = ℯ)\n mi = -log(α) - α - log(2)\n return mi / log(base, ℯ)\nend\n\nfig = plot_results(family1, ifamily1; \n k_lord = k_lord, k = k, nreps = 10, n = 800,\n estimators = estimators,\n base = base)","category":"page"},{"location":"examples/examples_associations/#Example-system:-family-2","page":"Associations","title":"Example system: family 2","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"function family2(α, n::Int)\n Σ = [1 α; α 1]\n N2 = MvNormal(zeros(2), Σ)\n D2 = StateSpaceSet([rand(N2) for i = 1:n])\n X = StateSpaceSet(D2[:, 1])\n Y = StateSpaceSet(D2[:, 2])\n return X, Y\nend\n\nfunction ifamily2(α; base = ℯ)\n return (-0.5 * log(1 - α^2)) / log(ℯ, base)\nend\n\nαs = 0.05:0.05:0.95\nestimators = estimators\nwith_theme(new_cycle_theme()) do\n f = Figure();\n ax = Axis(f[1, 1], xlabel = \"α\", ylabel = \"I (nats)\")\n is_true = map(α -> ifamily2(α), αs)\n is_est = map(est -> run(est; f = family2, αs, nreps = 20), estimators)\n lines!(ax, αs, is_true, \n label = \"I (true)\", color = :black, linewidth = 3)\n for (i, est) in enumerate(estimators)\n if est isa EntropyDecomposition\n estname = typeof(est.est).name.name |> String\n else\n estname = typeof(est).name.name |> String\n end\n scatterlines!(ax, αs, is_est[i], label = estname)\n end\n axislegend(position = :lt)\n return f\nend","category":"page"},{"location":"examples/examples_associations/#Example-system:-family-3","page":"Associations","title":"Example system: family 3","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"In this system, we draw samples from a 4D Gaussian distribution distributed as specified in the ifamily3 function below. We let X be the two first variables, and Y be the two last variables.","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"function ifamily3(α; base = ℯ)\n Σ = [7 -5 -1 -3; -5 5 -1 3; -1 -1 3 -1; -3 3 -1 2+α]\n Σx = Σ[1:2, 1:2]; Σy = Σ[3:4, 3:4]\n mi = 0.5*log(det(Σx) * det(Σy) / det(Σ))\n return mi / log(ℯ, base)\nend\n\nfunction family3(α, n::Int)\n Σ = [7 -5 -1 -3; -5 5 -1 3; -1 -1 3 -1; -3 3 -1 2+α]\n N4 = MvNormal(zeros(4), Σ)\n D4 = StateSpaceSet([rand(N4) for i = 1:n])\n X = D4[:, 1:2]\n Y = D4[:, 3:4]\n return X, Y\nend\n\nfig = plot_results(family3, ifamily3; \n k_lord = k_lord, k = k, nreps = 5, n = 800,\n estimators = estimators, base = base)","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"We see that the Lord estimator, which estimates local volume elements using a singular-value decomposition (SVD) of local neighborhoods, outperforms the other estimators by a large margin.","category":"page"},{"location":"examples/examples_associations/#[MIRenyiJizba](@ref)","page":"Associations","title":"MIRenyiJizba","text":"","category":"section"},{"location":"examples/examples_associations/#example_MIRenyiJizba_JointProbabilities_UniqueElements","page":"Associations","title":"JointProbabilities + UniqueElements","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"MIRenyiJizba can be estimated for categorical data using JointProbabilities estimator with the UniqueElements outcome space.","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Random; rng = Xoshiro(1234)\nx = rand(rng, [\"a\", \"b\", \"c\"], 200);\ny = rand(rng, [\"hello\", \"yoyo\", \"heyhey\"], 200);\nest = JointProbabilities(MIRenyiJizba(), UniqueElements())\nassociation(est, x, y)","category":"page"},{"location":"examples/examples_associations/#example_MIRenyiJizba_JointProbabilities_LeonenkoProzantoSavani","page":"Associations","title":"EntropyDecomposition + LeonenkoProzantoSavani","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"MIRenyiJizba can also estimated for numerical data using EntropyDecomposition in combination with any DifferentialInfoEstimator capable of estimating differential Renyi entropy.","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Random; rng = Xoshiro(1234)\nx = randn(rng, 50); y = randn(rng, 50);\ndef = MIRenyiJizba()\nest_diff = EntropyDecomposition(def, LeonenkoProzantoSavani(Renyi(), k=3))\nassociation(est_diff, x, y) ","category":"page"},{"location":"examples/examples_associations/#example_MIRenyiJizba_EntropyDecomposition_ValueBinning","page":"Associations","title":"EntropyDecomposition + LeonenkoProzantoSavani","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"MIRenyiJizba can also estimated for numerical data using EntropyDecomposition in combination with any DiscreteInfoEstimator capable of estimating differential Renyi entropy over some OutcomeSpace, e.g. ValueBinning.","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Random; rng = Xoshiro(1234)\nx = randn(rng, 50); y = randn(rng, 50);\ndef = MIRenyiJizba()\n\ndisc = CodifyVariables(ValueBinning(2))\nest_disc = EntropyDecomposition(def, PlugIn(Renyi()), disc);\nassociation(est_disc, x, y)","category":"page"},{"location":"examples/examples_associations/#[MIRenyiSarbu](@ref)","page":"Associations","title":"MIRenyiSarbu","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"MIRenyiSarbu can be estimated using the JointProbabilities estimator in combination with any CodifyVariables or CodifyPoints discretization scheme.","category":"page"},{"location":"examples/examples_associations/#example_MIRenyiSarbu_JointProbabilities_UniqueElements","page":"Associations","title":"JointProbabilities + UniqueElements","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Random; rng = Xoshiro(1234)\nx = rand(rng, [\"a\", \"b\", \"c\"], 200)\ny = rand(rng, [\"hello\", \"yoyo\", \"heyhey\"], 200)\n\nest = JointProbabilities(MIRenyiSarbu(), CodifyVariables(UniqueElements()))\nassociation(est, x, y)","category":"page"},{"location":"examples/examples_associations/#example_MIRenyiSarbu_JointProbabilities_CosineSimilarityBinning","page":"Associations","title":"JointProbabilities + CosineSimilarityBinning","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Random; rng = Xoshiro(1234)\nx = rand(rng, 200)\ny = rand(rng, 200)\n\nest = JointProbabilities(MIRenyiSarbu(), CodifyVariables(CosineSimilarityBinning()))\nassociation(est, x, y)","category":"page"},{"location":"examples/examples_associations/#[MITsallisFuruichi](@ref)","page":"Associations","title":"MITsallisFuruichi","text":"","category":"section"},{"location":"examples/examples_associations/#example_MITsallisFuruichi_JointProbabilities_UniqueElements","page":"Associations","title":"JointProbabilities + UniqueElements","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"MITsallisFuruichi can be estimated using the JointProbabilities estimator in combination with any CodifyVariables or CodifyPoints discretization scheme.","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Random; rng = Xoshiro(1234)\nx = rand(rng, 200)\ny = rand(rng, 200)\n\nest = JointProbabilities(MITsallisFuruichi(q = 0.3), UniqueElements())\nassociation(est, x, y) ","category":"page"},{"location":"examples/examples_associations/#example_MITsallisFuruichi_EntropyDecomposition_LeonenkoProzantoSavani","page":"Associations","title":"EntropyDecomposition + LeonenkoProzantoSavani","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Random; rng = Xoshiro(1234)\nx = rand(rng, 200)\ny = rand(rng, 200)\n\nest_diff = EntropyDecomposition(MITsallisFuruichi(), LeonenkoProzantoSavani(Tsallis(q= 2)))\nassociation(est_diff, x, y)","category":"page"},{"location":"examples/examples_associations/#example_MITsallisFuruichi_EntropyDecomposition_Dispersion","page":"Associations","title":"EntropyDecomposition + Dispersion","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Random; rng = Xoshiro(1234)\nx = rand(rng, 200)\ny = rand(rng, 200)\ndisc = CodifyVariables(Dispersion())\nest_disc = EntropyDecomposition(MITsallisFuruichi(), PlugIn(Tsallis()), disc)\n\nassociation(est_disc, x, y)","category":"page"},{"location":"examples/examples_associations/#[MITsallisMartin](@ref)","page":"Associations","title":"MITsallisMartin","text":"","category":"section"},{"location":"examples/examples_associations/#example_MITsallisMartin_JointProbabilities_UniqueElements","page":"Associations","title":"JointProbabilities + UniqueElements","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Random; rng = Xoshiro(1234)\nx = rand(rng, 200)\ny = rand(rng, 200)\n\nest = JointProbabilities(MITsallisMartin(q = 1.5), UniqueElements())\nassociation(est, x, y) ","category":"page"},{"location":"examples/examples_associations/#example_MITsallisMartin_EntropyDecomposition_LeonenkoProzantoSavani","page":"Associations","title":"EntropyDecomposition + LeonenkoProzantoSavani","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"MITsallisMartin can be estimated using a decomposition into entropy terms using EntropyDecomposition with any compatible estimator that can estimate differential Tsallis entropy. ","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Random; rng = Xoshiro(1234)\nx = rand(rng, 500)\ny = rand(rng, 500)\n\nest_diff = EntropyDecomposition(MITsallisMartin(), LeonenkoProzantoSavani(Tsallis(q= 1.5)))\nassociation(est_diff, x, y)","category":"page"},{"location":"examples/examples_associations/#example_MITsallisMartin_EntropyDecomposition_OrdinalPatterns","page":"Associations","title":"EntropyDecomposition + OrdinalPatterns","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Random; rng = Xoshiro(1234)\nx = rand(rng, 200)\ny = rand(rng, 200)\ndisc = CodifyVariables(OrdinalPatterns())\nest_disc = EntropyDecomposition(MITsallisMartin(), PlugIn(Tsallis()), disc)\n\nassociation(est_disc, x, y)","category":"page"},{"location":"examples/examples_associations/#[CMIShannon](@ref)","page":"Associations","title":"CMIShannon","text":"","category":"section"},{"location":"examples/examples_associations/#example_CMIShannon_GaussianCMI","page":"Associations","title":"CMIShannon with GaussianCMI","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Distributions\nusing Statistics\n\nn = 1000\n# A chain X → Y → Z\nx = randn(1000)\ny = randn(1000) .+ x\nz = randn(1000) .+ y\nassociation(GaussianCMI(), x, z, y) # defaults to `CMIShannon()`","category":"page"},{"location":"examples/examples_associations/#example_CMIShannon_FPVP","page":"Associations","title":"CMIShannon with FPVP","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Distributions\nusing Statistics\n\nn = 1000\n# A chain X → Y → Z\nx = rand(Normal(-1, 0.5), n)\ny = rand(BetaPrime(0.5, 1.5), n) .+ x\nz = rand(Chisq(100), n)\nz = (z ./ std(z)) .+ y\n\n# We expect zero (in practice: very low) CMI when computing I(X; Z | Y), because\n# the link between X and Z is exclusively through Y, so when observing Y,\n# X and Z should appear independent.\nassociation(FPVP(k = 5), x, z, y) # defaults to `CMIShannon()`","category":"page"},{"location":"examples/examples_associations/#[CMIShannon](@ref)-with-[MesnerShalizi](@ref)","page":"Associations","title":"CMIShannon with MesnerShalizi","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Distributions\nusing Statistics\nusing Random; rng = Xoshiro(1234)\n\nn = 1000\n# A chain X → Y → Z\nx = rand(rng, Normal(-1, 0.5), n)\ny = rand(rng, BetaPrime(0.5, 1.5), n) .+ x\nz = rand(rng, Chisq(100), n)\nz = (z ./ std(z)) .+ y\n\n# We expect zero (in practice: very low) CMI when computing I(X; Z | Y), because\n# the link between X and Z is exclusively through Y, so when observing Y,\n# X and Z should appear independent.\nassociation(MesnerShalizi(; k = 10), x, z, y) # defaults to `CMIShannon()`","category":"page"},{"location":"examples/examples_associations/#[CMIShannon](@ref)-with-[Rahimzamani](@ref)","page":"Associations","title":"CMIShannon with Rahimzamani","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Distributions\nusing Statistics\nusing Random; rng = Xoshiro(1234)\n\nn = 1000\n# A chain X → Y → Z\nx = rand(rng, Normal(-1, 0.5), n)\ny = rand(rng, BetaPrime(0.5, 1.5), n) .+ x\nz = rand(rng, Chisq(100), n)\nz = (z ./ std(z)) .+ y\n\n# We expect zero (in practice: very low) CMI when computing I(X; Z | Y), because\n# the link between X and Z is exclusively through Y, so when observing Y,\n# X and Z should appear independent.\nassociation(Rahimzamani(CMIShannon(base = 10); k = 10), x, z, y)","category":"page"},{"location":"examples/examples_associations/#example_CMIShannon_MIDecomposition","page":"Associations","title":"MIDecomposition","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"Shannon-type conditional mutual information can be decomposed as a sum of mutual information terms, which we can each estimate with any dedicated MutualInformationEstimator estimator.","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Random; rng = MersenneTwister(1234)\nx = rand(rng, 300)\ny = rand(rng, 300) .+ x\nz = rand(rng, 300) .+ y\n\nest = MIDecomposition(CMIShannon(), KSG1(MIShannon(base = 2), k = 3))\nassociation(est, x, z, y) # should be near 0 (and can be negative)","category":"page"},{"location":"examples/examples_associations/#[CMIRenyiPoczos](@ref)","page":"Associations","title":"CMIRenyiPoczos","text":"","category":"section"},{"location":"examples/examples_associations/#CMIRenyiPoczos_PoczosSchneiderCMI","page":"Associations","title":"PoczosSchneiderCMI","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Distributions\nusing Statistics\nusing Random; rng = Xoshiro(1234)\n\nn = 1000\n# A chain X → Y → Z\nx = rand(rng, Normal(-1, 0.5), n)\ny = rand(rng, BetaPrime(0.5, 1.5), n) .+ x\nz = rand(rng, Chisq(100), n)\nz = (z ./ std(z)) .+ y\n\n# We expect zero (in practice: very low) CMI when computing I(X; Z | Y), because\n# the link between X and Z is exclusively through Y, so when observing Y,\n# X and Z should appear independent.\nest = PoczosSchneiderCMI(CMIRenyiPoczos(base = 2, q = 1.2); k = 5)\nassociation(est, x, z, y)","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"In addition to the dedicated ConditionalMutualInformationEstimators, any MutualInformationEstimator can also be used to compute conditional mutual information using the chain rule of mutual information. However, the naive application of these estimators don't perform any bias correction when taking the difference of mutual information terms.","category":"page"},{"location":"examples/examples_associations/#[CMIShannon](@ref)-2","page":"Associations","title":"CMIShannon","text":"","category":"section"},{"location":"examples/examples_associations/#example_CMIShannon_MIDecomposition_KSG1","page":"Associations","title":"MIDecomposition + KraskovStögbauerGrassberger1","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Distributions\nusing Statistics\n\nn = 1000\n# A chain X → Y → Z\nx = rand(Normal(-1, 0.5), n)\ny = rand(BetaPrime(0.5, 1.5), n) .+ x\nz = rand(Chisq(100), n)\nz = (z ./ std(z)) .+ y\n\n# We expect zero (in practice: very low) CMI when computing I(X; Z | Y), because\n# the link between X and Z is exclusively through Y, so when observing Y,\n# X and Z should appear independent.\nest = MIDecomposition(CMIShannon(base = 2), KSG1(k = 10))\nassociation(est, x, z, y)","category":"page"},{"location":"examples/examples_associations/#example_CMIShannon_EntropyDecomposition_Kraskov","page":"Associations","title":"EntropyDecomposition + Kraskov","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"Any DifferentialInfoEstimator can also be used to compute conditional mutual information using a sum of entropies. For that, we usethe EntropyDecomposition estimator. No bias correction is applied for EntropyDecomposition either.","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Distributions\nusing Random; rng = Xoshiro(1234)\nn = 500\n# A chain X → Y → Z\nx = rand(rng, Epanechnikov(0.5, 1.0), n)\ny = rand(rng, Normal(0, 0.2), n) .+ x\nz = rand(rng, FDist(3, 2), n)\nest = EntropyDecomposition(CMIShannon(), Kraskov(k = 5))\nassociation(est, x, z, y)","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"Any DiscreteInfoEstimator that computes entropy can also be used to compute conditional mutual information using a sum of entropies. For that, we also use EntropyDecomposition. In the discrete case, we also have to specify a discretization (an OutcomeSpace).","category":"page"},{"location":"examples/examples_associations/#example_CMIShannon_EntropyDecomposition_ValueBinning","page":"Associations","title":"EntropyDecomposition + ValueBinning","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Distributions\nusing Random; rng = Xoshiro(1234)\nn = 500\n# A chain X → Y → Z\nx = rand(rng, Epanechnikov(0.5, 1.0), n)\ny = rand(rng, Normal(0, 0.2), n) .+ x\nz = rand(rng, FDist(3, 2), n)\ndiscretization = CodifyVariables(ValueBinning(RectangularBinning(5)))\nhest = PlugIn(Shannon())\nest = EntropyDecomposition(CMIShannon(), hest, discretization)\nassociation(est, x, y, z)","category":"page"},{"location":"examples/examples_associations/#[CMIRenyiJizba](@ref)","page":"Associations","title":"CMIRenyiJizba","text":"","category":"section"},{"location":"examples/examples_associations/#example_CMIRenyiJizba_JointProbabilities_BubbleSortSwaps","page":"Associations","title":"JointProbabilities + BubbleSortSwaps","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Random; rng = Xoshiro(1234)\nx = rand(rng, 100)\ny = x .+ rand(rng, 100)\nz = y .+ rand(rng, 100)\ndisc = CodifyVariables(BubbleSortSwaps(m = 4))\nest = JointProbabilities(CMIRenyiJizba(), disc)\nassociation(est, x, z, y)","category":"page"},{"location":"examples/examples_associations/#example_CMIRenyiJizba_EntropyDecomposition_LeonenkoProzantoSavani","page":"Associations","title":"EntropyDecomposition + LeonenkoProzantoSavani","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Random; rng = Xoshiro(1234)\nx, y, z = rand(rng, 1000), rand(rng, 1000), rand(rng, 1000)\ndef = CMIRenyiJizba(q = 1.5)\n\n# Using a differential Rényi entropy estimator\nest = EntropyDecomposition(def, LeonenkoProzantoSavani(Renyi(), k = 10))\nassociation(est, x, y, z)","category":"page"},{"location":"examples/examples_associations/#example_CMIRenyiJizba_EntropyDecomposition_OrdinalPatterns","page":"Associations","title":"EntropyDecomposition + OrdinalPatterns","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Random; rng = Xoshiro(1234)\nx, y, z = rand(rng, 1000), rand(rng, 1000), rand(rng, 1000)\ndef = CMIRenyiJizba(q = 1.5)\n\n# Using a plug-in Rényi entropy estimator, discretizing using ordinal patterns.\nest = EntropyDecomposition(def, PlugIn(Renyi()), CodifyVariables(OrdinalPatterns(m=2)), RelativeAmount())\nassociation(est, x, y, z)","category":"page"},{"location":"examples/examples_associations/#[TEShannon](@ref)","page":"Associations","title":"TEShannon","text":"","category":"section"},{"location":"examples/examples_associations/#example_TEShannon_EntropyDecomposition_TransferOperator","page":"Associations","title":"EntropyDecomposition + TransferOperator","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"For transfer entropy examples, we'll construct some time series for which there is time-delayed forcing between variables.","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"\nusing Associations\nusing DynamicalSystemsBase\nusing StableRNGs\nrng = StableRNG(123)\n\nBase.@kwdef struct Logistic4Chain{V, RX, RY, RZ, RW, C1, C2, C3, Σ1, Σ2, Σ3, RNG}\n xi::V = [0.1, 0.2, 0.3, 0.4]\n rx::RX = 3.9\n ry::RY = 3.6\n rz::RZ = 3.6\n rw::RW = 3.8\n c_xy::C1 = 0.4\n c_yz::C2 = 0.4\n c_zw::C3 = 0.35\n σ_xy::Σ1 = 0.05\n σ_yz::Σ2 = 0.05\n σ_zw::Σ3 = 0.05\n rng::RNG = Random.default_rng()\nend\n\nfunction eom_logistic4_chain(u, p::Logistic4Chain, t)\n (; xi, rx, ry, rz, rw, c_xy, c_yz, c_zw, σ_xy, σ_yz, σ_zw, rng) = p\n x, y, z, w = u\n f_xy = (y + c_xy*(x + σ_xy * rand(rng)) ) / (1 + c_xy*(1+σ_xy))\n f_yz = (z + c_yz*(y + σ_yz * rand(rng)) ) / (1 + c_yz*(1+σ_yz))\n f_zw = (w + c_zw*(z + σ_zw * rand(rng)) ) / (1 + c_zw*(1+σ_zw))\n dx = rx * x * (1 - x)\n dy = ry * (f_xy) * (1 - f_xy)\n dz = rz * (f_yz) * (1 - f_yz)\n dw = rw * (f_zw) * (1 - f_zw)\n return SVector{4}(dx, dy, dz, dw)\nend\n\nfunction system(definition::Logistic4Chain)\n return DiscreteDynamicalSystem(eom_logistic4_chain, definition.xi, definition)\nend\n\n# An example system where `X → Y → Z → W`.\nsys = system(Logistic4Chain(; rng))\nx, y, z, w = columns(first(trajectory(sys, 300, Ttr = 10000)))\n\nprecise = true # precise bin edges\ndiscretization = CodifyVariables(TransferOperator(RectangularBinning(2, precise))) #\nest_disc_to = EntropyDecomposition(TEShannon(), PlugIn(Shannon()), discretization);\nassociation(est_disc_to, x, y), association(est_disc_to, y, x)","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"The Shannon-type transfer entropy from x to y is stronger than from y to x, which is what we expect if x drives y.","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"association(est_disc_to, x, z), association(est_disc_to, x, z, y)","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"The Shannon-type transfer entropy from x to z is stronger than the transfer entropy from x to z given y. This is expected, because x drives z through y, so \"conditioning away\" the effect of y should decrease the estimated information transfer.","category":"page"},{"location":"examples/examples_associations/#example_TEShannon_CMIDecomposition","page":"Associations","title":"CMIDecomposition","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Random; rng = MersenneTwister(1234)\nx = rand(rng, 1000)\ny = rand(rng, 1000) .+ x\nz = rand(rng, 1000) .+ y\n\n# Estimate transfer entropy by representing it as a CMI and using the `FPVP` estimator.\nest = CMIDecomposition(TEShannon(base = 2), FPVP(k = 3))\nassociation(est, x, z, y) # should be near 0 (and can be negative)","category":"page"},{"location":"examples/examples_associations/#example_TEShannon_SymbolicTransferEntropy","page":"Associations","title":"SymbolicTransferEntropy estimator","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"The SymbolicTransferEntropy estimator is just a convenience wrapper which utilizes CodifyVariableswith the OrdinalPatterns outcome space to discretize the input time series before computing transfer entropy.","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"We'll use coupled time series from the logistic4 system above, where x → y → z → w. Thus, we expect that the association for the direction x → y is larger than for y → x. We also expect an association x → z, but the association should weaken when conditioning on the intermediate value y.","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing DynamicalSystemsBase\nusing Random; rng = Xoshiro(1234)\nsys = system(Logistic4Chain(; rng))\nx, y, z, w = columns(first(trajectory(sys, 300, Ttr = 10000)))\nest = SymbolicTransferEntropy(m = 5)\nassociation(est, x, y), association(est, y, x), association(est, x, z), association(est, x, z, y)","category":"page"},{"location":"examples/examples_associations/#example_TEShannon_estimator-comparison","page":"Associations","title":"Comparing different estimators ","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"Let's reproduce Figure 4 from Zhu et al. (2015), where they test some dedicated transfer entropy estimators on a bivariate autoregressive system. We will test","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"The Lindner and Zhu1 dedicated transfer entropy estimators, which try to eliminate bias.\nThe KraskovStögbauerGrassberger1 estimator, which computes TE naively as a sum of mutual information terms (without guaranteed cancellation of biases for the total sum).\nThe Kraskov estimator, which computes TE naively as a sum of entropy terms (without guaranteed cancellation of biases for the total sum).","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing CairoMakie\nusing Statistics\nusing Distributions: Normal\n\nfunction model2(n::Int)\n 𝒩x = Normal(0, 0.1)\n 𝒩y = Normal(0, 0.1)\n x = zeros(n+2)\n y = zeros(n+2)\n x[1] = rand(𝒩x)\n x[2] = rand(𝒩x)\n y[1] = rand(𝒩y)\n y[2] = rand(𝒩y)\n\n for i = 3:n+2\n x[i] = 0.45*sqrt(2)*x[i-1] - 0.9*x[i-2] - 0.6*y[i-2] + rand(𝒩x)\n y[i] = 0.6*x[i-2] - 0.175*sqrt(2)*y[i-1] + 0.55*sqrt(2)*y[i-2] + rand(𝒩y)\n end\n return x[3:end], y[3:end]\nend\nte_true = 0.42 # eyeball the theoretical value from their Figure 4.\n\nm = TEShannon(embedding = EmbeddingTE(dT = 2, dS = 2), base = ℯ)\nestimators = [ \n Zhu1(m, k = 8), \n Lindner(m, k = 8), \n MIDecomposition(m, KSG1(k = 8)),\n EntropyDecomposition(m, Kraskov(k = 8)),\n]\nLs = [floor(Int, 2^i) for i in 8.0:0.5:11]\nnreps = 8\ntes_xy = [[zeros(nreps) for i = 1:length(Ls)] for e in estimators]\ntes_yx = [[zeros(nreps) for i = 1:length(Ls)] for e in estimators]\nfor (k, est) in enumerate(estimators)\n for (i, L) in enumerate(Ls)\n for j = 1:nreps\n x, y = model2(L);\n tes_xy[k][i][j] = association(est, x, y)\n tes_yx[k][i][j] = association(est, y, x)\n end\n end\nend\n\nymin = minimum(map(x -> minimum(Iterators.flatten(Iterators.flatten(x))), (tes_xy, tes_yx)))\nestimator_names = [\"Zhu1\", \"Lindner\", \"KSG1\", \"Kraskov\"]\nls = [:dash, :dot, :dash, :dot]\nmr = [:rect, :hexagon, :xcross, :pentagon]\n\nfig = Figure(resolution = (800, 350))\nax_xy = Axis(fig[1,1], xlabel = \"Signal length\", ylabel = \"TE (nats)\", title = \"x → y\")\nax_yx = Axis(fig[1,2], xlabel = \"Signal length\", ylabel = \"TE (nats)\", title = \"y → x\")\nfor (k, e) in enumerate(estimators)\n label = estimator_names[k]\n marker = mr[k]\n scatterlines!(ax_xy, Ls, mean.(tes_xy[k]); label, marker)\n scatterlines!(ax_yx, Ls, mean.(tes_yx[k]); label, marker)\n hlines!(ax_xy, [te_true]; xmin = 0.0, xmax = 1.0, linestyle = :dash, color = :black) \n hlines!(ax_yx, [te_true]; xmin = 0.0, xmax = 1.0, linestyle = :dash, color = :black)\n linkaxes!(ax_xy, ax_yx)\nend\naxislegend(ax_xy, position = :rb)\n\nfig","category":"page"},{"location":"examples/examples_associations/#Reproducing-Schreiber-(2000)","page":"Associations","title":"Reproducing Schreiber (2000)","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"Let's try to reproduce the results from Schreiber's original paper (Schreiber, 2000) where he introduced the transfer entropy. We'll here use the JointProbabilities estimator, discretizing per column of the input data using the CodifyVariables discretization scheme with the ValueBinning outcome space.","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing DynamicalSystemsBase\nusing CairoMakie\nusing Statistics\nusing Random; Random.seed!(12234);\n\nfunction ulam_system(dx, x, p, t)\n f(x) = 2 - x^2\n ε = p[1]\n dx[1] = f(ε*x[length(dx)] + (1-ε)*x[1])\n for i in 2:length(dx)\n dx[i] = f(ε*x[i-1] + (1-ε)*x[i])\n end\nend\n\nds = DiscreteDynamicalSystem(ulam_system, rand(100) .- 0.5, [0.04])\nfirst(trajectory(ds, 1000; Ttr = 1000));\n\nεs = 0.02:0.02:1.0\nte_x1x2 = zeros(length(εs)); te_x2x1 = zeros(length(εs))\n# Guess an appropriate bin width of 0.2 for the histogram\ndisc = CodifyVariables(ValueHistogram(0.2))\nest = JointProbabilities(TEShannon(; base = 2), disc)\n\nfor (i, ε) in enumerate(εs)\n set_parameter!(ds, 1, ε)\n tr = first(trajectory(ds, 300; Ttr = 5000))\n X1 = tr[:, 1]; X2 = tr[:, 2]\n @assert !any(isnan, X1)\n @assert !any(isnan, X2)\n te_x1x2[i] = association(est, X1, X2)\n te_x2x1[i] = association(est, X2, X1)\nend\n\nfig = Figure(size = (800, 600))\nax = Axis(fig[1, 1], xlabel = \"epsilon\", ylabel = \"Transfer entropy (bits)\")\nlines!(ax, εs, te_x1x2, label = \"X1 to X2\", color = :black, linewidth = 1.5)\nlines!(ax, εs, te_x2x1, label = \"X2 to X1\", color = :red, linewidth = 1.5)\naxislegend(ax, position = :lt)\nreturn fig","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"As expected, transfer entropy from X1 to X2 is higher than from X2 to X1 across parameter values for ε. But, by our definition of the ulam system, dynamical coupling only occurs from X1 to X2. The results, however, show nonzero transfer entropy in both directions. What does this mean?","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"Computing transfer entropy from finite time series introduces bias, and so does any particular choice of entropy estimator used to calculate it. To determine whether a transfer entropy estimate should be trusted, we can employ surrogate testing. We'll generate surrogate using TimeseriesSurrogates.jl. One possible way to do so is to use a SurrogateAssociationTest with independence, but here we'll do the surrogate resampling manually, so we can plot and inspect the results.","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"In the example below, we continue with the same time series generated above. However, at each value of ε, we also compute transfer entropy for nsurr = 50 different randomly shuffled (permuted) versions of the source process. If the original transfer entropy exceeds that of some percentile the transfer entropy estimates of the surrogate ensemble, we will take that as \"significant\" transfer entropy.","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"nsurr = 25 # in real applications, you should use more surrogates\nbase = 2\nte_x1x2 = zeros(length(εs)); te_x2x1 = zeros(length(εs))\nte_x1x2_surr = zeros(length(εs), nsurr); te_x2x1_surr = zeros(length(εs), nsurr)\n\n# use same bin-width as before\ndisc = CodifyVariables(ValueHistogram(0.2))\nest = JointProbabilities(TEShannon(; base = 2), disc)\n\nfor (i, ε) in enumerate(εs)\n set_parameter!(ds, 1, ε)\n tr = first(trajectory(ds, 300; Ttr = 5000))\n X1 = tr[:, 1]; X2 = tr[:, 2]\n @assert !any(isnan, X1)\n @assert !any(isnan, X2)\n te_x1x2[i] = association(est, X1, X2)\n te_x2x1[i] = association(est, X2, X1)\n s1 = surrogenerator(X1, RandomShuffle()); s2 = surrogenerator(X2, RandomShuffle())\n\n for j = 1:nsurr\n te_x1x2_surr[i, j] = association(est, s1(), X2)\n te_x2x1_surr[i, j] = association(est, s2(), X1)\n end\nend\n\n# Compute 95th percentiles of the surrogates for each ε\nqs_x1x2 = [quantile(te_x1x2_surr[i, :], 0.95) for i = 1:length(εs)]\nqs_x2x1 = [quantile(te_x2x1_surr[i, :], 0.95) for i = 1:length(εs)]\n\nfig = with_theme(theme_minimal(), markersize = 2) do\n fig = Figure()\n ax = Axis(fig[1, 1], xlabel = \"epsilon\", ylabel = \"Transfer entropy (bits)\")\n scatterlines!(ax, εs, te_x1x2, label = \"X1 to X2\", color = :black, linewidth = 1.5)\n scatterlines!(ax, εs, qs_x1x2, color = :black, linestyle = :dot, linewidth = 1.5)\n scatterlines!(ax, εs, te_x2x1, label = \"X2 to X1\", color = :red)\n scatterlines!(ax, εs, qs_x2x1, color = :red, linestyle = :dot)\n axislegend(ax, position = :lt)\n return fig\nend\nfig","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"The plot above shows the original transfer entropies (solid lines) and the 95th percentile transfer entropies of the surrogate ensembles (dotted lines). As expected, using the surrogate test, the transfer entropies from X1 to X2 are mostly significant (solid black line is above dashed black line). The transfer entropies from X2 to X1, on the other hand, are mostly not significant (red solid line is below red dotted line).","category":"page"},{"location":"examples/examples_associations/#[TERenyiJizba](@ref)","page":"Associations","title":"TERenyiJizba","text":"","category":"section"},{"location":"examples/examples_associations/#example_TERenyiJizba_EntropyDecomposition_TransferOperator","page":"Associations","title":"EntropyDecomposition + TransferOperator","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"We can perform the same type of analysis as above using TERenyiJizba instead of TEShannon.","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing DynamicalSystemsBase\nusing StableRNGs; rng = StableRNG(123)\n\n# An example system where `X → Y → Z → W`.\nsys = system(Logistic4Chain(; rng))\nx, y, z, w = columns(first(trajectory(sys, 300, Ttr = 10000)))\n\nprecise = true # precise bin edges\ndiscretization = CodifyVariables(TransferOperator(RectangularBinning(2, precise))) #\nest_disc_to = EntropyDecomposition(TERenyiJizba(), PlugIn(Renyi()), discretization);\nassociation(est_disc_to, x, y), association(est_disc_to, y, x)","category":"page"},{"location":"examples/examples_associations/#[ConvergentCrossMapping](@ref)","page":"Associations","title":"ConvergentCrossMapping","text":"","category":"section"},{"location":"examples/examples_associations/#example_ConvergentCrossMapping_RandomVectors","page":"Associations","title":"RandomVectors estimator","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"When cross-mapping with the RandomVectors estimator, a single random subsample of time indices (i.e. not in any particular order) of length l is drawn for each library size l, and cross mapping is performed using the embedding vectors corresponding to those time indices.","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Random; rng = MersenneTwister(1234)\nx, y = randn(rng, 200), randn(rng, 200)\n\n# We'll draw a single sample at each `l ∈ libsizes`. Sampling with replacement is then\n# necessary, because our 200-pt timeseries will result in embeddings with\n# less than 200 points.\nest = RandomVectors(ConvergentCrossMapping(d = 3); libsizes = 50:25:200, replace = true, rng)\ncrossmap(est, x, y)","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"To generate a distribution of cross-map estimates for each l ∈ libsizes, just call crossmap repeatedly, e.g.","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Random; rng = MersenneTwister(1234)\nusing Statistics\n\nx, y = randn(rng, 300), randn(rng, 300)\ndef = ConvergentCrossMapping(d = 3)\nlibsizes = 25:25:200\n\nρs = [[crossmap(RandomVectors(def; libsizes = L, replace = true, rng), x, y) for i = 1:50] for L in libsizes]\n\nusing CairoMakie\nf = Figure(); ax = Axis(f[1, 1]);\nplot!(ax, libsizes, mean.(ρs))\nerrorbars!(ax, libsizes, mean.(ρs), std.(ρs))\nf","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"Now, the k-th element of ρs contains 80 estimates of the correspondence measure ρ at library size libsizes[k].","category":"page"},{"location":"examples/examples_associations/#example_ConvergentCrossMapping_RandomSegment","page":"Associations","title":"RandomSegment estimator","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"When cross-mapping with the RandomSegment estimator, a single random subsample of continguous, ordered time indices of length l is drawn for each library size l, and cross mapping is performed using the embedding vectors corresponding to those time indices.","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Random; rng = MersenneTwister(1234)\nx, y = randn(rng, 200), randn(rng, 200)\n\n# We'll draw a single sample at each `l ∈ libsizes`. We limit the library size to 100, \n# because drawing segments of the data longer than half the available data doesn't make\n# much sense.\nest = RandomSegment(ConvergentCrossMapping(d = 3); libsizes = 50:25:100, rng)\ncrossmap(est, x, y)","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"As above, to generate a distribution of cross-map estimates for each l ∈ libsizes, just call crossmap repeatedly, e.g.","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Random; rng = MersenneTwister(1234)\nusing Statistics\n\nx, y = randn(rng, 200), randn(rng, 200)\ndef = ConvergentCrossMapping(d = 3)\nlibsizes = 25:25:100\n\nρs = [[crossmap(RandomSegment(def; libsizes = L, rng), x, y) for i = 1:50] for L in libsizes]\n\nf = Figure(); ax = Axis(f[1, 1]);\nplot!(ax, libsizes, mean.(ρs))\nerrorbars!(ax, libsizes, mean.(ρs), std.(ρs))\nf","category":"page"},{"location":"examples/examples_associations/#[PairwiseAsymmetricInference](@ref)","page":"Associations","title":"PairwiseAsymmetricInference","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"We repeat the analyses above, but here use the pairwise asymmetric inference algorithm instead of the convergent cross map algorithm.","category":"page"},{"location":"examples/examples_associations/#example_PairwiseAsymmetricInference_RandomVectors","page":"Associations","title":"RandomVectors estimator","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Random; rng = MersenneTwister(1234)\nx, y = randn(rng, 300), randn(rng, 300)\n\n# We'll draw a single sample at each `l ∈ libsizes`. Sampling with replacement is then\n# necessary, because our 200-pt timeseries will result in embeddings with\n# less than 200 points.\nest = RandomVectors(PairwiseAsymmetricInference(d = 3); libsizes = 50:25:200, replace = true, rng)\ncrossmap(est, x, y)","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"To generate a distribution of cross-map estimates for each l ∈ libsizes, just call crossmap repeatedly, e.g.","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Random; rng = MersenneTwister(1234)\nusing Statistics\n\nx, y = randn(rng, 300), randn(rng,300)\ndef = PairwiseAsymmetricInference(d = 3)\nlibsizes = 25:25:200\n\nρs = [[crossmap(RandomVectors(def; libsizes = L, replace = true, rng), x, y) for i = 1:50] for L in libsizes]\n\nusing CairoMakie\nf = Figure(); ax = Axis(f[1, 1]);\nplot!(ax, libsizes, mean.(ρs))\nerrorbars!(ax, libsizes, mean.(ρs), std.(ρs))\nf","category":"page"},{"location":"examples/examples_associations/#example_PairwiseAsymmetricInference_RandomSegment","page":"Associations","title":"RandomSegment estimator","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Random; rng = MersenneTwister(1234)\nx, y = randn(rng, 200), randn(rng, 200)\n\n# We'll draw a single sample at each `l ∈ libsizes`. We limit the library size to 100, \n# because drawing segments of the data longer than half the available data doesn't make\n# much sense.\nest = RandomSegment(PairwiseAsymmetricInference(d = 3); libsizes = 50:25:100, rng)\ncrossmap(est, x, y)","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"As above, to generate a distribution of cross-map estimates for each l ∈ libsizes, just call crossmap repeatedly, e.g.","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Random; rng = MersenneTwister(1234)\nusing Statistics\n\nx, y = randn(rng, 300), randn(rng, 300)\ndef = PairwiseAsymmetricInference(d = 3)\nlibsizes = 25:25:100\n\nρs = [[crossmap(RandomSegment(def; libsizes = L, rng), x, y) for i = 1:50] for L in libsizes]\n\nusing CairoMakie\nf = Figure(); ax = Axis(f[1, 1]);\nplot!(ax, libsizes, mean.(ρs))\nerrorbars!(ax, libsizes, mean.(ρs), std.(ρs))\nf","category":"page"},{"location":"examples/examples_associations/#example_MCR","page":"Associations","title":"MCR","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"To quantify association by the mean conditional probability of recurrence (MCR), we'll create a chain of variables where X drives Y, which in turn drives Z. We then expect there to be significant detectable association between both X and Y, Y and Z and also X and Z (because Y transfers information from X to Z. We expect the association between X and Z to disappear when conditioning on Y (since we're then \"removing the effect\" of Y).","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Random; rng = Xoshiro(1234);\nx = rand(rng, 300); y = rand(rng, 300) .* sin.(x); z = rand(rng, 300) .* y;\nest = MCR(r = 0.5)\nassociation(est, x, y), association(est, x, z), association(est, y, z), association(est, x, z, y)","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"The interpretation of the MCR measure is that if two variables are symmetrically coupled, then the conditional recurrence in both directions is equal. Two variables that are uncoupled are symmetrically coupled (i.e. no coupling). We therefore expect the difference in conditional recurrence to be around zero.","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Random; rng = Xoshiro(1234)\nx = rand(rng, 300)\ny = rand(rng, 300)\nm = MCR(r = 0.5)\nΔ = association(m, x, y) - association(m, y, x)","category":"page"},{"location":"examples/examples_associations/#example_RMCD","page":"Associations","title":"RMCD","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"To quantify association by the recurrence measure of conditional dependence (RMCD), we'll create a chain of variables where X drives Y, which in turn drives Z. We then expect there to be significant detectable association between both X and Y, Y and Z and also X and Z (because Y transfers information from X to Z. We expect the association between X and Z to disappear when conditioning on Y (since we're then \"removing the effect\" of Y).","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Random; rng = Xoshiro(1234);\nx = rand(rng, 300); y = rand(rng, 300) .* sin.(x); z = rand(rng, 300) .* y;\nest = RMCD(r = 0.5)\nassociation(est, x, y), association(est, x, z), association(est, x, z, y)","category":"page"},{"location":"examples/examples_associations/#example_ChatterjeeCorrelation","page":"Associations","title":"ChatterjeeCorrelation","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Random; rng = Xoshiro(1234);\nx = rand(rng, 120)\ny = rand(rng, 120) .* sin.(x)","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"By construction, there will almust surely be no ties in x, so we can use the fast estimate by setting handle_ties == false. ","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"association(ChatterjeeCorrelation(handle_ties = false), x, y)","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"If we have data where we know there are ties in the data, then we should set handle_ties == true.","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"w = rand(rng, 1:10, 120) # there will be some ties\nz = rand(rng, 1:15, 120) .* sin.(w) # introduce some dependence\nassociation(ChatterjeeCorrelation(handle_ties = true), w, z)","category":"page"},{"location":"examples/examples_associations/#example_AzadkiaChatterjeeCoefficient","page":"Associations","title":"AzadkiaChatterjeeCoefficient","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Random; rng = Xoshiro(1234);\nx = rand(rng, 120)\ny = rand(rng, 120) .* x\nz = rand(rng, 120) .+ y","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"For the variables above, where x → y → z, we expect stronger assocation between x and y than between x and z. We also expect the strength of the association between x and z to drop when conditioning on y, because y is the variable that connects x and z.","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"m = AzadkiaChatterjeeCoefficient(theiler = 0) # only exclude self-neighbors\nassociation(m, x, y), association(m, x, z), association(m, x, z, y)","category":"page"},{"location":"api/information_single_variable_api/","page":"Single-variable information API","title":"Single-variable information API","text":"CollapsedDocStrings = true","category":"page"},{"location":"api/information_single_variable_api/#Single-variable-information-API","page":"Single-variable information API","title":"Single-variable information API","text":"","category":"section"},{"location":"api/information_single_variable_api/","page":"Single-variable information API","title":"Single-variable information API","text":"Below we list some relevant functions types from ComplexityMeasures.jl that are used for the EntropyDecomposition estimator.","category":"page"},{"location":"api/information_single_variable_api/","page":"Single-variable information API","title":"Single-variable information API","text":"information","category":"page"},{"location":"api/information_single_variable_api/#ComplexityMeasures.information","page":"Single-variable information API","title":"ComplexityMeasures.information","text":"information([die::DiscreteInfoEstimator,] [est::ProbabilitiesEstimator,] o::OutcomeSpace, x) → h::Real\ninformation(o::OutcomeSpace, x) → h::Real\n\nEstimate a discrete information measure from input data x using the provided DiscreteInfoEstimator and ProbabilitiesEstimator over the given OutcomeSpace.\n\nAs an alternative, you can provide an InformationMeasure for the first argument (die) which will default to PlugIn estimation) for the information estimation. You may also skip the first argument (die), in which case Shannon() will be used. You may also skip the second argument (est), which will default to the RelativeAmount probabilities estimator. Note that some information measure estimators (e.g., GeneralizedSchuermann) operate directly on counts and hence ignore est.\n\ninformation([e::DiscreteInfoEstimator,] p::Probabilities) → h::Real\ninformation([e::DiscreteInfoEstimator,] c::Counts) → h::Real\n\nLike above, but estimate the information measure from the pre-computed Probabilities p or Counts. Counts are converted into probabilities using RelativeAmount, unless the estimator e uses counts directly.\n\nSee also: information_maximum, information_normalized for a normalized version.\n\nExamples (naive estimation)\n\nThe simplest way to estimate a discrete measure is to provide the InformationMeasure directly in combination with an OutcomeSpace. This will use the \"naive\" PlugIn estimator for the measure, and the \"naive\" RelativeAmount estimator for the probabilities.\n\nx = randn(100) # some input data\no = ValueBinning(RectangularBinning(5)) # a 5-bin histogram outcome space\nh_s = information(Shannon(), o, x)\n\nHere are some more examples:\n\nx = [rand(Bool) for _ in 1:10000] # coin toss\nps = probabilities(x) # gives about [0.5, 0.5] by definition\nh = information(ps) # gives 1, about 1 bit by definition (Shannon entropy by default)\nh = information(Shannon(), ps) # syntactically equivalent to the above\nh = information(Shannon(), UniqueElements(), x) # syntactically equivalent to above\nh = information(Renyi(2.0), ps) # also gives 1, order `q` doesn't matter for coin toss\nh = information(OrdinalPatterns(;m=3), x) # gives about 2, again by definition\n\nExamples (bias-corrected estimation)\n\nIt is known that both PlugIn estimation for information measures and RelativeAmount estimation for probabilities are biased. The scientific literature abounds with estimators that correct for this bias, both on the measure-estimation level and on the probability-estimation level. We thus provide the option to use any DiscreteInfoEstimator in combination with any ProbabilitiesEstimator for improved estimates. Note that custom probabilites estimators will only work with counting-compatible OutcomeSpace.\n\nx = randn(100)\no = ValueBinning(RectangularBinning(5))\n\n# Estimate Shannon entropy estimation using various dedicated estimators\nh_s = information(MillerMadow(Shannon()), RelativeAmount(), o, x)\nh_s = information(HorvitzThompson(Shannon()), Shrinkage(), o, x)\nh_s = information(Schuermann(Shannon()), Shrinkage(), o, x)\n\n# Estimate information measures using the generic `Jackknife` estimator\nh_r = information(Jackknife(Renyi()), Shrinkage(), o, x)\nj_t = information(Jackknife(TsallisExtropy()), BayesianRegularization(), o, x)\nj_r = information(Jackknife(RenyiExtropy()), RelativeAmount(), o, x)\n\n\n\n\n\ninformation(est::DifferentialInfoEstimator, x) → h::Real\n\nEstimate a differential information measure using the provided DifferentialInfoEstimator and input data x.\n\nDescription\n\nThe overwhelming majority of differential estimators estimate the Shannon entropy. If the same estimator can estimate different information measures (e.g. it can estimate both Shannon and Tsallis), then the information measure is provided as an argument to the estimator itself.\n\nSee the table of differential information measure estimators in the docs for all differential information measure estimators.\n\nCurrently, unlike for the discrete information measures, this method doesn't involve explicitly first computing a probability density function and then passing this density to an information measure definition. But in the future, we want to establish a density API similar to the probabilities API.\n\nExamples\n\nTo compute the differential version of a measure, give it as the first argument to a DifferentialInfoEstimator and pass it to information.\n\nx = randn(1000)\nh_sh = information(Kraskov(Shannon()), x)\nh_vc = information(Vasicek(Shannon()), x)\n\nA normal distribution has a base-e Shannon differential entropy of 0.5*log(2π) + 0.5 nats.\n\nest = Kraskov(k = 5, base = ℯ) # Base `ℯ` for nats.\nh = information(est, randn(2_000_000))\nabs(h - 0.5*log(2π) - 0.5) # ≈ 0.0001\n\n\n\n\n\ninformation(est::MultivariateInformationMeasureEstimator, x...)\n\nEstimate some MultivariateInformationMeasure on input data x..., using the given MultivariateInformationMeasureEstimator.\n\nThis is just a convenience wrapper around association(est, x...).\n\n\n\n\n\n","category":"function"},{"location":"api/information_single_variable_api/#Single-variable-information-measures","page":"Single-variable information API","title":"Single-variable information measures","text":"","category":"section"},{"location":"api/information_single_variable_api/","page":"Single-variable information API","title":"Single-variable information API","text":"Shannon\nRenyi\nTsallis\nKaniadakis","category":"page"},{"location":"api/information_single_variable_api/#ComplexityMeasures.Shannon","page":"Single-variable information API","title":"ComplexityMeasures.Shannon","text":"Shannon <: InformationMeasure\nShannon(; base = 2)\n\nThe Shannon (Shannon, 1948) entropy, used with information to compute:\n\nH(p) = - sum_i pi log(pi)\n\nwith the log at the given base.\n\nThe maximum value of the Shannon entropy is log_base(L), which is the entropy of the uniform distribution with L the total_outcomes.\n\n\n\n\n\n","category":"type"},{"location":"api/information_single_variable_api/#ComplexityMeasures.Renyi","page":"Single-variable information API","title":"ComplexityMeasures.Renyi","text":"Renyi <: InformationMeasure\nRenyi(q, base = 2)\nRenyi(; q = 1.0, base = 2)\n\nThe Rényi generalized order-q entropy (Rényi, 1961), used with information to compute an entropy with units given by base (typically 2 or MathConstants.e).\n\nDescription\n\nLet p be an array of probabilities (summing to 1). Then the Rényi generalized entropy is\n\nH_q(p) = frac11-q log left(sum_i pi^qright)\n\nand generalizes other known entropies, like e.g. the information entropy (q = 1, see Shannon (1948)), the maximum entropy (q=0, also known as Hartley entropy), or the correlation entropy (q = 2, also known as collision entropy).\n\nThe maximum value of the Rényi entropy is log_base(L), which is the entropy of the uniform distribution with L the total_outcomes.\n\n\n\n\n\n","category":"type"},{"location":"api/information_single_variable_api/#ComplexityMeasures.Tsallis","page":"Single-variable information API","title":"ComplexityMeasures.Tsallis","text":"Tsallis <: InformationMeasure\nTsallis(q; k = 1.0, base = 2)\nTsallis(; q = 1.0, k = 1.0, base = 2)\n\nThe Tsallis generalized order-q entropy (Tsallis, 1988), used with information to compute an entropy.\n\nbase only applies in the limiting case q == 1, in which the Tsallis entropy reduces to Shannon entropy.\n\nDescription\n\nThe Tsallis entropy is a generalization of the Boltzmann-Gibbs entropy, with k standing for the Boltzmann constant. It is defined as\n\nS_q(p) = frackq - 1left(1 - sum_i pi^qright)\n\nThe maximum value of the Tsallis entropy is k(L^1 - q - 1)(1 - q), with L the total_outcomes.\n\n\n\n\n\n","category":"type"},{"location":"api/information_single_variable_api/#ComplexityMeasures.Kaniadakis","page":"Single-variable information API","title":"ComplexityMeasures.Kaniadakis","text":"Kaniadakis <: InformationMeasure\nKaniadakis(; κ = 1.0, base = 2.0)\n\nThe Kaniadakis entropy (Tsallis, 2009), used with information to compute\n\nH_K(p) = -sum_i=1^N p_i f_kappa(p_i)\n\nf_kappa (x) = dfracx^kappa - x^-kappa2kappa\n\nwhere if kappa = 0, regular logarithm to the given base is used, and 0 probabilities are skipped.\n\n\n\n\n\n","category":"type"},{"location":"api/information_single_variable_api/#Discrete-information-estimators","page":"Single-variable information API","title":"Discrete information estimators","text":"","category":"section"},{"location":"api/information_single_variable_api/","page":"Single-variable information API","title":"Single-variable information API","text":"DiscreteInfoEstimator\nPlugIn\nMillerMadow\nSchuermann\nGeneralizedSchuermann\nJackknife\nHorvitzThompson\nChaoShen","category":"page"},{"location":"api/information_single_variable_api/#ComplexityMeasures.DiscreteInfoEstimator","page":"Single-variable information API","title":"ComplexityMeasures.DiscreteInfoEstimator","text":"DiscreteInfoEstimator\n\nThe supertype of all discrete information measure estimators, which are used in combination with a ProbabilitiesEstimator as input to information or related functions.\n\nThe first argument to a discrete estimator is always an InformationMeasure (defaults to Shannon).\n\nDescription\n\nA discrete InformationMeasure is a functional of a probability mass function. To estimate such a measure from data, we must first estimate a probability mass function using a ProbabilitiesEstimator from the (encoded/discretized) input data, and then apply the estimator to the estimated probabilities. For example, the Shannon entropy is typically computed using the RelativeAmount estimator to compute probabilities, which are then given to the PlugIn estimator. Many other estimators exist, not only for Shannon entropy, but other information measures as well.\n\nWe provide a library of both generic estimators such as PlugIn or Jackknife (which can be applied to any measure), as well as dedicated estimators such as MillerMadow, which computes Shannon entropy using the Miller-Madow bias correction. The list below gives a complete overview.\n\nImplementations\n\nThe following estimators are generic and can compute any InformationMeasure.\n\nPlugIn. The default, generic plug-in estimator of any information measure. It computes the measure exactly as stated in the definition, using the computed probability mass function.\nJackknife. Uses the a combination of the plug-in estimator and the jackknife principle to estimate the information measure.\n\nShannon entropy estimators\n\nThe following estimators are dedicated Shannon entropy estimators, which provide improvements over the naive PlugIn estimator.\n\nMillerMadow.\nHorvitzThompson.\nSchuermann.\nGeneralizedSchuermann.\nChaoShen.\n\ninfo: Info\nAny of the implemented DiscreteInfoEstimators can be used in combination with any ProbabilitiesEstimator as input to information. What this means is that every estimator actually comes in many different variants - one for each ProbabilitiesEstimator. For example, the MillerMadow estimator of Shannon entropy is typically calculated with RelativeAmount probabilities. But here, you can use for example the BayesianRegularization or the Shrinkage probabilities estimators instead, i.e. information(MillerMadow(), RelativeAmount(outcome_space), x) and information(MillerMadow(), BayesianRegularization(outcomes_space), x) are distinct estimators. This holds for all DiscreteInfoEstimators. Many of these estimators haven't been explored in the literature before, so feel free to explore, and please cite this software if you use it to explore some new estimator combination!\n\n\n\n\n\n","category":"type"},{"location":"api/information_single_variable_api/#ComplexityMeasures.PlugIn","page":"Single-variable information API","title":"ComplexityMeasures.PlugIn","text":"PlugIn(e::InformationMeasure) <: DiscreteInfoEstimatorGeneric\n\nThe PlugIn estimator is also called the empirical/naive/\"maximum likelihood\" estimator, and is used with information to any discrete InformationMeasure.\n\nIt computes any quantity exactly as given by its formula. When computing an information measure, which here is defined as a probabilities functional, it computes the quantity directly from a probability mass function, which is derived from maximum-likelihood (RelativeAmount estimates of the probabilities.\n\nBias of plug-in estimates\n\nThe plugin-estimator of Shannon entropy underestimates the true entropy, with a bias that grows with the number of distinct outcomes (Arora et al., 2022)(Arora et al., 2022),\n\nbias(H_S^plugin) = -dfracK-12N + o(N^-1)\n\nwhere K is the number of distinct outcomes, and N is the sample size. Many authors have tried to remedy this by proposing alternative Shannon entropy estimators. For example, the MillerMadow estimator is a simple correction to the plug-in estimator that adds back the bias term above. Many other estimators exist; see DiscreteInfoEstimators for an overview.\n\n\n\n\n\n","category":"type"},{"location":"api/information_single_variable_api/#ComplexityMeasures.MillerMadow","page":"Single-variable information API","title":"ComplexityMeasures.MillerMadow","text":"MillerMadow <: DiscreteInfoEstimatorShannon\nMillerMadow(measure::Shannon = Shannon())\n\nThe MillerMadow estimator is used with information to compute the discrete Shannon entropy according to Miller (1955).\n\nDescription\n\nThe Miller-Madow estimator of Shannon entropy is given by\n\nH_S^MM = H_S^plugin + dfracm - 12N\n\nwhere H_S^plugin is the Shannon entropy estimated using the PlugIn estimator, m is the number of bins with nonzero probability (as defined in Paninski (2003)), and N is the number of observations.\n\n\n\n\n\n","category":"type"},{"location":"api/information_single_variable_api/#ComplexityMeasures.Schuermann","page":"Single-variable information API","title":"ComplexityMeasures.Schuermann","text":"Schuermann <: DiscreteInfoEstimatorShannon\nSchuermann(definition::Shannon; a = 1.0)\n\nThe Schuermann estimator is used with information to compute the discrete Shannon entropy with the bias-corrected estimator given in Schuermann (2004).\n\nSee detailed description for GeneralizedSchuermann for details.\n\n\n\n\n\n","category":"type"},{"location":"api/information_single_variable_api/#ComplexityMeasures.GeneralizedSchuermann","page":"Single-variable information API","title":"ComplexityMeasures.GeneralizedSchuermann","text":"GeneralizedSchuermann <: DiscreteInfoEstimatorShannon\nGeneralizedSchuermann(definition = Shannon(); a = 1.0)\n\nThe GeneralizedSchuermann estimator is used with information to compute the discrete Shannon entropy with the bias-corrected estimator given in Grassberger (2022).\n\nThe \"generalized\" part of the name, as opposed to the Schuermann (2004) estimator (Schuermann), is due to the possibility of picking difference parameters a_i for different outcomes. If different parameters are assigned to the different outcomes, a must be a vector of parameters of length length(outcomes), where the outcomes are obtained using outcomes. See Grassberger (2022) for more information. If a is a real number, then a_i = a forall i, and the estimator reduces to the Schuermann estimator.\n\nDescription\n\nFor a set of N observations over M outcomes, the estimator is given by\n\nH_S^opt = varphi(N) - dfrac1N sum_i=1^M n_i G_n_i(a_i)\n\nwhere n_i is the observed frequency of the i-th outcome,\n\nG_n(a) = varphi(n) + (-1)^n int_0^a dfracx^n - 1x + 1 dx\n\nG_n(1) = G_n and G_n(0) = varphi(n), and\n\nG_n = varphi(n) + (-1)^n int_0^1 dfracx^n - 1x + 1 dx\n\n\n\n\n\n","category":"type"},{"location":"api/information_single_variable_api/#ComplexityMeasures.Jackknife","page":"Single-variable information API","title":"ComplexityMeasures.Jackknife","text":"Jackknife <: DiscreteInfoEstimatorGeneric\nJackknife(definition::InformationMeasure = Shannon())\n\nThe Jackknife estimator is used with information to compute any discrete InformationMeasure.\n\nThe Jackknife estimator uses the generic jackknife principle to reduce bias. Zahl (1977) was the first to apply the jaccknife technique in the context of Shannon entropy estimation. Here, we've generalized his estimator to work with any InformationMeasure.\n\nDescription\n\nAs an example of the jackknife technique, here is the formula for a jackknife estimate of Shannon entropy\n\nH_S^J = N H_S^plugin - dfracN-1N sum_i=1^N H_S^plugin^-i\n\nwhere N is the sample size, H_S^plugin is the plugin estimate of Shannon entropy, and H_S^plugin^-i is the plugin estimate, but computed with the i-th sample left out.\n\n\n\n\n\n","category":"type"},{"location":"api/information_single_variable_api/#ComplexityMeasures.HorvitzThompson","page":"Single-variable information API","title":"ComplexityMeasures.HorvitzThompson","text":"HorvitzThompson <: DiscreteInfoEstimatorShannon\nHorvitzThompson(measure::Shannon = Shannon())\n\nThe HorvitzThompson estimator is used with information to compute the discrete Shannon entropy according to Horvitz and Thompson (1952).\n\nDescription\n\nThe Horvitz-Thompson estimator of Shannon entropy is given by\n\nH_S^HT = -sum_i=1^M dfracp_i log(p_i) 1 - (1 - p_i)^N\n\nwhere N is the sample size and M is the number of outcomes. Given the true probability p_i of the i-th outcome, 1 - (1 - p_i)^N is the probability that the outcome appears at least once in a sample of size N (Arora et al., 2022). Dividing by this inclusion probability is a form of weighting, and compensates for situations where certain outcomes have so low probabilities that they are not often observed in a sample, for example in power-law distributions.\n\n\n\n\n\n","category":"type"},{"location":"api/information_single_variable_api/#ComplexityMeasures.ChaoShen","page":"Single-variable information API","title":"ComplexityMeasures.ChaoShen","text":"ChaoShen <: DiscreteInfoEstimatorShannon\nChaoShen(definition::Shannon = Shannon())\n\nThe ChaoShen estimator is used with information to compute the discrete Shannon entropy according to Chao and Shen (2003).\n\nDescription\n\nThis estimator is a modification of the HorvitzThompson estimator that multiplies each plugin probability estimate by an estimate of sample coverage. If f_1 is the number of singletons (outcomes that occur only once) in a sample of length N, then the sample coverage is C = 1 - dfracf_1N. The Chao-Shen estimator of Shannon entropy is then\n\nH_S^CS = -sum_i=1^M left( dfracC p_i log(C p_i)1 - (1 - C p_i)^N right)\n\nwhere N is the sample size and M is the number of outcomes. If f_1 = N, then f_1 is set to f_1 = N - 1 to ensure positive entropy (Arora et al., 2022).\n\n\n\n\n\n","category":"type"},{"location":"api/information_single_variable_api/#Differential-information-estimators","page":"Single-variable information API","title":"Differential information estimators","text":"","category":"section"},{"location":"api/information_single_variable_api/","page":"Single-variable information API","title":"Single-variable information API","text":"DifferentialInfoEstimator\nKraskov\nKozachenkoLeonenko\nZhu\nZhuSingh\nGao\nGoria\nLord\nLeonenkoProzantoSavani\nVasicek\nAlizadehArghami\nEbrahimi\nCorrea","category":"page"},{"location":"api/information_single_variable_api/#ComplexityMeasures.DifferentialInfoEstimator","page":"Single-variable information API","title":"ComplexityMeasures.DifferentialInfoEstimator","text":"DifferentialInfoEstimator\n\nThe supertype of all differential information measure estimators. These estimators compute an information measure in various ways that do not involve explicitly estimating a probability distribution.\n\nEach DifferentialInfoEstimators uses a specialized technique to approximate relevant densities/integrals, and is often tailored to one or a few types of information measures. For example, Kraskov estimates the Shannon entropy.\n\nSee information for usage.\n\nImplementations\n\nKozachenkoLeonenko.\nKraskov.\nGoria.\nGao.\nZhu\nZhuSingh.\nLord.\nAlizadehArghami.\nCorrea.\nVasicek.\nEbrahimi.\nLeonenkoProzantoSavani.\n\n\n\n\n\n","category":"type"},{"location":"api/information_single_variable_api/#ComplexityMeasures.Kraskov","page":"Single-variable information API","title":"ComplexityMeasures.Kraskov","text":"Kraskov <: DifferentialInfoEstimator\nKraskov(definition = Shannon(); k::Int = 1, w::Int = 0)\n\nThe Kraskov estimator computes the Shannon differential information of a multi-dimensional StateSpaceSet using the k-th nearest neighbor searches method from Kraskov et al. (2004), with logarithms to the base specified in definition.\n\nw is the Theiler window, which determines if temporal neighbors are excluded during neighbor searches (defaults to 0, meaning that only the point itself is excluded when searching for neighbours).\n\nDescription\n\nAssume we have samples bfx_1 bfx_2 ldots bfx_N from a continuous random variable X in mathbbR^d with support mathcalX and density functionf mathbbR^d to mathbbR. Kraskov estimates the Shannon differential entropy\n\nH(X) = int_mathcalX f(x) log f(x) dx = mathbbE-log(f(X))\n\nSee also: information, KozachenkoLeonenko, DifferentialInfoEstimator.\n\n\n\n\n\n","category":"type"},{"location":"api/information_single_variable_api/#ComplexityMeasures.KozachenkoLeonenko","page":"Single-variable information API","title":"ComplexityMeasures.KozachenkoLeonenko","text":"KozachenkoLeonenko <: DifferentialInfoEstimator\nKozachenkoLeonenko(definition = Shannon(); w::Int = 0)\n\nThe KozachenkoLeonenko estimator (Kozachenko and Leonenko, 1987) computes the Shannon differential information of a multi-dimensional StateSpaceSet, with logarithms to the base specified in definition.\n\nDescription\n\nAssume we have samples bfx_1 bfx_2 ldots bfx_N from a continuous random variable X in mathbbR^d with support mathcalX and density functionf mathbbR^d to mathbbR. KozachenkoLeonenko estimates the Shannon differential entropy\n\nH(X) = int_mathcalX f(x) log f(x) dx = mathbbE-log(f(X))\n\nusing the nearest neighbor method from Kozachenko and Leonenko (1987), as described in Charzyńska and Gambin (2016).\n\nw is the Theiler window, which determines if temporal neighbors are excluded during neighbor searches (defaults to 0, meaning that only the point itself is excluded when searching for neighbours).\n\nIn contrast to Kraskov, this estimator uses only the closest neighbor.\n\nSee also: information, Kraskov, DifferentialInfoEstimator.\n\n\n\n\n\n","category":"type"},{"location":"api/information_single_variable_api/#ComplexityMeasures.Zhu","page":"Single-variable information API","title":"ComplexityMeasures.Zhu","text":"Zhu <: DifferentialInfoEstimator\nZhu(; definition = Shannon(), k = 1, w = 0)\n\nThe Zhu estimator (Zhu et al., 2015) is an extension to KozachenkoLeonenko, and computes the Shannon differential information of a multi-dimensional StateSpaceSet, with logarithms to the base specified in definition.\n\nDescription\n\nAssume we have samples bfx_1 bfx_2 ldots bfx_N from a continuous random variable X in mathbbR^d with support mathcalX and density functionf mathbbR^d to mathbbR. Zhu estimates the Shannon differential entropy\n\nH(X) = int_mathcalX f(x) log f(x) dx = mathbbE-log(f(X))\n\nby approximating densities within hyperrectangles surrounding each point xᵢ ∈ x using using k nearest neighbor searches. w is the Theiler window, which determines if temporal neighbors are excluded during neighbor searches (defaults to 0, meaning that only the point itself is excluded when searching for neighbours).\n\nSee also: information, KozachenkoLeonenko, DifferentialInfoEstimator.\n\n\n\n\n\n","category":"type"},{"location":"api/information_single_variable_api/#ComplexityMeasures.ZhuSingh","page":"Single-variable information API","title":"ComplexityMeasures.ZhuSingh","text":"ZhuSingh <: DifferentialInfoEstimator\nZhuSingh(definition = Shannon(); k = 1, w = 0)\n\nThe ZhuSingh estimator (Zhu et al., 2015) computes the Shannon differential information of a multi-dimensional StateSpaceSet, with logarithms to the base specified in definition.\n\nDescription\n\nAssume we have samples bfx_1 bfx_2 ldots bfx_N from a continuous random variable X in mathbbR^d with support mathcalX and density functionf mathbbR^d to mathbbR. ZhuSingh estimates the Shannon differential entropy\n\nH(X) = int_mathcalX f(x) log f(x) dx = mathbbE-log(f(X))\n\nLike Zhu, this estimator approximates probabilities within hyperrectangles surrounding each point xᵢ ∈ x using using k nearest neighbor searches. However, it also considers the number of neighbors falling on the borders of these hyperrectangles. This estimator is an extension to the entropy estimator in Singh et al. (2003).\n\nw is the Theiler window, which determines if temporal neighbors are excluded during neighbor searches (defaults to 0, meaning that only the point itself is excluded when searching for neighbours).\n\nSee also: information, DifferentialInfoEstimator.\n\n\n\n\n\n","category":"type"},{"location":"api/information_single_variable_api/#ComplexityMeasures.Gao","page":"Single-variable information API","title":"ComplexityMeasures.Gao","text":"Gao <: DifferentialInfoEstimator\nGao(definition = Shannon(); k = 1, w = 0, corrected = true)\n\nThe Gao estimator (Gao et al., 09–12 May 2015) computes the Shannon differential information, using a k-th nearest-neighbor approach based on Singh et al. (2003), with logarithms to the base specified in definition.\n\nw is the Theiler window, which determines if temporal neighbors are excluded during neighbor searches (defaults to 0, meaning that only the point itself is excluded when searching for neighbours).\n\nGao et al. (09–12 May 2015) give two variants of this estimator. If corrected == false, then the uncorrected version is used. If corrected == true, then the corrected version is used, which ensures that the estimator is asymptotically unbiased.\n\nDescription\n\nAssume we have samples bfx_1 bfx_2 ldots bfx_N from a continuous random variable X in mathbbR^d with support mathcalX and density functionf mathbbR^d to mathbbR. KozachenkoLeonenko estimates the Shannon differential entropy\n\nH(X) = int_mathcalX f(x) log f(x) dx = mathbbE-log(f(X))\n\n\n\n\n\n","category":"type"},{"location":"api/information_single_variable_api/#ComplexityMeasures.Goria","page":"Single-variable information API","title":"ComplexityMeasures.Goria","text":"Goria <: DifferentialInfoEstimator\nGoria(measure = Shannon(); k = 1, w = 0)\n\nThe Goria estimator (Goria et al., 2005) computes the Shannon differential information of a multi-dimensional StateSpaceSet, with logarithms to the base specified in definition.\n\nDescription\n\nAssume we have samples bfx_1 bfx_2 ldots bfx_N from a continuous random variable X in mathbbR^d with support mathcalX and density functionf mathbbR^d to mathbbR. Goria estimates the Shannon differential entropy\n\nH(X) = int_mathcalX f(x) log f(x) dx = mathbbE-log(f(X))\n\nSpecifically, let bfn_1 bfn_2 ldots bfn_N be the distance of the samples bfx_1 bfx_2 ldots bfx_N to their k-th nearest neighbors. Next, let the geometric mean of the distances be\n\nhatrho_k = left( prod_i=1^N right)^dfrac1N\n\nGoria et al. (2005)'s estimate of Shannon differential entropy is then\n\nhatH = mhatrho_k + log(N - 1) - psi(k) + log c_1(m)\n\nwhere c_1(m) = dfrac2pi^fracm2m Gamma(m2) and psi is the digamma function.\n\n\n\n\n\n","category":"type"},{"location":"api/information_single_variable_api/#ComplexityMeasures.Lord","page":"Single-variable information API","title":"ComplexityMeasures.Lord","text":"Lord <: DifferentialInfoEstimator\nLord(measure = Shannon(); k = 10, w = 0)\n\nThe Lord estimator (Lord et al., 2018) estimates the Shannon differential information using a nearest neighbor approach with a local nonuniformity correction (LNC), with logarithms to the base specified in definition.\n\nw is the Theiler window, which determines if temporal neighbors are excluded during neighbor searches (defaults to 0, meaning that only the point itself is excluded when searching for neighbours).\n\nDescription\n\nAssume we have samples barX = bfx_1 bfx_2 ldots bfx_N from a continuous random variable X in mathbbR^d with support mathcalX and density function f mathbbR^d to mathbbR. Lord estimates the Shannon differential entropy\n\nH(X) = int_mathcalX f(x) log f(x) dx = mathbbE-log(f(X))\n\nby using the resubstitution formula\n\nhatbarX k = -mathbbElog(f(X))\napprox sum_i = 1^N log(hatf(bfx_i))\n\nwhere hatf(bfx_i) is an estimate of the density at bfx_i constructed in a manner such that hatf(bfx_i) propto dfrack(x_i) NV_i, where k(x_i) is the number of points in the neighborhood of bfx_i, and V_i is the volume of that neighborhood.\n\nWhile most nearest-neighbor based differential entropy estimators uses regular volume elements (e.g. hypercubes, hyperrectangles, hyperspheres) for approximating the local densities hatf(bfx_i), the Lord estimator uses hyperellopsoid volume elements. These hyperellipsoids are, for each query point xᵢ, estimated using singular value decomposition (SVD) on the k-th nearest neighbors of xᵢ. Thus, the hyperellipsoids stretch/compress in response to the local geometry around each sample point. This makes Lord a well-suited entropy estimator for a wide range of systems.\n\n\n\n\n\n","category":"type"},{"location":"api/information_single_variable_api/#ComplexityMeasures.LeonenkoProzantoSavani","page":"Single-variable information API","title":"ComplexityMeasures.LeonenkoProzantoSavani","text":"LeonenkoProzantoSavani <: DifferentialInfoEstimator\nLeonenkoProzantoSavani(definition = Shannon(); k = 1, w = 0)\n\nThe LeonenkoProzantoSavani estimator (Leonenko et al., 2008) computes the Shannon, Renyi, or Tsallis differential information of a multi-dimensional StateSpaceSet, with logarithms to the base specified in definition.\n\nDescription\n\nThe estimator uses k-th nearest-neighbor searches. w is the Theiler window, which determines if temporal neighbors are excluded during neighbor searches (defaults to 0, meaning that only the point itself is excluded when searching for neighbours).\n\nFor details, see Leonenko et al. (2008).\n\n\n\n\n\n","category":"type"},{"location":"api/information_single_variable_api/#ComplexityMeasures.Vasicek","page":"Single-variable information API","title":"ComplexityMeasures.Vasicek","text":"Vasicek <: DifferentialInfoEstimator\nVasicek(definition = Shannon(); m::Int = 1)\n\nThe Vasicek estimator computes the Shannon differential information of a timeseries using the method from Vasicek (1976), with logarithms to the base specified in definition.\n\nThe Vasicek estimator belongs to a class of differential entropy estimators based on order statistics, of which Vasicek (1976) was the first. It only works for timeseries input.\n\nDescription\n\nAssume we have samples barX = x_1 x_2 ldots x_N from a continuous random variable X in mathbbR with support mathcalX and density functionf mathbbR to mathbbR. Vasicek estimates the Shannon differential entropy\n\nH(X) = int_mathcalX f(x) log f(x) dx = mathbbE-log(f(X))\n\nHowever, instead of estimating the above integral directly, it makes use of the equivalent integral, where F is the distribution function for X,\n\nH(X) = int_0^1 log left(dfracddpF^-1(p) right) dp\n\nThis integral is approximated by first computing the order statistics of barX (the input timeseries), i.e. x_(1) leq x_(2) leq cdots leq x_(n). The Vasicek Shannon differential entropy estimate is then\n\nhatH_V(barX m) =\ndfrac1n\nsum_i = 1^n log left dfracn2m (barX_(i+m) - barX_(i-m)) right\n\nUsage\n\nIn practice, choice of m influences how fast the entropy converges to the true value. For small value of m, convergence is slow, so we recommend to scale m according to the time series length n and use m >= n/100 (this is just a heuristic based on the tests written for this package).\n\nSee also: information, Correa, AlizadehArghami, Ebrahimi, DifferentialInfoEstimator.\n\n\n\n\n\n","category":"type"},{"location":"api/information_single_variable_api/#ComplexityMeasures.AlizadehArghami","page":"Single-variable information API","title":"ComplexityMeasures.AlizadehArghami","text":"AlizadehArghami <: DifferentialInfoEstimator\nAlizadehArghami(definition = Shannon(); m::Int = 1)\n\nThe AlizadehArghami estimator computes the Shannon differential information of a timeseries using the method from Alizadeh and Arghami (2010), with logarithms to the base specified in definition.\n\nThe AlizadehArghami estimator belongs to a class of differential entropy estimators based on order statistics. It only works for timeseries input.\n\nDescription\n\nAssume we have samples barX = x_1 x_2 ldots x_N from a continuous random variable X in mathbbR with support mathcalX and density functionf mathbbR to mathbbR. AlizadehArghami estimates the Shannon differential entropy\n\nH(X) = int_mathcalX f(x) log f(x) dx = mathbbE-log(f(X))\n\nHowever, instead of estimating the above integral directly, it makes use of the equivalent integral, where F is the distribution function for X:\n\nH(X) = int_0^1 log left(dfracddpF^-1(p) right) dp\n\nThis integral is approximated by first computing the order statistics of barX (the input timeseries), i.e. x_(1) leq x_(2) leq cdots leq x_(n). The AlizadehArghami Shannon differential entropy estimate is then the the Vasicek estimate hatH_V(barX m n), plus a correction factor\n\nhatH_A(barX m n) = hatH_V(barX m n) +\ndfrac2nleft(m log(2) right)\n\nSee also: information, Correa, Ebrahimi, Vasicek, DifferentialInfoEstimator.\n\n\n\n\n\n","category":"type"},{"location":"api/information_single_variable_api/#ComplexityMeasures.Ebrahimi","page":"Single-variable information API","title":"ComplexityMeasures.Ebrahimi","text":"Ebrahimi <: DifferentialInfoEstimator\nEbrahimi(definition = Shannon(); m::Int = 1)\n\nThe Ebrahimi estimator computes the Shannon information of a timeseries using the method from Ebrahimi et al. (1994), with logarithms to the base specified in definition.\n\nThe Ebrahimi estimator belongs to a class of differential entropy estimators based on order statistics. It only works for timeseries input.\n\nDescription\n\nAssume we have samples barX = x_1 x_2 ldots x_N from a continuous random variable X in mathbbR with support mathcalX and density functionf mathbbR to mathbbR. Ebrahimi estimates the Shannon differential entropy\n\nH(X) = int_mathcalX f(x) log f(x) dx = mathbbE-log(f(X))\n\nHowever, instead of estimating the above integral directly, it makes use of the equivalent integral, where F is the distribution function for X,\n\nH(X) = int_0^1 log left(dfracddpF^-1(p) right) dp\n\nThis integral is approximated by first computing the order statistics of barX (the input timeseries), i.e. x_(1) leq x_(2) leq cdots leq x_(n). The Ebrahimi Shannon differential entropy estimate is then\n\nhatH_E(barX m) =\ndfrac1n sum_i = 1^n log\nleft dfracnc_i m (barX_(i+m) - barX_(i-m)) right\n\nwhere\n\nc_i =\nbegincases\n 1 + fraci - 1m 1 geq i geq m \n 2 m + 1 geq i geq n - m \n 1 + fracn - im n - m + 1 geq i geq n\nendcases\n\nSee also: information, Correa, AlizadehArghami, Vasicek, DifferentialInfoEstimator.\n\n\n\n\n\n","category":"type"},{"location":"api/information_single_variable_api/#ComplexityMeasures.Correa","page":"Single-variable information API","title":"ComplexityMeasures.Correa","text":"Correa <: DifferentialInfoEstimator\nCorrea(definition = Shannon(); m::Int = 1)\n\nThe Correa estimator computes the Shannon differential information of a timeseries using the method from Correa (1995), with logarithms to the base specified in definition.\n\nThe Correa estimator belongs to a class of differential entropy estimators based on order statistics. It only works for timeseries input.\n\nDescription\n\nAssume we have samples barX = x_1 x_2 ldots x_N from a continuous random variable X in mathbbR with support mathcalX and density functionf mathbbR to mathbbR. Correa estimates the Shannon differential entropy\n\nH(X) = int_mathcalX f(x) log f(x) dx = mathbbE-log(f(X))\n\nHowever, instead of estimating the above integral directly, Correa makes use of the equivalent integral, where F is the distribution function for X,\n\nH(X) = int_0^1 log left(dfracddpF^-1(p) right) dp\n\nThis integral is approximated by first computing the order statistics of barX (the input timeseries), i.e. x_(1) leq x_(2) leq cdots leq x_(n), ensuring that end points are included. The Correa estimate of Shannon differential entropy is then\n\nH_C(barX m n) =\ndfrac1n sum_i = 1^n log\nleft dfrac sum_j=i-m^i+m(barX_(j) -\ntildeX_(i))(j - i)n sum_j=i-m^i+m (barX_(j) - tildeX_(i))^2\nright\n\nwhere\n\ntildeX_(i) = dfrac12m + 1 sum_j = i - m^i + m X_(j)\n\nSee also: information, AlizadehArghami, Ebrahimi, Vasicek, DifferentialInfoEstimator.\n\n\n\n\n\n","category":"type"},{"location":"independence/","page":"Independence","title":"Independence","text":"CollapsedDocStrings = true","category":"page"},{"location":"independence/#independence_testing","page":"Independence","title":"Independence testing","text":"","category":"section"},{"location":"independence/","page":"Independence","title":"Independence","text":"For practical applications, it is often useful to determine whether variables are independent, possible conditioned upon another set of variables. One way of doing so is to utilize an association measure, and perform some sort of randomization-based independence testing.","category":"page"},{"location":"independence/","page":"Independence","title":"Independence","text":"For example, to test the dependence between time series, time series surrogates testing is used. Many other frameworks for independence exist too. Here, we've collected some independence testing frameworks, and made sure that they are compatible with as many of the implemented association measures as possible.","category":"page"},{"location":"independence/#Independence-testing-API","page":"Independence","title":"Independence testing API","text":"","category":"section"},{"location":"independence/","page":"Independence","title":"Independence","text":"The independence test API is defined by","category":"page"},{"location":"independence/","page":"Independence","title":"Independence","text":"independence\nIndependenceTest","category":"page"},{"location":"independence/","page":"Independence","title":"Independence","text":"independence\nIndependenceTest","category":"page"},{"location":"independence/#Associations.independence","page":"Independence","title":"Associations.independence","text":"independence(test::IndependenceTest, x, y, [z]) → summary\n\nPerform the given IndependenceTest test on data x, y and z. If only x and y are given, test must provide a bivariate association measure. If z is given too, then test must provide a conditional association measure.\n\nReturns a test summary, whose type depends on test.\n\nCompatible independence tests\n\nSurrogateAssociationTest\nLocalPermutationTest\nJointDistanceDistributionTest\nCorrTest\n\n\n\n\n\n","category":"function"},{"location":"independence/#Associations.IndependenceTest","page":"Independence","title":"Associations.IndependenceTest","text":"IndependenceTest <: IndependenceTest\n\nThe supertype for all independence tests.\n\n\n\n\n\n","category":"type"},{"location":"independence/#[SurrogateAssociationTest](@ref)","page":"Independence","title":"SurrogateAssociationTest","text":"","category":"section"},{"location":"independence/","page":"Independence","title":"Independence","text":"SurrogateAssociationTest\nSurrogateAssociationTestResult","category":"page"},{"location":"independence/#Associations.SurrogateAssociationTest","page":"Independence","title":"Associations.SurrogateAssociationTest","text":"SurrogateAssociationTest <: IndependenceTest\nSurrogateAssociationTest(est_or_measure;\n nshuffles::Int = 100,\n surrogate = RandomShuffle(),\n rng = Random.default_rng(),\n show_progress = false,\n)\n\nA surrogate-data based generic (conditional) independence test for assessing whether the association between variables X and Y are independent, potentially conditioned on a third variable Z.\n\nCompatible estimators and measures\n\nCompatible with AssociationMeasures that measure some sort of pairwise or conditional association.\n\nnote: Note\nYou must yourself determine whether using a particular measure is meaningful, and what it means.\n\nnote: Note\nIf used with a TransferEntropy measure such as TEShannon, then the source variable is always shuffled, and the target and conditional variable are left unshuffled.\n\nUsage\n\nUse with independence to perform a surrogate test with input data. This will return a SurrogateAssociationTestResult.\n\nDescription\n\nThis is a generic one-sided hypothesis test that checks whether x and y are independent (given z, if provided) based on resampling from a null distribution assumed to represent independence between the variables. The null distribution is generated by repeatedly shuffling the input data in some way that is intended to break any dependence between the input variables.\n\nThe test first estimates the desired statistic using est_or_measure on the input data. Then, the first input variable is shuffled nshuffled times according to the given surrogate method (each type of surrogate represents a distinct null hypothesis). For each shuffle, est_or_measure is recomputed and the results are stored. \n\nExamples\n\nExample 1: SMeasure test for pairwise independence.\nExample 2: DistanceCorrelation test for pairwise independence.\nExample 3: PartialCorrelation test for conditional independence.\nExample 4: MIShannon test for pairwise independence on categorical data.\nExample 5: CMIShannon test for conditional independence on categorical data. \nExample 6: MCR test for pairwise and conditional independence. \nExample 7. ChatterjeeCorrelation test for pairwise independence.\nExample 8. AzadkiaChatterjeeCoefficient test for pairwise and conditional independence.\n\n\n\n\n\n","category":"type"},{"location":"independence/#Associations.SurrogateAssociationTestResult","page":"Independence","title":"Associations.SurrogateAssociationTestResult","text":"SurrogateAssociationTestResult(m, m_surr, pvalue)\n\nHolds the result of a SurrogateAssociationTest. m is the measure computed on the original data. m_surr is a vector of the measure computed on permuted data, where m_surr[i] is the measure compute on the i-th permutation. pvalue is the one-sided p-value for the test.\n\n\n\n\n\n","category":"type"},{"location":"independence/#[LocalPermutationTest](@ref)","page":"Independence","title":"LocalPermutationTest","text":"","category":"section"},{"location":"independence/","page":"Independence","title":"Independence","text":"LocalPermutationTest\nLocalPermutationTestResult","category":"page"},{"location":"independence/#Associations.LocalPermutationTest","page":"Independence","title":"Associations.LocalPermutationTest","text":"LocalPermutationTest <: IndependenceTest\nLocalPermutationTest(measure, [est];\n kperm::Int = 5,\n nshuffles::Int = 100,\n rng = Random.default_rng(),\n replace = true,\n w::Int = 0,\n show_progress = false)\n\nLocalPermutationTest is a generic conditional independence test (Runge, 09–11 Apr 2018) for assessing whether two variables X and Y are conditionally independendent given a third variable Z (all of which may be multivariate).\n\nWhen used with independence, a LocalPermutationTestResult is returned.\n\nDescription\n\nThis is a generic one-sided hypothesis test that checks whether X and Y are independent (given Z, if provided) based on resampling from a null distribution assumed to represent independence between the variables. The null distribution is generated by repeatedly shuffling the input data in some way that is intended to break any dependence between x and y, but preserve dependencies between x and z.\n\nThe algorithm is as follows:\n\nCompute the original conditional independence statistic I(X; Y | Z).\nAllocate a scalar valued vector Î with space for nshuffles elements.\nFor k ∈ [1, 2, …, nshuffles], repeat\nFor each zᵢ ∈ Y, let nᵢ be time indices of the kperm nearest neighbors of zᵢ, excluding the w nearest neighbors of zᵢ from the neighbor query (i.e w is the Theiler window).\nLet xᵢ⋆ = X[j], where j is randomly sampled from nᵢ with replacement. This way, xᵢ is replaced with xⱼ only if zᵢ ≈ zⱼ (zᵢ and zⱼ are close). Repeat for i = 1, 2, …, n and obtain the shuffled X̂ = [x̂₁, x̂₂, …, x̂ₙ].\nCompute the conditional independence statistic Iₖ(X̂; Y | Z).\nLet Î[k] = Iₖ(X̂; Y | Z).\nCompute the p-value as count(Î[k] .<= I) / nshuffles).\n\nIn additional to the conditional variant from Runge (2018), we also provide a pairwise version, where the shuffling procedure is identical, except neighbors in Y are used instead of Z and we I(X; Y) and Iₖ(X̂; Y) instead of I(X; Y | Z) and Iₖ(X̂; Y | Z).\n\nCompatible measures\n\nMeasure Pairwise Conditional Requires est Note\nPartialCorrelation ✖ ✓ No \nDistanceCorrelation ✖ ✓ No \nCMIShannon ✖ ✓ Yes \nTEShannon ✓ ✓ Yes Pairwise tests not possible with TransferEntropyEstimators, only lower-level estimators, e.g. FPVP, GaussianMI or Kraskov\nPartialMutualInformation ✖ ✓ Yes \nAzadkiaChatterjeeCoefficient ✖ ✓ No \n\nThe LocalPermutationTest is only defined for conditional independence testing. Exceptions are for measures like TEShannon, which use conditional measures under the hood even for their pairwise variants, and are therefore compatible with LocalPermutationTest.\n\nThe nearest-neighbor approach in Runge (2018) can be reproduced by using the CMIShannon measure with the FPVP estimator.\n\nExamples\n\nExample 1: Conditional independence test using CMIShannon\nExample 2): Conditional independence test using TEShannon\nExample 3: Conditional independence test using AzadkiaChatterjeeCoefficient\n\n\n\n\n\n","category":"type"},{"location":"independence/#Associations.LocalPermutationTestResult","page":"Independence","title":"Associations.LocalPermutationTestResult","text":"LocalPermutationTestResult(m, m_surr, pvalue)\n\nHolds the result of a LocalPermutationTest. m is the measure computed on the original data. m_surr is a vector of the measure computed on permuted data, where m_surr[i] is the measure compute on the i-th permutation. pvalue is the one-sided p-value for the test.\n\n\n\n\n\n","category":"type"},{"location":"independence/#[JointDistanceDistributionTest](@ref)","page":"Independence","title":"JointDistanceDistributionTest","text":"","category":"section"},{"location":"independence/","page":"Independence","title":"Independence","text":"JointDistanceDistributionTest\nJDDTestResult","category":"page"},{"location":"independence/#Associations.JointDistanceDistributionTest","page":"Independence","title":"Associations.JointDistanceDistributionTest","text":"JointDistanceDistributionTest <: IndependenceTest\nJointDistanceDistributionTest(measure::JointDistanceDistribution; rng = Random.default_rng())\n\nAn independence test for two variables based on the JointDistanceDistribution (Amigó and Hirata, 2018).\n\nWhen used with independence, a JDDTestResult is returned.\n\nDescription\n\nThe joint distance distribution (labelled Δ in their paper) is used by Amigó & Hirata (2018) to detect directional couplings of the form X to Y or Y to X. JointDistanceDistributionTest formulates their method as an independence test.\n\nFormally, we test the hypothesis H_0 (the variables are independent) against H_1 (there is directional coupling between the variables). To do so, we use a right-sided/upper-tailed t-test to check mean of Δ is skewed towards positive value, i.e.\n\nH_0 = mu(Delta) = 0\nH_1 = mu(Delta) 0.\n\nWhen used with independence, a JDDTestResult is returned, which contains the joint distance distribution and a p-value. If you only need Δ, use association with a JointDistanceDistribution instance directly.\n\nExamples\n\nExample 1. Detecting (in)dependence in bidirectionally coupled logistic maps.\n\n\n\n\n\n","category":"type"},{"location":"independence/#Associations.JDDTestResult","page":"Independence","title":"Associations.JDDTestResult","text":"JDDTestResult(Δjdd, hypothetical_μ, pvalue)\n\nHolds the results of JointDistanceDistributionTest. Δjdd is the Δ-distribution, hypothetical_μ is the hypothetical mean of the Δ-distribution under the null, and pvalue is the p-value for the one-sided t-test.\n\n\n\n\n\n","category":"type"},{"location":"independence/#[CorrTest](@ref)","page":"Independence","title":"CorrTest","text":"","category":"section"},{"location":"independence/","page":"Independence","title":"Independence","text":"CorrTest\nCorrTestResult","category":"page"},{"location":"independence/#Associations.CorrTest","page":"Independence","title":"Associations.CorrTest","text":"CorrTest <: IndependenceTest\nCorrTest()\n\nAn independence test based correlation (for two variables) and partial correlation (for three variables) (Levy and Narula, 1978); as described in Schmidt et al. (2018).\n\nUses PearsonCorrelation and PartialCorrelation internally.\n\nAssumes that the input data are (multivariate) normally distributed. Then ρ(X, Y) = 0 implies X ⫫ Y and ρ(X, Y | 𝐙) = 0 implies X ⫫ Y | 𝐙.\n\nDescription\n\nThe null hypothesis is H₀ := ρ(X, Y | 𝐙) = 0. We use the approach in Levy & Narula (1978)(Levy and Narula, 1978) and compute the Z-transformation of the observed (partial) correlation coefficient hatrho_XYbfZ:\n\nZ(hatrho_XYbfZ) =\nlogdfrac1 + hatrho_XYbfZ1 - hatrho_XYbfZ\n\nTo test the null hypothesis against the alternative hypothesis H₁ := ρ(X, Y | 𝐙) > 0, calculate\n\nhatZ = dfrac12dfracZ(hatrho_XYbfZ) - Z(0)sqrt1(n - d - 3)\n\nand compute the two-sided p-value (Schmidt et al., 2018)\n\np(X Y bfZ) = 2(1 - phi(sqrtn - d - 3Z(hatrho_XYbfZ)))\n\nwhere d is the dimension of bfZ and n is the number of samples. For the pairwise case, the procedure is identical, but set bfZ = emptyset.\n\nExamples\n\nExample 1. Pairwise and conditional tests for independence on coupled noise processes.\n\n\n\n\n\n","category":"type"},{"location":"independence/#Associations.CorrTestResult","page":"Independence","title":"Associations.CorrTestResult","text":"CorrTestResult(pvalue, ρ, z)\n\nA simple struct that holds the results of a CorrTest test: the (partial) correlation coefficient ρ, Fisher's z, and pvalue - the two-sided p-value for the test.\n\n\n\n\n\n","category":"type"},{"location":"examples/examples_independence/#examples_independence","page":"Independence testing","title":"Examples of independence testing","text":"","category":"section"},{"location":"examples/examples_independence/#example_CorrTest","page":"Independence testing","title":"CorrTest","text":"","category":"section"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"using Associations\nusing Random; rng = Xoshiro(1234)\n\n# Some normally distributed data\nX = randn(rng, 1000) \nY = 0.5*randn(rng, 1000) .+ X\nZ = 0.5*randn(rng, 1000) .+ Y\nW = randn(rng, 1000);","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"Let's test a few independence relationships. For example, we expect that X ⫫ W. We also expect dependence X !⫫ Z, but this dependence should vanish when conditioning on the intermediate variable, so we expect X ⫫ Z | Y.","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"independence(CorrTest(), X, W)","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"As expected, the outcome is that we can't reject the null hypothesis that X ⫫ W.","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"independence(CorrTest(), X, Z)","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"However, we can reject the null hypothesis that X ⫫ Z, so the evidence favors the alternative hypothesis X !⫫ Z.","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"independence(CorrTest(), X, Z, Y)","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"As expected, the correlation between X and Z significantly vanishes when conditioning on Y, because Y is solely responsible for the observed correlation between X and Y.","category":"page"},{"location":"examples/examples_independence/#examples_independence_JointDistanceDistributionTest","page":"Independence testing","title":"JointDistanceDistributionTest","text":"","category":"section"},{"location":"examples/examples_independence/#Bidirectionally-coupled-logistic-maps","page":"Independence testing","title":"Bidirectionally coupled logistic maps","text":"","category":"section"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"Let's use the built-in logistic2_bidir discrete dynamical system to create a pair of bidirectionally coupled time series and use the JointDistanceDistributionTest to see if we can confirm from observed time series that these variables are bidirectionally coupled. We'll use a significance level of 1 - α = 0.99, i.e. α = 0.01.","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"using Associations\nusing DynamicalSystemsBase\nusing Random; rng = Xoshiro(1234)\nBase.@kwdef struct Logistic2Bidir{V, C1, C2, R1, R2, Σx, Σy, R}\n xi::V = [0.5, 0.5]\n c_xy::C1 = 0.1\n c_yx::C2 = 0.1\n r₁::R1 = 3.78\n r₂::R2 = 3.66\n σ_xy::Σx = 0.05\n σ_yx::Σy = 0.05\n rng::R = Random.default_rng()\nend\n\nfunction system(definition::Logistic2Bidir)\n return DiscreteDynamicalSystem(eom_logistic2bidir, definition.xi, definition)\nend\n\nfunction eom_logistic2bidir(u, p::Logistic2Bidir, t)\n (; xi, c_xy, c_yx, r₁, r₂, σ_xy, σ_yx, rng) = p\n x, y = u\n f_xy = (y + c_xy*(x + σ_xy * rand(rng)) ) / (1 + c_xy*(1+σ_xy))\n f_yx = (x + c_yx*(y + σ_yx * rand(rng)) ) / (1 + c_yx*(1+σ_yx))\n dx = r₁ * (f_yx) * (1 - f_yx)\n dy = r₂ * (f_xy) * (1 - f_xy)\n return SVector{2}(dx, dy)\nend","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"We start by generating some time series and configuring the test.","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"using Associations\nsys = system(Logistic2Bidir(c_xy = 0.5, c_yx = 0.4))\nx, y = columns(first(trajectory(sys, 2000, Ttr = 10000)))\nmeasure = JointDistanceDistribution(D = 5, B = 5)\ntest = JointDistanceDistributionTest(measure)","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"Now, we test for independence in both directions.","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"independence(test, x, y)","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"independence(test, y, x)","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"As expected, the null hypothesis is rejected in both directions at the pre-determined significance level, and hence we detect directional coupling in both directions.","category":"page"},{"location":"examples/examples_independence/#Non-coupled-logistic-maps","page":"Independence testing","title":"Non-coupled logistic maps","text":"","category":"section"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"What happens in the example above if there is no coupling?","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"sys = system(Logistic2Bidir(c_xy = 0.00, c_yx = 0.0))\nx, y = columns(first(trajectory(sys, 1000, Ttr = 10000)));\nrxy = independence(test, x, y)\nryx = independence(test, y, x)\npvalue(rxy), pvalue(ryx)","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"At significance level 0.99, we can't reject the null in either direction, hence there's not enough evidence in the data to suggest directional coupling.","category":"page"},{"location":"examples/examples_independence/#examples_surrogatetest","page":"Independence testing","title":"SurrogateAssociationTest","text":"","category":"section"},{"location":"examples/examples_independence/#example_SurrogateAssociationTest_ChatterjeeCorrelation","page":"Independence testing","title":"Chatterjee correlation","text":"","category":"section"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"using Associations\nusing Random; rng = Xoshiro(1234)\nn = 1000\nx, y = rand(1:50, n), rand(1:50, n)\ntest = SurrogateAssociationTest(ChatterjeeCorrelation(), nshuffles = 19)\nindependence(test, x, y)","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"As expected, the test indicates that we can't reject independence. What happens if we introduce a third variable that depends on y?","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"z = rand(1:20, n) .* y\nindependence(test, y, z)","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"The test clearly picks up on the functional dependence.","category":"page"},{"location":"examples/examples_independence/#example_SurrogateAssociationTest_AzadkiaChatterjeeCoefficient","page":"Independence testing","title":"Azadkia-Chatterjee coefficient","text":"","category":"section"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"using Associations\nusing Random; rng = Xoshiro(1234)\nn = 1000\n# Some categorical variables (we add a small amount of noise to avoid duplicate points \n# during neighbor searches)\nx = rand(rng, 1.0:50.0, n) .+ rand(n) .* 1e-8\ny = rand(rng, 1.0:50.0, n) .+ rand(n) .* 1e-8\ntest = SurrogateAssociationTest(AzadkiaChatterjeeCoefficient(), nshuffles = 19)\nindependence(test, x, y)","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"As expected, the test indicates that we can't reject independence. What happens if we introduce a third variable that depends on y?","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"z = rand(rng, 1.0:20.0, n) .* y\nindependence(test, y, z)","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"The test clearly picks up on the functional dependence. But what about conditioning? Let's define three variables where x → y → z. When then expect significant association between x and y, possibly between x and z (depending on how strong the intermediate connection is), and non-significant association between x and z if conditioning on y (since y is the variable connecting x and z.) The Azadkia-Chatterjee coefficient also should be able to verify these claims.","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"x = rand(rng, 120)\ny = rand(rng, 120) .* x\nz = rand(rng, 120) .+ y\nindependence(test, x, y)","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"The direct association between x and y is detected.","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"independence(test, x, z)","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"The indirect association between x and z is also detected.","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"independence(test, x, z, y)","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"We can't reject independence between x and z when taking into consideration y, as expected.","category":"page"},{"location":"examples/examples_independence/#example_SurrogateAssociationTest_DistanceCorrelation","page":"Independence testing","title":"Distance correlation","text":"","category":"section"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"using Associations\nx = randn(1000)\ny = randn(1000) .+ 0.5x\nindependence(SurrogateAssociationTest(DistanceCorrelation()), x, y)","category":"page"},{"location":"examples/examples_independence/#example_SurrogateAssociationTest_PartialCorrelation","page":"Independence testing","title":"Partial correlation","text":"","category":"section"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"using Associations\nx = randn(1000)\ny = randn(1000) .+ 0.5x\nz = randn(1000) .+ 0.8y\nindependence(SurrogateAssociationTest(PartialCorrelation()), x, z, y)","category":"page"},{"location":"examples/examples_independence/#example_SurrogateAssociationTest_SMeasure","page":"Independence testing","title":"SMeasure","text":"","category":"section"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"using Associations\nx, y = randn(1000), randn(1000)\nmeasure = SMeasure(dx = 4, dy = 3)\ns = association(measure, x, y)","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"The s statistic is larger when there is stronger coupling and smaller when there is weaker coupling. To check whether s is significant (i.e. large enough to claim directional dependence), we can use a SurrogateAssociationTest.","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"test = SurrogateAssociationTest(measure)\nindependence(test, x, y)","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"The p-value is high, and we can't reject the null at any reasonable significance level. Hence, there isn't evidence in the data to support directional coupling from x to y.","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"What happens if we use coupled variables?","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"z = x .+ 0.1y\nindependence(test, x, z)","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"Now we can confidently reject the null (independence), and conclude that there is evidence in the data to support directional dependence from x to z.","category":"page"},{"location":"examples/examples_independence/#example_SurrogateAssociationTest_MIShannon_categorical","page":"Independence testing","title":"MIShannon, categorical","text":"","category":"section"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"In this example, we expect the preference and the food variables to be independent.","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"using Associations\nusing Random; rng = Xoshiro(1234)\n# Simulate \nn = 1000\npreference = rand(rng, [\"yes\", \"no\"], n)\nfood = rand(rng, [\"veggies\", \"meat\", \"fish\"], n)\nest = JointProbabilities(MIShannon(), CodifyVariables(UniqueElements()))\ntest = SurrogateAssociationTest(est)\nindependence(test, preference, food)","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"As expected, there's not enough evidence to reject the null hypothesis that the variables are independent.","category":"page"},{"location":"examples/examples_independence/#example_SurrogateAssociationTest_CMIShannon_categorical","page":"Independence testing","title":"CMIShannon, categorical","text":"","category":"section"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"Here, we simulate a survey at a ski resort. The data are such that the place a person grew up is associated with how many times they fell while going skiing. The control happens through an intermediate variable preferred_equipment, which indicates what type of physical activity the person has engaged with in the past. Some activities like skateboarding leads to better overall balance, so people that are good on a skateboard also don't fall, and people that to less challenging activities fall more often.","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"We should be able to reject places ⫫ experience, but not reject places ⫫ experience | preferred_equipment. Let's see if we can detect these relationships using (conditional) mutual information.","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"using Associations\nusing Random; rng = Xoshiro(1234)\nn = 1000\n\nplaces = rand(rng, [\"city\", \"countryside\", \"under a rock\"], n);\npreferred_equipment = map(places) do place\n if cmp(place, \"city\") == 1\n return rand(rng, [\"skateboard\", \"bmx bike\"])\n elseif cmp(place, \"countryside\") == 1\n return rand(rng, [\"sled\", \"snowcarpet\"])\n else\n return rand(rng, [\"private jet\", \"ferris wheel\"])\n end\nend;\nexperience = map(preferred_equipment) do equipment\n if equipment ∈ [\"skateboard\", \"bmx bike\"]\n return \"didn't fall\"\n elseif equipment ∈ [\"sled\", \"snowcarpet\"]\n return \"fell 3 times or less\"\n else\n return \"fell uncontably many times\"\n end\nend;\nest_mi = JointProbabilities(MIShannon(), CodifyVariables(UniqueElements()))\ntest = SurrogateAssociationTest(est_mi)\nindependence(test, places, experience)","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"As expected, the evidence favors the alternative hypothesis that places and experience are dependent.","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"est_cmi = JointProbabilities(CMIShannon(), CodifyVariables(UniqueElements()))\ntest = SurrogateAssociationTest(est_cmi)\nindependence(test, places, experience, preferred_equipment)","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"Again, as expected, when conditioning on the mediating variable, the dependence disappears, and we can't reject the null hypothesis of independence.","category":"page"},{"location":"examples/examples_independence/#example_independence_MCR","page":"Independence testing","title":"MCR","text":"","category":"section"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"using Associations\nusing Random; rng = Xoshiro(1234)\n\nx = rand(rng, 300)\ny = rand(rng, 300)\ntest = SurrogateAssociationTest(MCR(r = 0.5); rng, nshuffles = 100, surrogate = RandomShuffle())\nindependence(test, x, y)","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"As expected, we can't reject independence. What happens if two variables are coupled?","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"using Associations\nusing Random; rng = Xoshiro(1234)\nx = rand(rng, 300)\nz = x .+ rand(rng, 300)\ntest = SurrogateAssociationTest(MCR(r = 0.5); rng, nshuffles = 100, surrogate = RandomShuffle())\nindependence(test, x, z)","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"Now, because the variables are coupled, the evidence in the data support dependence.","category":"page"},{"location":"examples/examples_independence/#example_LocalPermutationTest","page":"Independence testing","title":"LocalPermutationTest","text":"","category":"section"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"To demonstrate the local permutation test for independence, we'll again use the chain of unidirectionally coupled logistic maps.","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"We'll implement a set of chained logistic maps with unidirectional coupling.","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"using DynamicalSystemsBase\nBase.@kwdef struct Logistic4Chain{V, RX, RY, RZ, RW, C1, C2, C3, Σ1, Σ2, Σ3, RNG}\n xi::V = [0.1, 0.2, 0.3, 0.4]\n rx::RX = 3.9\n ry::RY = 3.6\n rz::RZ = 3.6\n rw::RW = 3.8\n c_xy::C1 = 0.4\n c_yz::C2 = 0.4\n c_zw::C3 = 0.35\n σ_xy::Σ1 = 0.05\n σ_yz::Σ2 = 0.05\n σ_zw::Σ3 = 0.05\n rng::RNG = Random.default_rng()\nend\n\nfunction eom_logistic4_chain(u, p::Logistic4Chain, t)\n (; xi, rx, ry, rz, rw, c_xy, c_yz, c_zw, σ_xy, σ_yz, σ_zw, rng) = p\n x, y, z, w = u\n f_xy = (y + c_xy*(x + σ_xy * rand(rng)) ) / (1 + c_xy*(1+σ_xy))\n f_yz = (z + c_yz*(y + σ_yz * rand(rng)) ) / (1 + c_yz*(1+σ_yz))\n f_zw = (w + c_zw*(z + σ_zw * rand(rng)) ) / (1 + c_zw*(1+σ_zw))\n dx = rx * x * (1 - x)\n dy = ry * (f_xy) * (1 - f_xy)\n dz = rz * (f_yz) * (1 - f_yz)\n dw = rw * (f_zw) * (1 - f_zw)\n return SVector{4}(dx, dy, dz, dw)\nend\n\n\nfunction system(definition::Logistic4Chain)\n return DiscreteDynamicalSystem(eom_logistic4_chain, definition.xi, definition)\nend","category":"page"},{"location":"examples/examples_independence/#example_LocalPermutationTest_CMIShannon","page":"Independence testing","title":"CMIShannon","text":"","category":"section"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"To estimate CMI, we'll use the Kraskov differential entropy estimator, which naively computes CMI as a sum of entropy terms without guaranteed bias cancellation.","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"using Associations\nusing Random; rng = Xoshiro(1234)\nn = 100\nX = randn(rng, n)\nY = X .+ randn(rng, n) .* 0.4\nZ = randn(rng, n) .+ Y\nx, y, z = StateSpaceSet.((X, Y, Z))\ntest = LocalPermutationTest(FPVP(CMIShannon()), nshuffles = 19)\nindependence(test, x, y, z)","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"We expect there to be a detectable influence from X to Y, if we condition on Z or not, because Z doesn't influence neither X nor Y. The null hypothesis is that the first two variables are conditionally independent given the third, which we reject with a very low p-value. Hence, we accept the alternative hypothesis that the first two variables X and Y. are conditionally dependent given Z.","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"independence(test, x, z, y)","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"As expected, we cannot reject the null hypothesis that X and Z are conditionally independent given Y, because Y is the variable that transmits information from X to Z.","category":"page"},{"location":"examples/examples_independence/#example_LocalPermutationTest_TEShannon","page":"Independence testing","title":"TEShannon","text":"","category":"section"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"Here, we demonstrate LocalPermutationTest with the TEShannon measure with default parameters and the FPVP estimator. We'll use the system of four coupled logistic maps that are linked X → Y → Z → W defined above.","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"We should expect the transfer entropy X → Z to be non-significant when conditioning on Y, because all information from X to Z is transferred through Y.","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"using Associations\nusing Random; rng = Random.default_rng()\nn = 300\nsys = system(Logistic4Chain(; xi = rand(rng, 4), rng))\nx, y, z, w = columns(trajectory(sys, n) |> first)\nest = CMIDecomposition(TEShannon(), FPVP(k = 10))\ntest = LocalPermutationTest(est, nshuffles = 19)\nindependence(test, x, z, y)","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"As expected, we cannot reject the null hypothesis that X and Z are conditionally independent given Y.","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"The same goes for variables one step up the chain:","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"independence(test, y, w, z)","category":"page"},{"location":"examples/examples_independence/#example_LocalPermutationTest_AzadkiaChatterjeeCoefficient","page":"Independence testing","title":"AzadkiaChatterjeeCoefficient","text":"","category":"section"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"using Associations\nusing Random; rng = Xoshiro(1234)\nn = 300\n# Some categorical variables (we add a small amount of noise to avoid duplicate points \n# during neighbor searches)\ntest = LocalPermutationTest(AzadkiaChatterjeeCoefficient(), nshuffles = 19)\nx = rand(rng, n)\ny = rand(rng, n) .* x\nz = rand(rng, n) .+ y","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"Let's define three variables where x → y → z. We expect a non-significant association between x and z if conditioning on y (since y is the variable connecting x and z.) ","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"independence(test, x, z, y)","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"The test verifies our expectation.","category":"page"},{"location":"causal_graphs/","page":"Network/graph inference","title":"Network/graph inference","text":"CollapsedDocStrings = true","category":"page"},{"location":"causal_graphs/#causal_graphs","page":"Network/graph inference","title":"Inferring causal graphs","text":"","category":"section"},{"location":"causal_graphs/","page":"Network/graph inference","title":"Network/graph inference","text":"Directed causal graphical models, estimated on observed data, is an incredibly useful framework for causal inference. There exists a plethora of methods for estimating such models.","category":"page"},{"location":"causal_graphs/","page":"Network/graph inference","title":"Network/graph inference","text":"Useful reading:","category":"page"},{"location":"causal_graphs/","page":"Network/graph inference","title":"Network/graph inference","text":"Pearl, J. Glymour, M., & Jewell, N. P. (2016). Causal inference in statistics: A primer. John Wiley & Sons. An excellent introductory book, suitable for anyone interested, from a beginners to experts.\nGlymour, C., Zhang, K., & Spirtes, P. (2019). Review of causal discovery methods based on graphical models. Frontiers in genetics, 10, 524. The authoritative overview of causal discovery from graphical models. Many more methods have also emerged since this paper.","category":"page"},{"location":"causal_graphs/#Causal-graph-API","page":"Network/graph inference","title":"Causal graph API","text":"","category":"section"},{"location":"causal_graphs/","page":"Network/graph inference","title":"Network/graph inference","text":"The API for inferring causal graphs is defined by:","category":"page"},{"location":"causal_graphs/","page":"Network/graph inference","title":"Network/graph inference","text":"infer_graph\nGraphAlgorithm, and its subtypes","category":"page"},{"location":"causal_graphs/","page":"Network/graph inference","title":"Network/graph inference","text":"infer_graph\nGraphAlgorithm","category":"page"},{"location":"causal_graphs/#Associations.infer_graph","page":"Network/graph inference","title":"Associations.infer_graph","text":"infer_graph(algorithm::GraphAlgorithm, x) → g\n\nInfer graph from input data x using the given algorithm.\n\nReturns g, whose type depends on algorithm.\n\n\n\n\n\n","category":"function"},{"location":"causal_graphs/#Associations.GraphAlgorithm","page":"Network/graph inference","title":"Associations.GraphAlgorithm","text":"GraphAlgorithm\n\nThe supertype of all causal graph inference algorithms.\n\nConcrete implementations\n\nOCE. The optimal causation entropy algorithm for time series graphs.\nPC.\n\n\n\n\n\n","category":"type"},{"location":"causal_graphs/#docs_OCE","page":"Network/graph inference","title":"Optimal causation entropy","text":"","category":"section"},{"location":"causal_graphs/","page":"Network/graph inference","title":"Network/graph inference","text":"OCE\nOCESelectedParents","category":"page"},{"location":"causal_graphs/#Associations.OCE","page":"Network/graph inference","title":"Associations.OCE","text":"OCE <: GraphAlgorithm\nOCE(; utest::IndependenceTest = SurrogateAssociationTest(MIShannon(), KSG2(k = 3, w = 3)),\n ctest::C = LocalPermutationTest(CMIShannon(), MesnerShalizi(k = 3, w = 3)),\n τmax::T = 1, α = 0.05)\n\nThe optimal causation entropy (OCE) algorithm for causal discovery Sun et al. (2015).\n\nDescription\n\nThe OCE algorithm has three steps to determine the parents of a variable xᵢ.\n\nPerform pairwise independence tests using utest and select the variable xⱼ(-τ) that has the highest significant (i.e. with associated p-value below α) association with xᵢ(0). Assign it to the set of selected parents P.\nPerform conditional independence tests using ctest, finding the parent Pₖ that has the highest association with xᵢ given the already selected parents, and add it to P. Repeat until no more variables with significant association are found.\nBackwards elimination of parents Pₖ of xᵢ(0) for which xᵢ(0) ⫫ Pₖ | P - {Pₖ}, where P is the set of parent nodes found in the previous steps.\n\nτmax indicates the maximum lag τ between the target variable xᵢ(0) and its potential parents xⱼ(-τ). Sun et al. 2015's method is based on τmax = 1.\n\nReturns\n\nWhen used with infer_graph, it returns a vector p, where p[i] are the parents for each input variable. This result can be converted to a SimpleDiGraph from Graphs.jl (see example).\n\nUsage\n\nOCE is used with infer_graph to infer the parents of the input data. Input data must either be a Vector{Vector{<:Real}}, or a StateSpaceSet.\n\nExamples\n\nInferring time series graph from a chain of logistic maps\n\n\n\n\n\n","category":"type"},{"location":"causal_graphs/#Associations.OCESelectedParents","page":"Network/graph inference","title":"Associations.OCESelectedParents","text":"OCESelectedParents\n\nA simple struct for storing the parents of a single variable xᵢ inferred by the OCE algorithm. When using OCE with infer_graph, a Vector{OCESelectedParents} is returned - one per variable in the input data.\n\nAssumptions and notation\n\nAssumes the input x is a Vector{Vector{<:Real}} or a StateSpaceSet (for which each column is treated as a variable). It contains the following fields, where we use the notation xₖ(τ) to indicate the k-th variable lagged by time-lag τ. For example, x₂(-3) is the variable x[2] lagged by 3 time steps.\n\nFields\n\ni: The index of the target variable (i.e. xᵢ(0) is the target).\nall_idxs: The possible variable indices of parent variables (i.e. 1:M, where M is the number of input variables).\nparents_js: The variable indices of the selected parent variables –- one per selected parent.\nparents_τs: The lags for the selected parent variables –- one per selected parent.\nparents: A vector containing the raw, time-lagged data for each selected parent variables. Let τ = parents_τs[k] and j = parents_js[k]. Then parents[k] is the raw data for the variable xⱼ(-τ).\n\n\n\n\n\n","category":"type"},{"location":"causal_graphs/#[PC](@ref)","page":"Network/graph inference","title":"PC","text":"","category":"section"},{"location":"causal_graphs/","page":"Network/graph inference","title":"Network/graph inference","text":"PC","category":"page"},{"location":"causal_graphs/#Associations.PC","page":"Network/graph inference","title":"Associations.PC","text":"PC <: GraphAlgorithm\nPC(pairwise_test, conditional_test;\n α = 0.05, max_depth = Inf, maxiters_orient = Inf)\n\nThe PC algorithm (Spirtes et al., 2000), which is named named after the first names of the authors, Peter Spirtes and Clark Glymour, which is implemented as described in Kalisch and Bühlmann (2008).\n\nArguments\n\npairwise_test: An IndependenceTest that uses a pairwise, nondirectional AssociationMeasure measure (e.g. a parametric CorrTest, or SurrogateAssociationTest with the MIShannon measure).\nconditional_test: An IndependenceTest that uses a conditional, nondirectional AssociationMeasure (e.g. CorrTest, or SurrogateAssociationTest with the CMIShannon measure).\n\nKeyword arguments\n\nα::Real. The significance level of the test.\nmax_depth. The maximum level of conditional indendence tests to be performed. By default, there is no limit (i.e. max_depth = Inf), meaning that maximum depth is N - 2, where N is the number of input variables.\nmaxiters_orient::Real. The maximum number of times to apply the orientation rules. By default, there is not limit (i.e. maxiters_orient = Inf).\n\ninfo: Directional measures will not give meaningful answers\nDuring the skeleton search phase, if a significance association between two nodes are is found, then a bidirectional edge is drawn between them. The generic implementation of PC therefore doesn't currently handle directional measures such as TEShannon. The reason is that if a directional relationship X → Y exists between two nodes X and Y, then the algorithm would first draw a bidirectional arrow between X and Y when analysing the direction X → Y, and then removing it again when analysing in the direction Y → X (a similar situation would also occur for the conditional stage). This will be fixed in a future release. For now, use nondirectional measures, e.g. MIShannon and CMIShannon!\n\nDescription\n\nWhen used with infer_graph on some input data x, the PC algorithm performs the following steps:\n\nInitialize an empty fully connected graph g with N nodes, where N is the number of variables and x[i] is the data for the i-th node.\nReduce the fully connected g to a skeleton graph by performing pairwise independence tests between all vertices using pairwise_test. Remove any edges where adjacent vertices are found to be independent according to the test (i.e. the null hypothesis of independence cannot be rejected at significance level 1 - α).\nThin the skeleton g by conditional independence testing. If x[i] ⫫ x[j] | x[Z] for some set of variables Z (not including i and j) according to conditional_test (i.e. the null hypothesis of conditional independence cannot be rejected at significance level 1 - α), then the edge between i and j is removed, and we record the separating set S(i, j) = Z. Independence tests are first performed for conditioning sets of size 1, and repeated for conditioning sets of increasing size, which in most cases limits the number of tests needed. The separating sets S(i, j), which records which variables were in the conditioning set that rendered variables i and j independent, are recorded. If max_depth is an integer, then this procedure is performed on conditioning sets of sizes 1:max_depth, and if max_depth == nothing, then all possible conditioning set sizes are potentially used.\nCreate a directed graph dg from g by replacing every undirected edge X - Y in g by the bidirectional edge X ↔ Y (i.e. construct two directional edges X → Y and Y → X). Orientiation rules 0-3 are then repeatedly applied to dg until no more edges can be oriented:\nRule 0 (orients v-structures): X ↔ Y ↔ Z becomes X → Y ← Z if Y is not in the separating set S(X, Z).\nRule 1 (prevents new v-structures): X → Y ↔ Z becomes X → Y → Z if X and Z are not adjacent.\nRule 2 (avoids cycles): X → Y → Z ↔ X becomes X → Y → Z ← X.\nRule 3: To avoid creating cycles or new v-structures, whenever X - Y → Z, X - W → Z, and X - Z but there is no edge between Y and W, turn the undirected X - Z edge into the directed edge X → Z.\n\nThe resulting directed graph (a SimpleDiGraph from Graphs.jl) is then returned.\n\nExamples\n\nPC algorithm with parametric independence tests\nPC algorithm with nonparametric independence tests\n\n\n\n\n\n","category":"type"},{"location":"#Associations.jl","page":"Associations.jl","title":"Associations.jl","text":"","category":"section"},{"location":"","page":"Associations.jl","title":"Associations.jl","text":"Associations","category":"page"},{"location":"#Associations","page":"Associations.jl","title":"Associations","text":"Associations\n\n(Image: CI) (Image: ) (Image: ) (Image: codecov) (Image: DOI)\n\nAssociations.jl is a package for quantifying associations, independence testing and causal inference.\n\nAll further information is provided in the documentation, which you can either find online or build locally by running the docs/make.jl file.\n\nKey features\n\nAssociation API: includes measures and their estimators for pairwise, conditional and other forms of association from conventional statistics, from dynamical systems theory, and from information theory: partial correlation, distance correlation, (conditional) mutual information, transfer entropy, convergent cross mapping and a lot more!\nIndependence testing API, which is automatically compatible with every association measure estimator implemented in the package. \nCausal (network) inference API integrating the association measures and independence testing framework.\n\nAddititional features\n\nExtending on features from ComplexityMeasures.jl, we also offer \n\nDiscretization API for multiple (multivariate) input datasets.\nMultivariate counting and probability estimation API.\nMultivariate information measure API\n\nInstallation\n\nTo install the package, run import Pkg; Pkg.add(\"Associations\").\n\nPreviously, this package was called CausalityTools.jl.\n\n\n\n\n\n","category":"module"},{"location":"#Latest-news","page":"Associations.jl","title":"Latest news","text":"","category":"section"},{"location":"","page":"Associations.jl","title":"Associations.jl","text":"info: Package rename\nThe package has been renamed from CausalityTools.jl to Associations.jl.","category":"page"},{"location":"","page":"Associations.jl","title":"Associations.jl","text":"Associations.jl has been updated to v4! ","category":"page"},{"location":"","page":"Associations.jl","title":"Associations.jl","text":"This update includes a number of breaking changes, several of which are not backwards compatible. These are done to ensure compatibility with ComplexityMeasures.jl v3, which provides discretization functionality that we use here.","category":"page"},{"location":"","page":"Associations.jl","title":"Associations.jl","text":"Important changes are:","category":"page"},{"location":"","page":"Associations.jl","title":"Associations.jl","text":"Convenience methods have been removed completely. Use association instead.\nExample systems have been removed.\nThe syntax for computing an association has changed. Estimators now always contain the definition it estimates. For example, association(MIShannon(), KSG1(), x, y) is now association(KSG1(MIShannon()), x, y).\nSurrogateTest has been renamed to SurrogateAssociationTest. \nSee the CHANGELOG.md for a complete list of changes.","category":"page"},{"location":"#Getting-started","page":"Associations.jl","title":"Getting started","text":"","category":"section"},{"location":"","page":"Associations.jl","title":"Associations.jl","text":"The quickest way to get going with the package is to check out the examples in the left-hand menu.","category":"page"},{"location":"","page":"Associations.jl","title":"Associations.jl","text":"info: Info\nTo make it easier to navigate the extensive documentation, all documentation strings are collapsed by default. Click the arrow icon in the top toolbar to expand/collapse the docstrings in a page.","category":"page"},{"location":"#Documentation-content","page":"Associations.jl","title":"Documentation content","text":"","category":"section"},{"location":"","page":"Associations.jl","title":"Associations.jl","text":"Association measures lists all implemented association measures and their estimators.\nIndependence testing lists all implemented ways of determining if an association between datasets is \"significant\".\nCausal inference lists all methods of inferring association networks (also called \"network graphs\" and \"causal graphs\") between multiple variables.\nNumerous examples for association measure estimation, independence testing, and network inference.","category":"page"},{"location":"#Input-data-for-Associations.jl","page":"Associations.jl","title":"Input data for Associations.jl","text":"","category":"section"},{"location":"","page":"Associations.jl","title":"Associations.jl","text":"Input data for Associations.jl are given as:","category":"page"},{"location":"","page":"Associations.jl","title":"Associations.jl","text":"Univariate timeseries, which are given as standard Julia Vectors.\nMultivariate timeseries, StateSpaceSets, or state space sets, which are given as StateSpaceSets. Many methods convert timeseries inputs to StateSpaceSet for faster internal computations.\nCategorical data can be used with JointProbabilities to compute various information theoretic measures and is represented using any iterable whose elements can be any arbitrarily complex data type (as long as it's hashable), for example Vector{String}, {Vector{Int}}, or Vector{Tuple{Int, String}}.","category":"page"},{"location":"","page":"Associations.jl","title":"Associations.jl","text":"StateSpaceSets.StateSpaceSet","category":"page"},{"location":"#StateSpaceSets.StateSpaceSet","page":"Associations.jl","title":"StateSpaceSets.StateSpaceSet","text":"StateSpaceSet{D, T, V} <: AbstractVector{V}\n\nA dedicated interface for sets in a state space. It is an ordered container of equally-sized points of length D, with element type T, represented by a vector of type V. Typically V is SVector{D,T} or Vector{T} and the data are always stored internally as Vector{V}. SSSet is an alias for StateSpaceSet.\n\nThe underlying Vector{V} can be obtained by vec(ssset), although this is almost never necessary because StateSpaceSet subtypes AbstractVector and extends its interface. StateSpaceSet also supports almost all sensible vector operations like append!, push!, hcat, eachrow, among others. When iterated over, it iterates over its contained points.\n\nConstruction\n\nConstructing a StateSpaceSet is done in three ways:\n\nBy giving in each individual columns of the state space set as Vector{<:Real}: StateSpaceSet(x, y, z, ...).\nBy giving in a matrix whose rows are the state space points: StateSpaceSet(m).\nBy giving in directly a vector of vectors (state space points): StateSpaceSet(v_of_v).\n\nAll constructors allow for the keyword container which sets the type of V (the type of inner vectors). At the moment options are only SVector, MVector, or Vector, and by default SVector is used.\n\nDescription of indexing\n\nWhen indexed with 1 index, StateSpaceSet behaves exactly like its encapsulated vector. i.e., a vector of vectors (state space points). When indexed with 2 indices it behaves like a matrix where each row is a point.\n\nIn the following let i, j be integers, typeof(X) <: AbstractStateSpaceSet and v1, v2 be <: AbstractVector{Int} (v1, v2 could also be ranges, and for performance benefits make v2 an SVector{Int}).\n\nX[i] == X[i, :] gives the ith point (returns an SVector)\nX[v1] == X[v1, :], returns a StateSpaceSet with the points in those indices.\nX[:, j] gives the jth variable timeseries (or collection), as Vector\nX[v1, v2], X[:, v2] returns a StateSpaceSet with the appropriate entries (first indices being \"time\"/point index, while second being variables)\nX[i, j] value of the jth variable, at the ith timepoint\n\nUse Matrix(ssset) or StateSpaceSet(matrix) to convert. It is assumed that each column of the matrix is one variable. If you have various timeseries vectors x, y, z, ... pass them like StateSpaceSet(x, y, z, ...). You can use columns(dataset) to obtain the reverse, i.e. all columns of the dataset in a tuple.\n\n\n\n\n\n","category":"type"},{"location":"#Maintainers-and-contributors","page":"Associations.jl","title":"Maintainers and contributors","text":"","category":"section"},{"location":"","page":"Associations.jl","title":"Associations.jl","text":"The Associations.jl software is maintained by Kristian Agasøster Haaga, who also curates and writes this documentation. Significant contributions to the API and documentation design has been made by George Datseris, which also co-authors ComplexityMeasures.jl, which we develop in tandem with this package.","category":"page"},{"location":"","page":"Associations.jl","title":"Associations.jl","text":"A complete list of contributors to this repo are listed on the main Github page. Some important contributions are:","category":"page"},{"location":"","page":"Associations.jl","title":"Associations.jl","text":"Norbert Genera contributed bug reports and investigations that led to subsequent improvements for the pairwise asymmetric inference algorithm and an improved cross mapping API.\nDavid Diego's contributions were invaluable in the initial stages of development. His MATLAB code provided the basis for several transfer entropy methods and binning-related code.\nGeorge Datseris also ported KSG1 and KSG2 mutual information estimators to Neighborhood.jl.\nBjarte Hannisdal provided tutorials for mutual information.\nTor Einar Møller contributed to cross-mapping methods in initial stages of development.","category":"page"},{"location":"","page":"Associations.jl","title":"Associations.jl","text":"Many individuals has contributed code to other packages in the JuliaDynamics ecosystem which we use here. Contributors are listed in the respective GitHub repos and webpages.","category":"page"},{"location":"api/cross_map_api/","page":"Cross-map API","title":"Cross-map API","text":"CollapsedDocStrings = true","category":"page"},{"location":"api/cross_map_api/#Cross-map-API","page":"Cross-map API","title":"Cross-map API","text":"","category":"section"},{"location":"api/cross_map_api/#Estimators","page":"Cross-map API","title":"Estimators","text":"","category":"section"},{"location":"api/cross_map_api/","page":"Cross-map API","title":"Cross-map API","text":"CrossmapEstimator\nRandomVectors\nRandomSegment\nExpandingSegment\nEnsemble","category":"page"},{"location":"api/cross_map_api/#Associations.CrossmapEstimator","page":"Cross-map API","title":"Associations.CrossmapEstimator","text":"CrossmapEstimator{M<:CrossmapMeasure, LIBSIZES, RNG}\n\nThe abstract supertype for all cross-map estimators.\n\nConcrete subtypes\n\nRandomVectors\nRandomSegment\nExpandingSegment\n\nDescription\n\nBecause the type of the library may differ between estimators, and because RNGs from different packages may be used, subtypes must implement the LIBSIZES and RNG type parameters.\n\nFor efficiency purposes, subtypes may contain mutable containers that can be re-used for ensemble analysis (see Ensemble).\n\ninfo: Libraries\nA cross-map estimator uses the concept of \"libraries\". A library is essentially just a reference to a set of points, and usually, a library refers to indices of points, not the actual points themselves.For example, for timeseries, RandomVectors(libsizes = 50:25:100) produces three separate libraries, where the first contains 50 randomly selected time indices, the second contains 75 randomly selected time indices, and the third contains 100 randomly selected time indices. This of course assumes that all quantities involved can be indexed using the same time indices, meaning that the concept of \"library\" only makes sense after relevant quantities have been jointly embedded, so that they can be jointly indexed. For non-instantaneous prediction, the maximum possible library size shrinks with the magnitude of the index/time-offset for the prediction.For spatial analyses (not yet implemented), indices could be more complex and involve multi-indices.\n\n\n\n\n\n","category":"type"},{"location":"api/cross_map_api/#Associations.RandomVectors","page":"Cross-map API","title":"Associations.RandomVectors","text":"RandomVectors <: CrossmapEstimator\nRandomVectors(definition::CrossmapMeasure; libsizes, replace = false, \n rng = Random.default_rng())\n\nCross map once over N = length(libsizes) different \"point libraries\", where point indices are selected randomly (not considering time ordering). \n\nThis is method 3 from Luo et al. (2015). See CrossmapEstimator for an in-depth explanation of what \"library\" means in this context.\n\nDescription\n\nThe cardinality of the point libraries are given by libsizes. One set of random point indices is selected per L ∈ libsizes, and the i-th library has cardinality k = libsizes[i]. \n\nPoint indices within each library are randomly selected, independently of other libraries. A user-specified rng may be specified for reproducibility. The replace argument controls whether sampling is done with or without replacement. If the time series you're cross mapping between have length M, and Lᵢ < M for any Lᵢ ∈ libsizes, then you must set replace = true.\n\nReturns\n\nThe return type when used with association depends on the type of libsizes.\n\nIf libsizes is an Int (a single library), then a single cross-map estimate is returned.\nIf libsizes is an AbstractVector{Int} (multiple libraries), then a vector of cross-map estimates is returned –- one per library.\n\nSee also: CrossmapEstimator.\n\n\n\n\n\n","category":"type"},{"location":"api/cross_map_api/#Associations.RandomSegment","page":"Cross-map API","title":"Associations.RandomSegment","text":"RandomSegment <: CrossmapEstimator\nRandomSegment(definition::CrossmapMeasure; libsizes::Int, rng = Random.default_rng())\n\nCross map once over N = length(libsizes) different \"point libraries\", where point indices are selected as time-contiguous segments with random starting points.\n\nThis is method 2 from Luo et al. (2015). See CrossmapEstimator for an in-depth explanation of what \"library\" means in this context.\n\nDescription\n\nThe cardinality of the point index segments are given by libsizes. One segment with a randomly selected starting point is picked per L ∈ libsizes, and the i-th point index segment has cardinality k = libsizes[i]. \n\nThe starting point for each library is selected independently of other libraries. A user-specified rng may be specified for reproducibility. If the time series you're cross mapping between have length M, and Lᵢ < M for any Lᵢ ∈ libsizes, then an error will be thrown.\n\nA user-specified rng may be specified for reproducibility.\n\nReturns\n\nThe return type when used with association depends on the type of libsizes.\n\nIf libsizes is an Int (a single library), then a single cross-map estimate is returned.\nIf libsizes is an AbstractVector{Int} (multiple libraries), then a vector of cross-map estimates is returned –- one per library.\n\nSee also: CrossmapEstimator.\n\n\n\n\n\n","category":"type"},{"location":"api/cross_map_api/#Associations.ExpandingSegment","page":"Cross-map API","title":"Associations.ExpandingSegment","text":"ExpandingSegment <: CrossmapEstimator\nExpandingSegment(definition::CrossmapMeasure; libsizes, rng = Random.default_rng())\n\nCross map once over N = length(libsizes) different \"point libraries\", where point indices are selected as time-contiguous segments/windows.\n\nThis is the method from (Sugihara et al., 2012). See CrossmapEstimator for an in-depth explanation of what \"library\" means in this context.\n\nDescription\n\nPoint index segments are selected as first available data point index, up to the Lth data point index. This results in one library of contiguous time indices per L ∈ libsizes.\n\nIf used in an ensemble setting, the estimator is applied to time indices Lmin:step:Lmax of the joint embedding.\n\nReturns\n\nThe return type when used with association depends on the type of libsizes.\n\nIf libsizes is an Int (a single library), then a single cross-map estimate is returned.\nIf libsizes is an AbstractVector{Int} (multiple libraries), then a vector of cross-map estimates is returned –- one per library.\n\n\n\n\n\n","category":"type"},{"location":"api/cross_map_api/#Associations.Ensemble","page":"Cross-map API","title":"Associations.Ensemble","text":"Ensemble(est::CrossmapEstimator{<:CrossmapMeasure}, nreps::Int = 100)\n\nA directive to compute an ensemble analysis, where measure (e.g. ConvergentCrossMapping) is computed using the given estimator est (e.g. RandomVectors)\n\nExamples\n\nExample 1: Reproducing Figure 3A from Sugihara et al. (2012).\n\n\n\n\n\n","category":"type"},{"location":"api/cross_map_api/#Advanced-utility-methods","page":"Cross-map API","title":"Advanced utility methods","text":"","category":"section"},{"location":"api/cross_map_api/","page":"Cross-map API","title":"Cross-map API","text":"For most use cases, it is sufficient to provide a CrossmapEstimator to association to compute a cross map measure. However, in some cases it can be useful to have more fine-grained controls. We offer a few utility functions for this purpose.","category":"page"},{"location":"api/cross_map_api/","page":"Cross-map API","title":"Cross-map API","text":"These functions are used in the examples below, where we reproduce Figures 3C and 3D of Sugihara et al. (2012) and reproduce figures from McCracken and Weigel (2014).","category":"page"},{"location":"api/cross_map_api/","page":"Cross-map API","title":"Cross-map API","text":"predict\ncrossmap","category":"page"},{"location":"api/cross_map_api/#Associations.predict","page":"Cross-map API","title":"Associations.predict","text":"predict(measure::CrossmapEstimator, t::AbstractVector, s::AbstractVector) → t̂ₛ, t̄, ρ\npredict(measure::CrossmapEstimator, t̄::AbstractVector, S̄::AbstractStateSpaceSet) → t̂ₛ\n\nPerform point-wise cross mappings between source embeddings and target time series according to the algorithm specified by the given cross-map measure (e.g. ConvergentCrossMapping or PairwiseAsymmetricInference).\n\nFirst method: Jointly embeds the target t and source s time series (according to measure) to obtain time-index aligned target timeseries t̄ and source embedding S̄ (which is now a StateSpaceSet). Then calls predict(measure, t̄, S̄) (the first method), and returns both the predictions t̂ₛ, observations t̄ and their correspondence ρ according to measure.\nSecond method: Returns a vector of predictions t̂ₛ (t̂ₛ := \"predictions of t̄ based on source embedding S̄\"), where t̂ₛ[i] is the prediction for t̄[i]. It assumes pre-embedded data which have been correctly time-aligned using a joint embedding, i.e. such that t̄[i] and S̄[i] correspond to the same time index.\n\nDescription\n\nFor each i ∈ {1, 2, …, N} where N = length(t) == length(s), we make the prediction t̂[i] (an estimate of t[i]) based on a linear combination of D + 1 other points in t, where the selection of points and weights for the linear combination are determined by the D+1 nearest neighbors of the point S̄[i]. The details of point selection and weights depend on measure.\n\nNote: Some CrossmapMeasures may define more general mapping procedures. If so, the algorithm is described in their docstring.\n\n\n\n\n\n","category":"function"},{"location":"api/cross_map_api/#Associations.crossmap","page":"Cross-map API","title":"Associations.crossmap","text":"crossmap(measure::CrossmapEstimator, t::AbstractVector, s::AbstractVector) → ρ::Real\ncrossmap(measure::CrossmapEstimator, est, t::AbstractVector, s::AbstractVector) → ρ::Vector\ncrossmap(measure::CrossmapEstimator, t̄::AbstractVector, S̄::AbstractStateSpaceSet) → ρ\n\nCompute the cross map estimates between between raw time series t and s (and return the real-valued cross-map statistic ρ). If a CrossmapEstimator est is provided, cross mapping is done on random subsamples of the data, where subsampling is dictated by est (a vector of values for ρ is returned).\n\nAlternatively, cross-map between time-aligned time series t̄ and source embedding S̄ that have been constructed by jointly (pre-embedding) some input data.\n\nThis is just a wrapper around predict that simply returns the correspondence measure between the source and the target.\n\n\n\n\n\n","category":"function"},{"location":"api/cross_map_api/#example_ConvergentCrossMapping_reproducing_sugihara","page":"Cross-map API","title":"Example: reproducing Sugihara et al. (2012)","text":"","category":"section"},{"location":"api/cross_map_api/","page":"Cross-map API","title":"Cross-map API","text":"note: Run blocks consecutively\nIf copying these examples and running them locally, make sure the relevant packages (given in the first block) are loaded first.","category":"page"},{"location":"api/cross_map_api/#Figure-3A","page":"Cross-map API","title":"Figure 3A","text":"","category":"section"},{"location":"api/cross_map_api/","page":"Cross-map API","title":"Cross-map API","text":"Let's reproduce figure 3A too, focusing only on ConvergentCrossMapping this time. In this figure, they compute the cross mapping for libraries of increasing size, always starting at time index 1. This approach - which we here call the ExpandingSegment estimator - is one of many ways of estimating the correspondence between observed and predicted value.","category":"page"},{"location":"api/cross_map_api/","page":"Cross-map API","title":"Cross-map API","text":"For this example, they use a bidirectional system with asymmetrical coupling strength.","category":"page"},{"location":"api/cross_map_api/","page":"Cross-map API","title":"Cross-map API","text":"using Associations\nusing Statistics\nusing LabelledArrays\nusing StaticArrays\nusing DynamicalSystemsBase\nusing StateSpaceSets\nusing CairoMakie, Printf\n\nfunction eom_logistic_sugi(u, p, t)\n (; rx, ry, βxy, βyx) = p\n (; x, y) = u\n\n dx = x*(rx - rx*x - βxy*y)\n dy = y*(ry - ry*y - βyx*x)\n return SVector{2}(dx, dy)\nend\n\n# βxy := effect on x of y\n# βyx := effect on y of x\nfunction logistic_sugi(; u0 = rand(2), rx, ry, βxy, βyx)\n p = @LArray [rx, ry, βxy, βyx] (:rx, :ry, :βxy, :βyx)\n DiscreteDynamicalSystem(eom_logistic_sugi, u0, p)\nend\n\n# Used in `reproduce_figure_3A_naive`, and `reproduce_figure_3A_ensemble` below.\nfunction add_to_fig!(fig_pos, libsizes, ρs_x̂y, ρs_ŷx; title = \"\", quantiles = false)\n ax = Axis(fig_pos; title, aspect = 1,\n xlabel = \"Library size\", ylabel = \"Correlation (ρ)\")\n ylims!(ax, (-1, 1))\n hlines!([0], linestyle = :dash, alpha = 0.5, color = :grey)\n scatterlines!(libsizes, median.(ρs_x̂y), label = \"x̂|y\", color = :blue)\n scatterlines!(libsizes, median.(ρs_ŷx), label = \"ŷ|x\", color = :red)\n if quantiles\n band!(libsizes, quantile.(ρs_x̂y, 0.05), quantile.(ρs_x̂y, 0.95), color = (:blue, 0.5))\n band!(libsizes, quantile.(ρs_ŷx, 0.05), quantile.(ρs_ŷx, 0.95), color = (:red, 0.5))\n end\n axislegend(ax, position = :rb)\nend\n\nfunction reproduce_figure_3A_naive(definition::CrossmapMeasure)\n sys_bidir = logistic_sugi(; u0 = [0.2, 0.4], rx = 3.7, ry = 3.700001, βxy = 0.02, βyx = 0.32);\n x, y = columns(first(trajectory(sys_bidir, 3100, Ttr = 10000)));\n libsizes = [20:2:50; 55:5:200; 300:50:500; 600:100:900; 1000:500:3000]\n est = ExpandingSegment(definition; libsizes);\n ρs_x̂y = crossmap(est, x, y)\n ρs_ŷx = crossmap(est, y, x)\n\n with_theme(theme_minimal(),\n markersize = 5) do\n fig = Figure(resolution = (800, 300))\n add_to_fig!(fig[1, 1], libsizes, ρs_x̂y, ρs_ŷx; title = \"`ExpandingSegment`\")\n fig\n end\nend\n\nreproduce_figure_3A_naive(ConvergentCrossMapping(d = 3))","category":"page"},{"location":"api/cross_map_api/","page":"Cross-map API","title":"Cross-map API","text":"Hm. This looks a bit like the paper, but the curve is not smooth. We can do better!","category":"page"},{"location":"api/cross_map_api/","page":"Cross-map API","title":"Cross-map API","text":"It is not clear from the paper exactly what they plot in their Figure 3A, if they plot an average of some kind, or precisely what parameters and initial conditions they use. However, we can get a smoother plot by using a Ensemble. Combined with a CrossmapEstimator, it uses Monte Carlo resampling on subsets of the input data to compute an ensemble of ρs that we here use to compute the median and 90-th percentile range for each library size.","category":"page"},{"location":"api/cross_map_api/","page":"Cross-map API","title":"Cross-map API","text":"function reproduce_figure_3A_ensemble(definition::CrossmapMeasure)\n sys_bidir = logistic_sugi(; u0 = [0.4, 0.2], rx = 3.8, ry = 3.5, βxy = 0.02, βyx = 0.1);\n x, y = columns(first(trajectory(sys_bidir, 5000, Ttr = 10000)));\n # Note: our time series are 1000 points long. When embedding, some points are\n # lost, so we must use slightly less points for the segments than \n # there are points in the original time series.\n libsizes = [20:5:50; 55:5:200; 300:50:500; 600:100:900; 1000:500:2000]\n # No point in doing more than one rep, because there data are always the same\n # for `ExpandingSegment.`\n ensemble_ev = Ensemble(ExpandingSegment(definition; libsizes); nreps = 1)\n ensemble_rs = Ensemble(RandomSegment(definition; libsizes); nreps = 30)\n ensemble_rv = Ensemble(RandomVectors(definition; libsizes); nreps = 30)\n ρs_x̂y_es = crossmap(ensemble_ev, x, y)\n ρs_ŷx_es = crossmap(ensemble_ev, y, x)\n ρs_x̂y_rs = crossmap(ensemble_rs, x, y)\n ρs_ŷx_rs = crossmap(ensemble_rs, y, x)\n ρs_x̂y_rv = crossmap(ensemble_rv, x, y)\n ρs_ŷx_rv = crossmap(ensemble_rv, y, x)\n\n with_theme(theme_minimal(),\n markersize = 5) do\n fig = Figure(resolution = (800, 300))\n add_to_fig!(fig[1, 1], libsizes, ρs_x̂y_es, ρs_ŷx_es; title = \"`ExpandingSegment`\", quantiles = false) # quantiles make no sense for `ExpandingSegment`\n add_to_fig!(fig[1, 2], libsizes, ρs_x̂y_rs, ρs_ŷx_rs; title = \"`RandomSegment`\", quantiles = true)\n add_to_fig!(fig[1, 3], libsizes, ρs_x̂y_rv, ρs_ŷx_rv; title = \"`RandomVector`\", quantiles = true)\n fig\n end\nend\n\nreproduce_figure_3A_ensemble(ConvergentCrossMapping(d = 3, τ = -1))","category":"page"},{"location":"api/cross_map_api/","page":"Cross-map API","title":"Cross-map API","text":"With the RandomVectors estimator, the mean of our ensemble ρs seem to look pretty much identical to Figure 3A in Sugihara et al. The RandomSegment estimator also performs pretty well, but since subsampled segments are contiguous, there are probably some autocorrelation effects at play.","category":"page"},{"location":"api/cross_map_api/","page":"Cross-map API","title":"Cross-map API","text":"We can avoid the autocorrelation issue by tuning the w parameter of the ConvergentCrossMapping measure, which is the Theiler window. Setting the Theiler window to w > 0, we can exclude neighbors of a query point p that are close to p in time, and thus deal with autocorrelation issues that way (the default w = 0 excludes only the point itself). Let's re-do the analysis with w = 5, just for fun.","category":"page"},{"location":"api/cross_map_api/","page":"Cross-map API","title":"Cross-map API","text":"reproduce_figure_3A_ensemble(ConvergentCrossMapping(d = 3, τ = -1, w = 5))","category":"page"},{"location":"api/cross_map_api/","page":"Cross-map API","title":"Cross-map API","text":"There wasn't really that much of a difference, since for the logistic map, the autocorrelation function flips sign for every lag increase. However, for examples from other systems, tuning w may be important.","category":"page"},{"location":"api/cross_map_api/#Figure-3B","page":"Cross-map API","title":"Figure 3B","text":"","category":"section"},{"location":"api/cross_map_api/","page":"Cross-map API","title":"Cross-map API","text":"What about figure 3B? Here they generate time series of length 400 for a range of values for both coupling parameters, and plot the dominant direction Delta = rho(hatx y) - rho(haty x).","category":"page"},{"location":"api/cross_map_api/","page":"Cross-map API","title":"Cross-map API","text":"In the paper, they use a 1000 different parameterizations for the logistic map parameters, but don't state what is summarized in the plot. For simplicity, we'll therefore just stick to rx = ry = 3.7, as in the examples above, and just loop over the coupling strengths in either direction.","category":"page"},{"location":"api/cross_map_api/","page":"Cross-map API","title":"Cross-map API","text":"function reproduce_figure_3B()\n βxys = 0.0:0.02:0.4\n βyxs = 0.0:0.02:0.4\n ρx̂ys = zeros(length(βxys), length(βyxs))\n ρŷxs = zeros(length(βxys), length(βyxs))\n\n for (i, βxy) in enumerate(βxys)\n for (j, βyx) in enumerate(βyxs)\n sys_bidir = logistic_sugi(; u0 = [0.2, 0.4], rx = 3.7, ry = 3.7, βxy, βyx);\n # Generate 1000 points. Randomly select a 400-pt long segment.\n x, y = columns(first(trajectory(sys_bidir, 400, Ttr = 10000)));\n definition = CCM(d = 3, w = 5, τ = -1)\n ensemble = Ensemble(RandomVectors(definition; libsizes = 100), nreps = 50)\n ρx̂ys[i, j] = mean(crossmap(ensemble, x, y))\n ρŷxs[i, j] = mean(crossmap(ensemble, y, x))\n end\n end\n Δ = ρŷxs .- ρx̂ys\n\n with_theme(theme_minimal(),\n markersize = 5) do\n fig = Figure();\n ax = Axis(fig[1, 1], xlabel = \"βxy\", ylabel = \"βyx\")\n cont = contourf!(ax, Δ, levels = range(-1, 1, length = 10),\n colormap = :curl)\n ax.xticks = 1:length(βxys), string.([i % 2 == 0 ? βxys[i] : \"\" for i in 1:length(βxys)])\n ax.yticks = 1:length(βyxs), string.([i % 2 == 0 ? βyxs[i] : \"\" for i in 1:length(βyxs)])\n Colorbar(fig[1 ,2], cont, label = \"Δ (ρ(ŷ|x) - ρ(x̂|y))\")\n tightlimits!(ax)\n fig\n end\nend\n\nreproduce_figure_3B()","category":"page"},{"location":"api/cross_map_api/#example_sugihara_figs3Cand3D","page":"Cross-map API","title":"Figures 3C and 3D","text":"","category":"section"},{"location":"api/cross_map_api/","page":"Cross-map API","title":"Cross-map API","text":"Let's reproduce figures 3C and 3D in Sugihara et al. (2012), which introduced the ConvergentCrossMapping measure. Equations and parameters can be found in their supplementary material. Simulatenously, we also compute the PairwiseAsymmetricInference measure from McCracken and Weigel (2014), which is a related method, but uses a slightly different embedding.","category":"page"},{"location":"api/cross_map_api/","page":"Cross-map API","title":"Cross-map API","text":"using Associations\nusing Statistics\nusing LabelledArrays\nusing StaticArrays\nusing DynamicalSystemsBase\nusing StateSpaceSets\nusing CairoMakie, Printf\n\n# -----------------------------------------------------------------------------------------\n# Create 500-point long time series for Sugihara et al. (2012)'s example for figure 3.\n# -----------------------------------------------------------------------------------------\nsys_unidir = logistic_sugi(; u0 = [0.2, 0.4], rx = 3.7, ry = 3.700001, βxy = 0.00, βyx = 0.32);\nx, y = columns(first(trajectory(sys_unidir, 500, Ttr = 10000)));\n\n# -----------------------------------------------------------------------------------------\n# Cross map.\n# -----------------------------------------------------------------------------------------\nm_ccm = ConvergentCrossMapping(d = 2)\nm_pai = PairwiseAsymmetricInference(d = 2)\n# Make predictions x̂y, i.e. predictions `x̂` made from embedding of y (AND x, if PAI)\nt̂ccm_x̂y, tccm_x̂y, ρccm_x̂y = predict(m_ccm, x, y)\nt̂pai_x̂y, tpai_x̂y, ρpai_x̂y = predict(m_pai, x, y);\n# Make predictions ŷx, i.e. predictions `ŷ` made from embedding of x (AND y, if PAI)\nt̂ccm_ŷx, tccm_ŷx, ρccm_ŷx = predict(m_ccm, y, x)\nt̂pai_ŷx, tpai_ŷx, ρpai_ŷx = predict(m_pai, y, x);\n\n# -----------------------------------------------------------------------------------------\n# Plot results\n# -----------------------------------------------------------------------------------------\nρs = (ρccm_x̂y, ρpai_x̂y, ρccm_ŷx, ρpai_ŷx)\nsccm_x̂y, spai_x̂y, sccm_ŷx, spai_ŷx = (map(ρ -> (@sprintf \"%.3f\" ρ), ρs)...,)\n\nρs = (ρccm_x̂y, ρpai_x̂y, ρccm_ŷx, ρpai_ŷx)\nsccm_x̂y, spai_x̂y, sccm_ŷx, spai_ŷx = (map(ρ -> (@sprintf \"%.3f\" ρ), ρs)...,)\n\nwith_theme(theme_minimal(),\n markersize = 5) do\n fig = Figure();\n ax_ŷx = Axis(fig[2,1], aspect = 1, xlabel = \"y(t) (observed)\", ylabel = \"ŷ(t) | x (predicted)\")\n ax_x̂y = Axis(fig[2,2], aspect = 1, xlabel = \"x(t) (observed)\", ylabel = \"x̂(t) | y (predicted)\")\n xlims!(ax_ŷx, (0, 1)), ylims!(ax_ŷx, (0, 1))\n xlims!(ax_x̂y, (0, 1)), ylims!(ax_x̂y, (0, 1))\n ax_ts = Axis(fig[1, 1:2], xlabel = \"Time (t)\", ylabel = \"Value\")\n scatterlines!(ax_ts, x[1:300], label = \"x\")\n scatterlines!(ax_ts, y[1:300], label = \"y\")\n axislegend()\n scatter!(ax_ŷx, tccm_ŷx, t̂ccm_ŷx, label = \"CCM (ρ = $sccm_ŷx)\", color = :black)\n scatter!(ax_ŷx, tpai_ŷx, t̂pai_ŷx, label = \"PAI (ρ = $spai_ŷx)\", color = :red)\n axislegend(ax_ŷx, position = :lt)\n scatter!(ax_x̂y, tccm_x̂y, t̂ccm_x̂y, label = \"CCM (ρ = $sccm_x̂y)\", color = :black)\n scatter!(ax_x̂y, tpai_x̂y, t̂pai_x̂y, label = \"PAI (ρ = $spai_x̂y)\", color = :red)\n axislegend(ax_x̂y, position = :lt)\n fig\nend","category":"page"},{"location":"api/cross_map_api/#example_PairwiseAsymmetricInference_reproduce_mccracken","page":"Cross-map API","title":"Example: reproducing McCracken & Weigel (2014)","text":"","category":"section"},{"location":"api/cross_map_api/","page":"Cross-map API","title":"Cross-map API","text":"Let's try to reproduce figure 8 from McCracken and Weigel (2014)'s paper on PairwiseAsymmetricInference (PAI). We'll start by defining the their example B (equations 6-7). This system consists of two variables X and Y, where X drives Y.","category":"page"},{"location":"api/cross_map_api/","page":"Cross-map API","title":"Cross-map API","text":"After we have computed the PAI in both directions, we define a measure of directionality as the difference between PAI in the X to Y direction and in the Y to X direction, so that if X drives Y, then Delta 0.","category":"page"},{"location":"api/cross_map_api/","page":"Cross-map API","title":"Cross-map API","text":"using Associations\nusing LabelledArrays\nusing StaticArrays\nusing DynamicalSystemsBase\nusing StateSpaceSets\nusing CairoMakie, Printf\nusing Distributions: Normal\nusing Statistics: mean, std\n\nfunction eom_nonlinear_sindriver(dx, x, p, n)\n a, b, c, t, Δt = (p...,)\n x, y = x[1], x[2]\n 𝒩 = Normal(0, 1)\n \n dx[1] = sin(t)\n dx[2] = a*x * (1 - b*x) + c* rand(𝒩)\n p[end-1] += 1 # update t\n\n return\nend\n\nfunction nonlinear_sindriver(;u₀ = rand(2), a = 1.0, b = 1.0, c = 2.0, Δt = 1)\n DiscreteDynamicalSystem(eom_nonlinear_sindriver, u₀, [a, b, c, 0, Δt])\nend\n\nfunction reproduce_figure_8_mccraken(; \n c = 2.0, Δt = 0.2,\n as = 0.5:0.5:5.0,\n bs = 0.5:0.5:5.0)\n # -----------------------------------------------------------------------------------------\n # Generate many time series for many different values of the parameters `a` and `b`,\n # and compute PAI. This will replicate the upper right panel of \n # figure 8 in McCracken & Weigel (2014).\n # -----------------------------------------------------------------------------------------\n \n measure = PairwiseAsymmetricInference(d = 3)\n\n # Manually resample `nreps` length-`L` time series and use mean ρ(x̂|X̄y) - ρ(ŷ|Ȳx)\n # for each parameter combination.\n nreps = 50\n L = 200 # length of timeseries\n Δ = zeros(length(as), length(bs))\n for (i, a) in enumerate(as)\n for (j, b) in enumerate(bs)\n s = nonlinear_sindriver(; a, b, c, Δt)\n x, y = columns(first(trajectory(s, 1000, Ttr = 10000)))\n Δreps = zeros(nreps)\n for i = 1:nreps\n # Ensure we're subsampling at the same time indices. \n ind_start = rand(1:(1000-L))\n r = ind_start:(ind_start + L)\n Δreps[i] = @views crossmap(measure, y[r], x[r]) - \n crossmap(measure, x[r], y[r])\n end\n Δ[i, j] = mean(Δreps)\n end\n end\n\n # -----------------------------------------------------------------------------------------\n # An example time series for plotting.\n # -----------------------------------------------------------------------------------------\n sys = nonlinear_sindriver(; a = 1.0, b = 1.0, c, Δt)\n npts = 500\n orbit = first(trajectory(sys, npts, Ttr = 10000))\n x, y = columns(orbit)\n with_theme(theme_minimal(),\n markersize = 5) do\n \n X = x[1:300]\n Y = y[1:300]\n fig = Figure();\n ax_ts = Axis(fig[1, 1:2], xlabel = \"Time (t)\", ylabel = \"Value\")\n scatterlines!(ax_ts, (X .- mean(X)) ./ std(X), label = \"x\")\n scatterlines!(ax_ts, (Y .- mean(Y)) ./ std(Y), label = \"y\")\n axislegend()\n\n ax_hm = Axis(fig[2, 1:2], xlabel = \"a\", ylabel = \"b\")\n ax_hm.yticks = (1:length(as), string.([i % 2 == 0 ? as[i] : \"\" for i = 1:length(as)]))\n ax_hm.xticks = (1:length(bs), string.([i % 2 == 0 ? bs[i] : \"\" for i = 1:length(bs)]))\n hm = heatmap!(ax_hm, Δ, colormap = :viridis)\n Colorbar(fig[2, 3], hm; label = \"Δ' = ρ(ŷ | yx) - ρ(x̂ | xy)\")\n fig\n end\nend\n\nreproduce_figure_8_mccraken()","category":"page"},{"location":"api/cross_map_api/","page":"Cross-map API","title":"Cross-map API","text":"We haven't used as many parameter combinations as McCracken and Weigel (2014) did, but we get a figure that looks roughly similar to theirs.","category":"page"},{"location":"api/cross_map_api/","page":"Cross-map API","title":"Cross-map API","text":"As expected, Delta 0 for all parameter combinations, implying that X \"PAI drives\" Y.","category":"page"}] +[{"location":"references/#References","page":"References","title":"References","text":"","category":"section"},{"location":"references/","page":"References","title":"References","text":"Abe, S. and Rajagopal, A. K. (2001). Nonadditive conditional entropy and its significance for local realism. Physica A: Statistical Mechanics and its Applications 289, 157–164.\n\n\n\nAlizadeh, N. H. and Arghami, N. R. (2010). A new estimator of entropy. Journal of the Iranian Statistical Society (JIRSS).\n\n\n\nAmigó, J. M. and Hirata, Y. (2018). Detecting directional couplings from multivariate flows by the joint distance distribution. Chaos 28, 075302.\n\n\n\nAndrzejak, R. G.; Kraskov, A.; Stögbauer, H.; Mormann, F. and Kreuz, T. (2003). Bivariate surrogate techniques: necessity, strengths, and caveats. Physical review E 68, 066202.\n\n\n\nArnhold, J.; Grassberger, P.; Lehnertz, K. and Elger, C. E. (1999). A robust method for detecting interdependences: application to intracranially recorded EEG. Physica D: Nonlinear Phenomena 134, 419–430.\n\n\n\nArora, A.; Meister, C. and Cotterell, R. (2022). Estimating the Entropy of Linguistic Distributions, arXiv, arXiv:2204.01469 [cs.CL].\n\n\n\nAzadkia, M. and Chatterjee, S. (2021). A simple measure of conditional dependence. The Annals of Statistics 49, 3070–3102.\n\n\n\nAzami, H. and Escudero, J. (2016). Amplitude-aware permutation entropy: Illustration in spike detection and signal segmentation. Computer Methods and Programs in Biomedicine 128, 40–51.\n\n\n\nBandt, C. and Pompe, B. (2002). Permutation Entropy: A Natural Complexity Measure for Time Series. Phys. Rev. Lett. 88, 174102.\n\n\n\nBerger, S.; Kravtsiv, A.; Schneider, G. and Jordan, D. (2019). Teaching Ordinal Patterns to a Computer: Efficient Encoding Algorithms Based on the Lehmer Code. Entropy 21.\n\n\n\nChao, A. and Shen, T.-J. (2003). Nonparametric estimation of Shannon's index of diversity when there are unseen species in sample. Environmental and Ecological Statistics 10, 429–443.\n\n\n\nCharzyńska, A. and Gambin, A. (2016). Improvement of the k-nn Entropy Estimator with Applications in Systems Biology. Entropy 18.\n\n\n\nChatterjee, S. (2021). A new coefficient of correlation. Journal of the American Statistical Association 116, 2009–2022.\n\n\n\nChicharro, D. and Andrzejak, R. G. (2009). Reliable detection of directional couplings using rank statistics. Physical Review E 80, 026217.\n\n\n\nCorrea, J. C. (1995). A new estimator of entropy. Communications in Statistics - Theory and Methods 24, 2439–2449, arXiv:https://doi.org/10.1080/03610929508831626.\n\n\n\nCover, T. M. (1999). Elements of information theory (John Wiley & Sons).\n\n\n\nDatseris, G. and Haaga, K. A. (2024). ComplexityMeasures. jl: scalable software to unify and accelerate entropy and complexity timeseries analysis, arXiv preprint arXiv:2406.05011.\n\n\n\nDette, H.; Siburg, K. F. and Stoimenov, P. A. (2013). A Copula-Based Non-parametric Measure of Regression Dependence. Scandinavian Journal of Statistics 40, 21–41.\n\n\n\nEbrahimi, N.; Pflughoeft, K. and Soofi, E. S. (1994). Two measures of sample entropy. Statistics & Probability Letters 20, 225–234.\n\n\n\nvan Erven, T. and Harremos, P. (2014). Rényi Divergence and Kullback-Leibler Divergence. IEEE Transactions on Information Theory 60, 3797–3820.\n\n\n\nFrenzel, S. and Pompe, B. (2007). Partial Mutual Information for Coupling Analysis of Multivariate Time Series. Phys. Rev. Lett. 99, 204101.\n\n\n\nFuruichi, S. (2006). Information theoretical properties of Tsallis entropies. Journal of Mathematical Physics 47.\n\n\n\nGao, S.; Ver Steeg, G. and Galstyan, A. (09–12 May 2015). Efficient Estimation of Mutual Information for Strongly Dependent Variables. In: Proceedings of the Eighteenth International Conference on Artificial Intelligence and Statistics, Vol. 38 of Proceedings of Machine Learning Research, edited by Lebanon, G. and Vishwanathan, S. V. (PMLR, San Diego, California, USA); pp. 277–286.\n\n\n\nGao, W.; Kannan, S.; Oh, S. and Viswanath, P. (2017). Estimating Mutual Information for Discrete-Continuous Mixtures. In: Advances in Neural Information Processing Systems, Vol. 30, edited by Guyon, I.; Luxburg, U. V.; Bengio, S.; Wallach, H.; Fergus, R.; Vishwanathan, S. and Garnett, R. (Curran Associates, Inc.).\n\n\n\nGao, W.; Oh, S. and Viswanath, P. (2018). Demystifying Fixed k -Nearest Neighbor Information Estimators. IEEE Transactions on Information Theory 64, 5629–5661.\n\n\n\nGolshani, L.; Pasha, E. and Yari, G. (2009). Some properties of Rényi entropy and Rényi entropy rate. Information Sciences 179, 2426–2433.\n\n\n\nGoria, M. N.; Leonenko, N. N.; Mergel, V. V. and Inverardi, P. L. (2005). A new class of random vector entropy estimators and its applications in testing statistical hypotheses. Journal of Nonparametric Statistics 17, 277–297, arXiv:https://doi.org/10.1080/104852504200026815.\n\n\n\nGrassberger, P. (2022). On Generalized Schuermann Entropy Estimators. Entropy 24.\n\n\n\nHe, S.; Sun, K. and Wang, H. (2016). Multivariate permutation entropy and its application for complexity analysis of chaotic systems. Physica A: Statistical Mechanics and its Applications 461, 812–823.\n\n\n\nHorvitz, D. G. and Thompson, D. J. (1952). A Generalization of Sampling Without Replacement from a Finite Universe. Journal of the American Statistical Association 47, 663–685, arXiv:https://www.tandfonline.com/doi/pdf/10.1080/01621459.1952.10483446.\n\n\n\nJizba, P.; Kleinert, H. and Shefaat, M. (2012). Rényi's information transfer between financial time series. Physica A: Statistical Mechanics and its Applications 391, 2971–2989.\n\n\n\nKalisch, M. and Bühlmann, P. (2008). Robustification of the PC-Algorithm for Directed Acyclic Graphs. Journal of Computational and Graphical Statistics 17, 773–789, arXiv:https://doi.org/10.1198/106186008X381927.\n\n\n\nKozachenko, L. F. and Leonenko, N. N. (1987). Sample estimate of the entropy of a random vector. Problemy Peredachi Informatsii 23, 9–16.\n\n\n\nKraskov, A.; Stögbauer, H. and Grassberger, P. (2004). Estimating mutual information. Phys. Rev. E 69, 066138.\n\n\n\nKubkowski, M.; Mielniczuk, J. and Teisseyre, P. (2021). How to gain on power: novel conditional independence tests based on short expansion of conditional mutual information. Journal of Machine Learning Research 22, 1–57.\n\n\n\nLeonenko, N.; Pronzato, L. and Savani, V. (2008). A class of Rényi information estimators for multidimensional densities. The Annals of Statistics 36, 2153–2182.\n\n\n\nLevy, K. J. and Narula, S. C. (1978). Testing hypotheses concerning partial correlations: Some methods and discussion. International Statistical Review/Revue Internationale de Statistique, 215–218.\n\n\n\nLi, G.; Guan, Q. and Yang, H. (2019). Noise Reduction Method of Underwater Acoustic Signals Based on CEEMDAN, Effort-To-Compress Complexity, Refined Composite Multiscale Dispersion Entropy and Wavelet Threshold Denoising. Entropy 21.\n\n\n\nLindner, M.; Vicente, R.; Priesemann, V. and Wibral, M. (2011). TRENTOOL: A Matlab open source toolbox to analyse information flow in time series data with transfer entropy. BMC Neuroscience 12, 119–119.\n\n\n\nLord, W. M.; Sun, J. and Bollt, E. M. (2018). Geometric k-nearest neighbor estimation of entropy and mutual information. Chaos: An Interdisciplinary Journal of Nonlinear Science 28.\n\n\n\nLuo, M.; Kantz, H.; Lau, N.-C.; Huang, W. and Zhou, Y. (2015). Questionable dynamical evidence for causality between galactic cosmic rays and interannual variation in global temperature. Proceedings of the National Academy of Sciences 112, E4638 - E4639.\n\n\n\nManis, G.; Aktaruzzaman, M. and Sassi, R. (2017). Bubble entropy: An entropy almost free of parameters. IEEE Transactions on Biomedical Engineering 64, 2711–2718.\n\n\n\nMartin, S.; Morison, G.; Nailon, W. H. and Durrani, T. S. (2004). Fast and accurate image registration using Tsallis entropy and simultaneous perturbation stochastic approximation. Electronics Letters 40, 595–597.\n\n\n\nMcCracken, J. M. and Weigel, R. S. (2014). Convergent cross-mapping and pairwise asymmetric inference. Physical Review E 90, 062903.\n\n\n\nMesner, O. C. and Shalizi, C. R. (2020). Conditional mutual information estimation for mixed, discrete and continuous data. IEEE Transactions on Information Theory 67, 464–484.\n\n\n\nMiller, G. (1955). Note on the bias of information estimates. Information theory in psychology: Problems and methods.\n\n\n\nPaluš, M. (2014). Cross-Scale Interactions and Information Transfer. Entropy 16, 5263–5289.\n\n\n\nPaninski, L. (2003). Estimation of entropy and mutual information. Neural computation 15, 1191–1253.\n\n\n\nPapapetrou, M. and Kugiumtzis, D. (2020). Tsallis conditional mutual information in investigating long range correlation in symbol sequences. Physica A: Statistical Mechanics and its Applications 540, 123016.\n\n\n\nPóczos, B. and Schneider, J. (2012). Nonparametric estimation of conditional information and divergences. In: Artificial Intelligence and Statistics (PMLR); pp. 914–923.\n\n\n\nQuiroga, R. Q.; Arnhold, J. and Grassberger, P. (2000). Learning driver-response relationships from synchronization patterns. Physical Review E 61, 5142.\n\n\n\nRahimzamani, A.; Asnani, H.; Viswanath, P. and Kannan, S. (2018). Estimators for multivariate information measures in general probability spaces. Advances in Neural Information Processing Systems 31.\n\n\n\nRamos, A. M.; Builes-Jaramillo, A.; Poveda, G.; Goswami, B.; Macau, E. E.; Kurths, J. and Marwan, N. (2017). Recurrence measure of conditional dependence and applications. Phys. Rev. E 95, 052206.\n\n\n\nRomano, M. C.; Thiel, M.; Kurths, J. and Grebogi, C. (2007). Estimation of the direction of the coupling by conditional probabilities of recurrence. Phys. Rev. E 76, 036211.\n\n\n\nRostaghi, M. and Azami, H. (2016). Dispersion entropy: A measure for time-series analysis. IEEE Signal Processing Letters 23, 610–614.\n\n\n\nRunge, J. (09–11 Apr 2018). Conditional independence testing based on a nearest-neighbor estimator of conditional mutual information. In: Proceedings of the Twenty-First International Conference on Artificial Intelligence and Statistics, Vol. 84 of Proceedings of Machine Learning Research, edited by Storkey, A. and Perez-Cruz, F. (PMLR); pp. 938–947.\n\n\n\nRényi, A. (1961). On measures of entropy and information. In: Proceedings of the Fourth Berkeley Symposium on Mathematical Statistics and Probability, Volume 1: Contributions to the Theory of Statistics, Vol. 4 (University of California Press); pp. 547–562.\n\n\n\nSarbu, S. (2014). Rényi information transfer: Partial Rényi transfer entropy and partial Rényi mutual information. In: 2014 IEEE International Conference on Acoustics, Speech and Signal Processing (ICASSP) (IEEE); pp. 5666–5670.\n\n\n\nSchmidt, C.; Huegle, J. and Uflacker, M. (2018). Order-independent constraint-based causal structure learning for gaussian distribution models using GPUs. In: Proceedings of the 30th International Conference on Scientific and Statistical Database Management; pp. 1–10.\n\n\n\nSchreiber, T. (2000). Measuring information transfer. Physical review letters 85, 461.\n\n\n\nSchuermann, T. (2004). Bias analysis in entropy estimation. Journal of Physics A: Mathematical and General 37, L295.\n\n\n\nShannon, C. E. (1948). A mathematical theory of communication. The Bell system technical journal 27, 379–423.\n\n\n\nShi, H.; Drton, M. and Han, F. (2022). On the power of Chatterjee’s rank correlation. Biometrika 109, 317–333.\n\n\n\nSingh, H.; Misra, N.; Hnizdo, V.; Fedorowicz, A. and Demchuk, E. (2003). Nearest Neighbor Estimates of Entropy. American Journal of Mathematical and Management Sciences 23, 301–321.\n\n\n\nSpirtes, P.; Glymour, C. N. and Scheines, R. (2000). Causation, prediction, and search (MIT press).\n\n\n\nStaniek, M. and Lehnertz, K. (2008). Symbolic Transfer Entropy. Phys. Rev. Lett. 100, 158101.\n\n\n\nSugihara, G.; May, R. M.; Ye, H.; Hsieh, C.-h.; Deyle, E. R.; Fogarty, M. and Munch, S. B. (2012). Detecting Causality in Complex Ecosystems. Science 338, 496–500.\n\n\n\nSun, J.; Taylor, D. and Bollt, E. M. (2015). Causal Network Inference by Optimal Causation Entropy. SIAM Journal on Applied Dynamical Systems 14, 73–106, arXiv:https://doi.org/10.1137/140956166.\n\n\n\nSzékely, G. J. and Rizzo, M. L. (2014). Partial distance correlation with methods for dissimilarities. The Annals of Statistics 42, 2382–2412.\n\n\n\nSzékely, G. J.; Rizzo, M. L. and Bakirov, N. K. (2007). Measuring and testing dependence by correlation of distances. The Annals of Statistics 35, 2769–2794.\n\n\n\nTsallis, C. (1988). Possible generalization of Boltzmann-Gibbs statistics. Journal of statistical physics 52, 479–487.\n\n\n\nTsallis, C. (2009). Introduction to nonextensive statistical mechanics: approaching a complex world. Vol. 1 no. 1 (Springer).\n\n\n\nVasicek, O. (1976). A test for normality based on sample entropy. Journal of the Royal Statistical Society Series B: Statistical Methodology 38, 54–59.\n\n\n\nVejmelka, M. and Paluš, M. (2008). Inferring the directionality of coupling with conditional mutual information. Physical Review E 77, 026214.\n\n\n\nWang, X.; Si, S. and Li, Y. (2020). Multiscale diversity entropy: A novel dynamical measure for fault diagnosis of rotating machinery. IEEE Transactions on Industrial Informatics 17, 5419–5429.\n\n\n\nZahl, S. (1977). Jackknifing an index of diversity. Ecology 58, 907–913.\n\n\n\nZhao, J.; Zhou, Y.; Zhang, X. and Chen, L. (2016). Part mutual information for quantifying direct associations in networks. Proceedings of the National Academy of Sciences 113, 5130–5135.\n\n\n\nZhu, J.; Bellanger, J.-J.; Shu, H. and Le Bouquin Jeannès, R. (2015). Contribution to Transfer Entropy Estimation via the k-Nearest-Neighbors Approach. Entropy 17, 4173–4201.\n\n\n\nZunino, L.; Olivares, F.; Scholkmann, F. and Rosso, O. A. (2017). Permutation entropy based time series analysis: Equalities in the input signal can lead to false conclusions. Physics Letters A 381, 1883–1892.\n\n\n\n","category":"page"},{"location":"api/discretization_counts_probs_api/","page":"Discretization API","title":"Discretization API","text":"CollapsedDocStrings = true","category":"page"},{"location":"api/discretization_counts_probs_api/#Discretization-API","page":"Discretization API","title":"Discretization API","text":"","category":"section"},{"location":"api/discretization_counts_probs_api/#Encoding-multiple-input-datasets","page":"Discretization API","title":"Encoding multiple input datasets","text":"","category":"section"},{"location":"api/discretization_counts_probs_api/","page":"Discretization API","title":"Discretization API","text":"A fundamental operation when computing multivariate information measures from data is discretization. When discretizing, what happens is that we \"encode\" input data into an intermediate representation indexed by the positive integers. This intermediate representation is called an \"encoding\". This is useful in several ways:","category":"page"},{"location":"api/discretization_counts_probs_api/","page":"Discretization API","title":"Discretization API","text":"Once a dataset has been encoded into integers, we can estimate Counts or Probabilities (tutorial).\nOnce probabilities have been estimated, one can use these to estimate MultivariateInformationMeasure (tutorial).","category":"page"},{"location":"api/discretization_counts_probs_api/","page":"Discretization API","title":"Discretization API","text":"The following functions and types are used by Associations.jl to perform discretization of input data.","category":"page"},{"location":"api/discretization_counts_probs_api/","page":"Discretization API","title":"Discretization API","text":"Discretization\nCodifyVariables\nCodifyPoints\ncodify","category":"page"},{"location":"api/discretization_counts_probs_api/#Associations.Discretization","page":"Discretization API","title":"Associations.Discretization","text":"Discretization\n\nThe supertype of all discretization schemes.\n\nConcrete implementations\n\nCodifyVariables\nCodifyPoints\n\n\n\n\n\n","category":"type"},{"location":"api/discretization_counts_probs_api/#Associations.CodifyVariables","page":"Discretization API","title":"Associations.CodifyVariables","text":"CodifyVariables <: Discretization\nCodifyVariables(outcome_space::OutcomeSpace)\n\nThe CodifyVariables discretization scheme quantises input data in a column-wise manner using the given outcome_space.\n\nCompatible outcome spaces\n\nUniqueElements (for when data are pre-discretized)\nBubbleSortSwaps\nCosineSimilarityBinning\nOrdinalPatterns\nDispersion\n\nDescription\n\nThe main difference between CodifyVariables and [CodifyPoints] is that the former uses OutcomeSpaces for discretization. This usually means that some transformation is applied to the data before discretizing. For example, some outcome constructs a delay embedding from the input (and thus encodes sequential information) before encoding the data.\n\nSpecifically, given x::AbstractStateSpaceSet..., where the i-th dataset x[i] is assumed to represent a single series of measurements, CodifyVariables encodes x[i] by codify-ing into a series of integers using an appropriate OutcomeSpace. This is typically done by first sequentially transforming the data and then running sliding window (the width of the window is controlled by outcome_space) across the data, and then encoding the values within each window to an integer.\n\nExamples\n\nusing Associations\nx, y = rand(100), rand(100)\nd = CodifyVariables(OrdinalPatterns(m=2))\ncx, cy = codify(d, x, y)\n\n\n\n\n\n","category":"type"},{"location":"api/discretization_counts_probs_api/#Associations.CodifyPoints","page":"Discretization API","title":"Associations.CodifyPoints","text":"CodifyPoints{N}\nCodifyPoints(encodings::NTuple{N, Encoding})\n\nCodifyPoints points is a Discretization scheme that encodes input data points without applying any sequential transformation to the input (as opposed to CodifyVariables, which may apply some transformation before encoding).\n\nUsage\n\nUse with codify to encode/discretize input variable on a point-by-point basis.\n\nCompatible encodings\n\nGaussianCDFEncoding\nOrdinalPatternEncoding\nRelativeMeanEncoding\nRelativeFirstDifferenceEncoding\nUniqueElementsEncoding\nRectangularBinEncoding\nCombinationEncoding\n\nDescription\n\nGiven x::AbstractStateSpaceSet..., where the i-th dataset is assumed to represent a single series of measurements, CodifyPoints encodes each point pₖ ∈ x[i] using some Encoding(s), without applying any (sequential) transformation to the x[i] first. This behaviour is different to CodifyVariables, which does apply a transformation to x[i] before encoding.\n\nIf length(x) == N (i.e. there are N input dataset), then encodings must be a tuple of N Encoding. Alternatively, if encodings is a single Encoding, then that same encoding is applied to every x[i].\n\nExamples\n\nusing Associations\n\n# The same encoding on two input datasets\nx = StateSpaceSet(rand(100, 3))\ny = StateSpaceSet(rand(100, 3))\nencoding_ord = OrdinalPatternEncoding(3)\ncx, cy = codify(CodifyPoints(encoding_ord), x, y)\n\n# Different encodings on multiple datasets\nz = StateSpaceSet(rand(100, 2))\nencoding_bin = RectangularBinEncoding(RectangularBinning(3), z)\nd = CodifyPoints(encoding_ord, encoding_ord, encoding_bin)\ncx, cy, cz = codify(d, x, y, z)\n\n\n\n\n\n","category":"type"},{"location":"api/discretization_counts_probs_api/#ComplexityMeasures.codify","page":"Discretization API","title":"ComplexityMeasures.codify","text":"codify(o::OutcomeSpace, x::Vector) → s::Vector{Int}\n\nCodify x according to the outcome space o.\n\nDescription\n\nThe reason this function exists is that we don't always want to encode the entire input x at once. Sometimes, it is desirable to first apply some transformation to x first, then apply Encodings in a point-wise manner in the transformed space. (the OutcomeSpace dictates this transformation). This is useful for encoding timeseries data.\n\nThe length of the returned s depends on the OutcomeSpace. Some outcome spaces preserve the input data length (e.g. UniqueElements), while some outcome spaces (e.g. OrdinalPatterns) do e.g. delay embeddings before encoding, so that length(s) < length(x).\n\n\n\n\n\ncodify(encoding::CodifyPoints{N}, x::Vararg{<:AbstractStateSpaceSet, N})\n\nCodify each timeseries xᵢ ∈ x according to the given encoding.\n\nExamples\n\nx = StateSpaceSet(rand(10000, 2))\ny = StateSpaceSet(rand(10000, 3))\nz = StateSpaceSet(rand(10000, 2))\n\n# For `x`, we use a relative mean encoding.\nex = RelativeMeanEncoding(0.0, 1.0, n = 3)\n# For `y`, we use a combination encoding.\ney = CombinationEncoding(\n RelativeMeanEncoding(0.0, 1.0, n = 2), \n OrdinalPatternEncoding(3)\n)\n# For `z`, we use ordinal patterns to encode.\nez = OrdinalPatternEncoding(2)\n\n# Codify two input datasets gives a 2-tuple of Vector{Int}\ncodify(CodifyPoints(ex, ey), x, y)\n\n# Codify three input datasets gives a 3-tuple of Vector{Int}\ncodify(CodifyPoints(ex, ey, ez), x, y, z)\n\n\n\n\n\ncodify(d::CodifyVariables, x::Vararg{<:AbstractStateSpaceSet, N})\ncodify(d::CodifyPoints, x::Vararg{<:AbstractStateSpaceSet, N})\n\nCodify each timeseries xᵢ ∈ x according to the given encoding/discretization d.\n\nCompatible discretizations\n\nCodifyVariables\nCodifyPoints\n\nExamples\n\nusing Associations\n\n# Sliding window encoding\nx = [0.1, 0.2, 0.3, 0.2, 0.1, 0.0, 0.5, 0.3, 0.5]\nxc1 = codify(CodifyVariables(OrdinalPatterns(m=2)), x) # should give [1, 1, 2, 2, 2, 1, 2, 1]\nxc2 = codify(OrdinalPatterns(m=2), x) # equivalent\nlength(xc1) < length(x) # should be true, because `OrdinalPatterns` delay embeds. \n\n# Point-by-point encoding\nx, y = StateSpaceSet(rand(100, 3)), StateSpaceSet(rand(100, 3))\ncx, cy = codify(CodifyPoints(OrdinalPatternEncoding(3)), x, y)\n\n\n\n\n\n","category":"function"},{"location":"api/discretization_counts_probs_api/","page":"Discretization API","title":"Discretization API","text":"In summary, the two main ways of discretizing data in Associations are as follows.","category":"page"},{"location":"api/discretization_counts_probs_api/","page":"Discretization API","title":"Discretization API","text":"The CodifyPoints discretization scheme encodes input data on a point-by-point basis by applying some Encoding to each point.\nThe CodifyVariables discretization scheme encodes input data on a column-by-column basis by applying a sliding window to each column, and encoding the data within the sliding window according to some OutcomeSpace (Internally, this uses codify).","category":"page"},{"location":"api/discretization_counts_probs_api/","page":"Discretization API","title":"Discretization API","text":"note: Note\nEncoding, OutcomeSpace and codify are all from ComplexityMeasures.jl. In this package, they are used to discretize multiple input variables instead of just one input variable.","category":"page"},{"location":"api/discretization_counts_probs_api/#Encoding-per-point/row","page":"Discretization API","title":"Encoding per point/row","text":"","category":"section"},{"location":"api/discretization_counts_probs_api/","page":"Discretization API","title":"Discretization API","text":"In some cases, it may be desireable to encode data on a row-wise basis. This typically happens when working with pre-embedded time series or StateSpaceSets (respecting the fact that time ordering is already taken care of by the embedding procedure). If we want to apply something like OrdinalPatternEncoding to such data, then we must encode each point individually, such that vectors like [1.2, 2.4, 4.5] or [\"howdy\", \"partner\"] gets mapped to an integer. The CodifyPoints discretization intstruction ensures input data are encoded on a point-by-point basis.","category":"page"},{"location":"api/discretization_counts_probs_api/","page":"Discretization API","title":"Discretization API","text":"A point-by-point discretization using CodifyPoints is formally done by applying some Encoding to each input data point. You can pick between the following encodings, or combine them in arbitrary ways using CombinationEncoding.","category":"page"},{"location":"api/discretization_counts_probs_api/","page":"Discretization API","title":"Discretization API","text":"Encoding\nGaussianCDFEncoding\nOrdinalPatternEncoding\nRelativeMeanEncoding\nRelativeFirstDifferenceEncoding\nUniqueElementsEncoding\nRectangularBinEncoding\nCombinationEncoding","category":"page"},{"location":"api/discretization_counts_probs_api/#ComplexityMeasures.Encoding","page":"Discretization API","title":"ComplexityMeasures.Encoding","text":"Encoding\n\nThe supertype for all encoding schemes. Encodings always encode elements of input data into the positive integers. The encoding API is defined by the functions encode and decode. Some probability estimators utilize encodings internally.\n\nCurrent available encodings are:\n\nOrdinalPatternEncoding.\nGaussianCDFEncoding.\nRectangularBinEncoding.\nRelativeMeanEncoding.\nRelativeFirstDifferenceEncoding.\nUniqueElementsEncoding.\nBubbleSortSwapsEncoding.\nPairDistanceEncoding.\nCombinationEncoding, which can combine any of the above encodings.\n\n\n\n\n\n","category":"type"},{"location":"api/discretization_counts_probs_api/#ComplexityMeasures.GaussianCDFEncoding","page":"Discretization API","title":"ComplexityMeasures.GaussianCDFEncoding","text":"GaussianCDFEncoding <: Encoding\nGaussianCDFEncoding{m}(; μ, σ, c::Int = 3)\n\nAn encoding scheme that encodes a scalar or vector χ into one of the integers sᵢ ∈ [1, 2, …, c] based on the normal cumulative distribution function (NCDF), and decodes the sᵢ into subintervals of [0, 1] (with some loss of information).\n\nInitializing a GaussianCDFEncoding\n\nThe size of the input to be encoded must be known beforehand. One must therefore set m = length(χ), where χ is the input (m = 1 for scalars, m ≥ 2 for vectors). To do so, one must explicitly give m as a type parameter: e.g. encoding = GaussianCDFEncoding{3}(; μ = 0.0, σ = 0.1) to encode 3-element vectors, or encoding = GaussianCDFEncoding{1}(; μ = 0.0, σ = 0.1) to encode scalars.\n\nDescription\n\nEncoding/decoding scalars\n\nGaussianCDFEncoding first maps an input scalar χ to a new real number y_ in 0 1 by using the normal cumulative distribution function (CDF) with the given mean μ and standard deviation σ, according to the map\n\nx to y y = dfrac1 sigma\n sqrt2 pi int_-infty^x e^(-(x - mu)^2)(2 sigma^2) dx\n\nNext, the interval [0, 1] is equidistantly binned and enumerated 1 2 ldots c, and y is linearly mapped to one of these integers using the linear map y to z z = textfloor(y(c-1)) + 1.\n\nBecause of the floor operation, some information is lost, so when used with decode, each decoded sᵢ is mapped to a subinterval of [0, 1]. This subinterval is returned as a length-1 Vector{SVector}.\n\nNotice that the decoding step does not yield an element of any outcome space of the estimators that use GaussianCDFEncoding internally, such as Dispersion. That is because these estimators additionally delay embed the encoded data.\n\nEncoding/decoding vectors\n\nIf GaussianCDFEncoding is used with a vector χ, then each element of χ is encoded separately, resulting in a length(χ) sequence of integers which may be treated as a CartesianIndex. The encoded symbol s ∈ [1, 2, …, c] is then just the linear index corresponding to this cartesian index (similar to how CombinationEncoding works).\n\nWhen decoded, the integer symbol s is converted back into its CartesianIndex representation, which is just a sequence of integers that refer to subdivisions of the [0, 1] interval. The relevant subintervals are then returned as a length-χ Vector{SVector}.\n\nExamples\n\njulia> using ComplexityMeasures, Statistics\n\njulia> x = [0.1, 0.4, 0.7, -2.1, 8.0];\n\njulia> μ, σ = mean(x), std(x); encoding = GaussianCDFEncoding(; μ, σ, c = 5)\n\njulia> es = encode.(Ref(encoding), x)\n5-element Vector{Int64}:\n 2\n 2\n 3\n 1\n 5\n\njulia> decode(encoding, 3)\n2-element SVector{2, Float64} with indices SOneTo(2):\n 0.4\n 0.6\n\n\n\n\n\n","category":"type"},{"location":"api/discretization_counts_probs_api/#ComplexityMeasures.OrdinalPatternEncoding","page":"Discretization API","title":"ComplexityMeasures.OrdinalPatternEncoding","text":"OrdinalPatternEncoding <: Encoding\nOrdinalPatternEncoding{m}(lt = ComplexityMeasures.isless_rand)\n\nAn encoding scheme that encodes length-m vectors into their permutation/ordinal patterns and then into the integers based on the Lehmer code. It is used by OrdinalPatterns and similar estimators, see that for a description of the outcome space.\n\nThe ordinal/permutation pattern of a vector χ is simply sortperm(χ), which gives the indices that would sort χ in ascending order.\n\nDescription\n\nThe Lehmer code, as implemented here, is a bijection between the set of factorial(m) possible permutations for a length-m sequence, and the integers 1, 2, …, factorial(m). The encoding step uses algorithm 1 in Berger et al. (2019), which is highly optimized. The decoding step is much slower due to missing optimizations (pull requests welcomed!).\n\nExample\n\njulia> using ComplexityMeasures\n\njulia> χ = [4.0, 1.0, 9.0];\n\njulia> c = OrdinalPatternEncoding(3);\n\njulia> i = encode(c, χ)\n3\n\njulia> decode(c, i)\n3-element SVector{3, Int64} with indices SOneTo(3):\n 2\n 1\n 3\n\nIf you want to encode something that is already a permutation pattern, then you can use the non-exported permutation_to_integer function.\n\n\n\n\n\n","category":"type"},{"location":"api/discretization_counts_probs_api/#ComplexityMeasures.RelativeMeanEncoding","page":"Discretization API","title":"ComplexityMeasures.RelativeMeanEncoding","text":"RelativeMeanEncoding <: Encoding\nRelativeMeanEncoding(minval::Real, maxval::Real; n = 2)\n\nRelativeMeanEncoding encodes a vector based on the relative position the mean of the vector has with respect to a predefined minimum and maximum value (minval and maxval, respectively).\n\nDescription\n\nThis encoding is inspired by Azami and Escudero (2016)'s algorithm for amplitude-aware permutation entropy. They use a linear combination of amplitude information and first differences information of state vectors to correct probabilities. Here, however, we explicitly encode the amplitude-part of the correction as an a integer symbol Λ ∈ [1, 2, …, n]. The first-difference part of the encoding is available as the RelativeFirstDifferenceEncoding encoding.\n\nEncoding/decoding\n\nWhen used with encode, an m-element state vector bfx = (x_1 x_2 ldots x_m) is encoded as Λ = dfrac1Nsum_i=1^m abs(x_i). The value of Λ is then normalized to lie on the interval [0, 1], assuming that the minimum/maximum value any single element x_i can take is minval/maxval, respectively. Finally, the interval [0, 1] is discretized into n discrete bins, enumerated by positive integers 1, 2, …, n, and the number of the bin that the normalized Λ falls into is returned.\n\nWhen used with decode, the left-edge of the bin that the normalized Λ fell into is returned.\n\n\n\n\n\n","category":"type"},{"location":"api/discretization_counts_probs_api/#ComplexityMeasures.RelativeFirstDifferenceEncoding","page":"Discretization API","title":"ComplexityMeasures.RelativeFirstDifferenceEncoding","text":"RelativeFirstDifferenceEncoding <: Encoding\nRelativeFirstDifferenceEncoding(minval::Real, maxval::Real; n = 2)\n\nRelativeFirstDifferenceEncoding encodes a vector based on the relative position the average of the first differences of the vectors has with respect to a predefined minimum and maximum value (minval and maxval, respectively).\n\nDescription\n\nThis encoding is inspired by Azami and Escudero (2016)'s algorithm for amplitude-aware permutation entropy. They use a linear combination of amplitude information and first differences information of state vectors to correct probabilities. Here, however, we explicitly encode the first differences part of the correction as an a integer symbol Λ ∈ [1, 2, …, n]. The amplitude part of the encoding is available as the RelativeMeanEncoding encoding.\n\nEncoding/decoding\n\nWhen used with encode, an m-element state vector bfx = (x_1 x_2 ldots x_m) is encoded as Λ = dfrac1m - 1sum_k=2^m x_k - x_k-1. The value of Λ is then normalized to lie on the interval [0, 1], assuming that the minimum/maximum value any single abs(x_k - x_k-1) can take is minval/maxval, respectively. Finally, the interval [0, 1] is discretized into n discrete bins, enumerated by positive integers 1, 2, …, n, and the number of the bin that the normalized Λ falls into is returned. The smaller the mean first difference of the state vector is, the smaller the bin number is. The higher the mean first difference of the state vectors is, the higher the bin number is.\n\nWhen used with decode, the left-edge of the bin that the normalized Λ fell into is returned.\n\nPerformance tips\n\nIf you are encoding multiple input vectors, it is more efficient to construct a RelativeFirstDifferenceEncoding instance and re-use it:\n\nminval, maxval = 0, 1\nencoding = RelativeFirstDifferenceEncoding(minval, maxval; n = 4)\npts = [rand(3) for i = 1:1000]\n[encode(encoding, x) for x in pts]\n\n\n\n\n\n","category":"type"},{"location":"api/discretization_counts_probs_api/#ComplexityMeasures.UniqueElementsEncoding","page":"Discretization API","title":"ComplexityMeasures.UniqueElementsEncoding","text":"UniqueElementsEncoding <: Encoding\nUniqueElementsEncoding(x)\n\nUniqueElementsEncoding is a generic encoding that encodes each xᵢ ∈ unique(x) to one of the positive integers. The xᵢ are encoded according to the order of their first appearance in the input data.\n\nThe constructor requires the input data x, since the number of possible symbols is length(unique(x)).\n\nExample\n\nusing ComplexityMeasures\nx = ['a', 2, 5, 2, 5, 'a']\ne = UniqueElementsEncoding(x)\nencode.(Ref(e), x) == [1, 2, 3, 2, 3, 1] # true\n\n\n\n\n\n","category":"type"},{"location":"api/discretization_counts_probs_api/#ComplexityMeasures.RectangularBinEncoding","page":"Discretization API","title":"ComplexityMeasures.RectangularBinEncoding","text":"RectangularBinEncoding <: Encoding\nRectangularBinEncoding(binning::RectangularBinning, x)\nRectangularBinEncoding(binning::FixedRectangularBinning)\n\nAn encoding scheme that encodes points χ ∈ x into their histogram bins.\n\nThe first call signature simply initializes a FixedRectangularBinning and then calls the second call signature.\n\nSee FixedRectangularBinning for info on mapping points to bins.\n\n\n\n\n\n","category":"type"},{"location":"api/discretization_counts_probs_api/#ComplexityMeasures.CombinationEncoding","page":"Discretization API","title":"ComplexityMeasures.CombinationEncoding","text":"CombinationEncoding <: Encoding\nCombinationEncoding(encodings)\n\nA CombinationEncoding takes multiple Encodings and creates a combined encoding that can be used to encode inputs that are compatible with the given encodings.\n\nEncoding/decoding\n\nWhen used with encode, each Encoding in encodings returns integers in the set 1, 2, …, n_e, where n_e is the total number of outcomes for a particular encoding. For k different encodings, we can thus construct the cartesian coordinate (c₁, c₂, …, cₖ) (cᵢ ∈ 1, 2, …, n_i), which can uniquely be identified by an integer. We can thus identify each unique combined encoding with a single integer.\n\nWhen used with decode, the integer symbol is converted to its corresponding cartesian coordinate, which is used to retrieve the decoded symbols for each of the encodings, and a tuple of the decoded symbols are returned.\n\nThe total number of outcomes is prod(total_outcomes(e) for e in encodings).\n\nExamples\n\nusing ComplexityMeasures\n\n# We want to encode the vector `x`.\nx = [0.9, 0.2, 0.3]\n\n# To do so, we will use a combination of first-difference encoding, amplitude encoding,\n# and ordinal pattern encoding.\n\nencodings = (\n RelativeFirstDifferenceEncoding(0, 1; n = 2),\n RelativeMeanEncoding(0, 1; n = 5),\n OrdinalPatternEncoding(3) # x is a three-element vector\n )\nc = CombinationEncoding(encodings)\n\n# Encode `x` as integer\nω = encode(c, x)\n\n# Decode symbol (into a vector of decodings, one for each encodings `e ∈ encodings`).\n# In this particular case, the first two element will be left-bin edges, and\n# the last element will be the decoded ordinal pattern (indices that would sort `x`).\nd = decode(c, ω)\n\n\n\n\n\n","category":"type"},{"location":"api/discretization_counts_probs_api/#tutorial_codify_points","page":"Discretization API","title":"Examples: encoding rows (one point at a time)","text":"","category":"section"},{"location":"api/discretization_counts_probs_api/","page":"Discretization API","title":"Discretization API","text":"We'll here use the OrdinalPatternEncoding with differing parameter m to encode multiple StateSpaceSet of differing dimensions.","category":"page"},{"location":"api/discretization_counts_probs_api/","page":"Discretization API","title":"Discretization API","text":"using Associations\nusing StateSpaceSets\nusing Random; rng = Xoshiro(1234)\n\n# The first variable is 2-dimensional and has 50 points\nx = StateSpaceSet(rand(rng, 50, 2))\n# The second variable is 3-dimensional and has 50 points\ny = StateSpaceSet(rand(rng, 50, 3))\n# The third variable is 4-dimensional and has 50 points\nz = StateSpaceSet(rand(rng, 50, 4))\n\n# One encoding scheme per input variable\n# encode `x` using `ox` on a point-by-point basis (Vector{SVector{4}} → Vector{Int})\n# encode `y` using `oy` on a point-by-point basis (Vector{SVector{3}} → Vector{Int})\n# encode `z` using `oz` on a point-by-point basis (Vector{SVector{2}} → Vector{Int})\nox = OrdinalPatternEncoding(2)\noy = OrdinalPatternEncoding(3)\noz = OrdinalPatternEncoding(4)\n\n# This given three column vectors of integers.\ncx, cy, cz = codify(CodifyPoints(ox, oy, oz), x, y, z)\n\n[cx cy cz]","category":"page"},{"location":"api/discretization_counts_probs_api/","page":"Discretization API","title":"Discretization API","text":"Notice that the 2-dimensional x has been encoded into integer values 1 or 2, because there are 2! possible ordinal patterns for dimension m = 2. The 3-dimensional y has been encoded into integers in the range 1 to 3! = 6, while the 4-dimensional z is encoded into an even larger range of integers, because the number of possible ordinal patterns is 4! = 24 for 4-dimensional embedding vectors.","category":"page"},{"location":"api/discretization_counts_probs_api/#Encoding-per-variable/column","page":"Discretization API","title":"Encoding per variable/column","text":"","category":"section"},{"location":"api/discretization_counts_probs_api/","page":"Discretization API","title":"Discretization API","text":"Sometimes, it may be desireable to encode input data one variable/column at a time. This typically happens when the input are either a single or multiple timeseries.","category":"page"},{"location":"api/discretization_counts_probs_api/","page":"Discretization API","title":"Discretization API","text":"To encode columns, we move a sliding window across each input variable/column and encode points within that window. Formally, such a sliding-window discretization is done by using the CodifyVariables discretization scheme, which takes as input some OutcomeSpace that dictates how each window is encoded, and also dictates the width of the encoding windows. ","category":"page"},{"location":"api/discretization_counts_probs_api/","page":"Discretization API","title":"Discretization API","text":"For column/variable-wise encoding, you can pick between the following outcome spaces.","category":"page"},{"location":"api/discretization_counts_probs_api/","page":"Discretization API","title":"Discretization API","text":"OutcomeSpace\nUniqueElements\nCosineSimilarityBinning\nDispersion\nOrdinalPatterns\nBubbleSortSwaps\nValueBinning\nRectangularBinning\nFixedRectangularBinning","category":"page"},{"location":"api/discretization_counts_probs_api/#ComplexityMeasures.OutcomeSpace","page":"Discretization API","title":"ComplexityMeasures.OutcomeSpace","text":"OutcomeSpace\n\nThe supertype for all outcome space implementation.\n\nDescription\n\nIn ComplexityMeasures.jl, an outcome space defines a set of possible outcomes Omega = omega_1 omega_2 ldots omega_L (some form of discretization). In the literature, the outcome space is often also called an \"alphabet\", while each outcome is called a \"symbol\" or an \"event\".\n\nAn outcome space also defines a set of rules for mapping input data to to each outcome omega_i, a processes called encoding or symbolizing or discretizing in the literature (see encodings). Some OutcomeSpaces first apply a transformation, e.g. a delay embedding, to the data before discretizing/encoding, while other OutcomeSpaces discretize/encode the data directly.\n\nImplementations\n\nOutcome space Principle Input data Counting-compatible\nUniqueElements Count of unique elements Any ✔\nValueBinning Binning (histogram) Vector, StateSpaceSet ✔\nOrdinalPatterns Ordinal patterns Vector, StateSpaceSet ✔\nSpatialOrdinalPatterns Ordinal patterns in space Array ✔\nDispersion Dispersion patterns Vector ✔\nSpatialDispersion Dispersion patterns in space Array ✔\nCosineSimilarityBinning Cosine similarity Vector ✔\nBubbleSortSwaps Swap counts when sorting Vector ✔\nSequentialPairDistances Sequential state vector distances Vector, StateSpaceSet ✔\nTransferOperator Binning (transfer operator) Vector, StateSpaceSet ✖\nNaiveKernel Kernel density estimation StateSpaceSet ✖\nWeightedOrdinalPatterns Ordinal patterns Vector, StateSpaceSet ✖\nAmplitudeAwareOrdinalPatterns Ordinal patterns Vector, StateSpaceSet ✖\nWaveletOverlap Wavelet transform Vector ✖\nPowerSpectrum Fourier transform Vector ✖\n\nIn the column \"input data\" it is assumed that the eltype of the input is <: Real.\n\nUsage\n\nOutcome spaces are used as input to\n\nprobabilities/allprobabilities_and_outcomes for computing probability mass functions.\noutcome_space, which returns the elements of the outcome space.\ntotal_outcomes, which returns the cardinality of the outcome space.\ncounts/counts_and_outcomes/allcounts_and_outcomes, for obtaining raw counts instead of probabilities (only for counting-compatible outcome spaces).\n\nCounting-compatible vs. non-counting compatible outcome spaces\n\nThere are two main types of outcome spaces.\n\nCounting-compatible outcome spaces have a well-defined way of counting how often each point in the (encoded) input data is mapped to a particular outcome omega_i. These outcome spaces use encode to discretize the input data. Examples are OrdinalPatterns (which encodes input data into ordinal patterns) or ValueBinning (which discretizes points onto a regular grid). The table below lists which outcome spaces are counting compatible.\nNon-counting compatible outcome spaces have no well-defined way of counting explicitly how often each point in the input data is mapped to a particular outcome omega_i. Instead, these outcome spaces returns a vector of pre-normalized \"relative counts\", one for each outcome omega_i. Examples are WaveletOverlap or PowerSpectrum.\n\nCounting-compatible outcome spaces can be used with any ProbabilitiesEstimator to convert counts into probability mass functions. Non-counting-compatible outcome spaces can only be used with the maximum likelihood (RelativeAmount) probabilities estimator, which estimates probabilities precisely by the relative frequency of each outcome (formally speaking, the RelativeAmount estimator also requires counts, but for the sake of code consistency, we allow it to be used with relative frequencies as well).\n\nThe function is_counting_based can be used to check whether an outcome space is based on counting.\n\nDeducing the outcome space (from data)\n\nSome outcome space models can deduce Omega without knowledge of the input, such as OrdinalPatterns. Other outcome spaces require knowledge of the input data for concretely specifying Omega, such as ValueBinning with RectangularBinning. If o is some outcome space model and x some input data, then outcome_space(o, x) returns the possible outcomes Omega. To get the cardinality of Omega, use total_outcomes.\n\nImplementation details\n\nThe element type of Omega varies between outcome space models, but it is guaranteed to be hashable and sortable. This allows for conveniently tracking the counts of a specific event across experimental realizations, by using the outcome as a dictionary key and the counts as the value for that key (or, alternatively, the key remains the outcome and one has a vector of probabilities, one for each experimental realization).\n\n\n\n\n\n","category":"type"},{"location":"api/discretization_counts_probs_api/#ComplexityMeasures.UniqueElements","page":"Discretization API","title":"ComplexityMeasures.UniqueElements","text":"UniqueElements()\n\nAn OutcomeSpace based on straight-forward counting of distinct elements in a univariate time series or multivariate dataset. This is the same as giving no estimator to probabilities.\n\nOutcome space\n\nThe outcome space is the unique sorted values of the input. Hence, input x is needed for a well-defined outcome_space.\n\nImplements\n\ncodify. Used for encoding inputs where ordering matters (e.g. time series).\n\n\n\n\n\n","category":"type"},{"location":"api/discretization_counts_probs_api/#ComplexityMeasures.CosineSimilarityBinning","page":"Discretization API","title":"ComplexityMeasures.CosineSimilarityBinning","text":"CosineSimilarityBinning(; m::Int, τ::Int, nbins::Int)\n\nA OutcomeSpace based on the cosine similarity (Wang et al., 2020).\n\nIt can be used with information to compute the \"diversity entropy\" of an input timeseries (Wang et al., 2020).\n\nThe implementation here allows for τ != 1, which was not considered in the original paper.\n\nDescription\n\nCosineSimilarityBinning probabilities are computed as follows.\n\nFrom the input time series x, using embedding lag τ and embedding dimension m, construct the embedding Y = bf x_i = (x_i x_i+tau x_i+2tau ldots x_i+mtau - 1_i = 1^N-mτ.\nCompute D = d(bf x_t bf x_t+1) _t=1^N-mτ-1, where d(cdot cdot) is the cosine similarity between two m-dimensional vectors in the embedding.\nDivide the interval [-1, 1] into nbins equally sized subintervals (including the value +1).\nConstruct a histogram of cosine similarities d in D over those subintervals.\nSum-normalize the histogram to obtain probabilities.\n\nOutcome space\n\nThe outcome space for CosineSimilarityBinning is the bins of the [-1, 1] interval, and the return configuration is the same as in ValueBinning (left bin edge).\n\nImplements\n\ncodify. Used for encoding inputs where ordering matters (e.g. time series).\n\n\n\n\n\n","category":"type"},{"location":"api/discretization_counts_probs_api/#ComplexityMeasures.Dispersion","page":"Discretization API","title":"ComplexityMeasures.Dispersion","text":"Dispersion(; c = 5, m = 2, τ = 1, check_unique = true)\n\nAn OutcomeSpace based on dispersion patterns, originally used by Rostaghi and Azami (2016) to compute the \"dispersion entropy\", which characterizes the complexity and irregularity of a time series.\n\nRecommended parameter values (Li et al., 2019) are m ∈ [2, 3], τ = 1 for the embedding, and c ∈ [3, 4, …, 8] categories for the Gaussian symbol mapping.\n\nDescription\n\nAssume we have a univariate time series X = x_i_i=1^N. First, this time series is encoded into a symbol timeseries S using the Gaussian encoding GaussianCDFEncoding with empirical mean μ and empirical standard deviation σ (both determined from X), and c as given to Dispersion.\n\nThen, S is embedded into an m-dimensional time series, using an embedding lag of tau, which yields a total of N - (m - 1)tau delay vectors z_i, or \"dispersion patterns\". Since each element of z_i can take on c different values, and each delay vector has m entries, there are c^m possible dispersion patterns. This number is used for normalization when computing dispersion entropy.\n\nThe returned probabilities are simply the frequencies of the unique dispersion patterns present in S (i.e., the UniqueElements of S).\n\nOutcome space\n\nThe outcome space for Dispersion is the unique delay vectors whose elements are the the symbols (integers) encoded by the Gaussian CDF, i.e., the unique elements of S.\n\nData requirements and parameters\n\nThe input must have more than one unique element for the Gaussian mapping to be well-defined. Li et al. (2019) recommends that x has at least 1000 data points.\n\nIf check_unique == true (default), then it is checked that the input has more than one unique value. If check_unique == false and the input only has one unique element, then a InexactError is thrown when trying to compute probabilities.\n\nnote: Why 'dispersion patterns'?\nEach embedding vector is called a \"dispersion pattern\". Why? Let's consider the case when m = 5 and c = 3, and use some very imprecise terminology for illustration:When c = 3, values clustering far below mean are in one group, values clustered around the mean are in one group, and values clustering far above the mean are in a third group. Then the embedding vector 2 2 2 2 2 consists of values that are close together (close to the mean), so it represents a set of numbers that are not very spread out (less dispersed). The embedding vector 1 1 2 3 3, however, represents numbers that are much more spread out (more dispersed), because the categories representing \"outliers\" both above and below the mean are represented, not only values close to the mean.\n\nFor a version of this estimator that can be used on high-dimensional arrays, see SpatialDispersion.\n\nImplements\n\ncodify. Used for encoding inputs where ordering matters (e.g. time series).\n\n\n\n\n\n","category":"type"},{"location":"api/discretization_counts_probs_api/#ComplexityMeasures.OrdinalPatterns","page":"Discretization API","title":"ComplexityMeasures.OrdinalPatterns","text":"OrdinalPatterns <: OutcomeSpace\nOrdinalPatterns{m}(τ = 1, lt::Function = ComplexityMeasures.isless_rand)\n\nAn OutcomeSpace based on lengh-m ordinal permutation patterns, originally introduced in Bandt and Pompe (2002)'s paper on permutation entropy. Note that m is given as a type parameter, so that when it is a literal integer there are performance accelerations.\n\nWhen passed to probabilities the output depends on the input data type:\n\nUnivariate data. If applied to a univariate timeseries (AbstractVector), then the timeseries is first embedded using embedding delay τ and dimension m, resulting in embedding vectors bfx_i _i=1^N-(m-1)tau. Then, for each bfx_i, we find its permutation pattern pi_i. Probabilities are then estimated as the frequencies of the encoded permutation symbols by using UniqueElements. When giving the resulting probabilities to information, the original permutation entropy is computed (Bandt and Pompe, 2002).\nMultivariate data. If applied to a an D-dimensional StateSpaceSet, then no embedding is constructed, m must be equal to D and τ is ignored. Each vector bfx_i of the dataset is mapped directly to its permutation pattern pi_i by comparing the relative magnitudes of the elements of bfx_i. Like above, probabilities are estimated as the frequencies of the permutation symbols. The resulting probabilities can be used to compute multivariate permutation entropy (He et al., 2016), although here we don't perform any further subdivision of the permutation patterns (as in Figure 3 of He et al. (2016)).\n\nInternally, OrdinalPatterns uses the OrdinalPatternEncoding to represent ordinal patterns as integers for efficient computations.\n\nSee WeightedOrdinalPatterns and AmplitudeAwareOrdinalPatterns for estimators that not only consider ordinal (sorting) patterns, but also incorporate information about within-state-vector amplitudes. For a version of this estimator that can be used on spatial data, see SpatialOrdinalPatterns.\n\nnote: Handling equal values in ordinal patterns\nIn Bandt and Pompe (2002), equal values are ordered after their order of appearance, but this can lead to erroneous temporal correlations, especially for data with low amplitude resolution (Zunino et al., 2017). Here, by default, if two values are equal, then one of the is randomly assigned as \"the largest\", using lt = ComplexityMeasures.isless_rand. To get the behaviour from Bandt and Pompe (2002), use lt = Base.isless.\n\nOutcome space\n\nThe outcome space Ω for OrdinalPatterns is the set of length-m ordinal patterns (i.e. permutations) that can be formed by the integers 1, 2, …, m. There are factorial(m) such patterns.\n\nFor example, the outcome [2, 3, 1] corresponds to the ordinal pattern of having the smallest value in the second position, the next smallest value in the third position, and the next smallest, i.e. the largest value in the first position. See also OrdinalPatternEncoding.\n\nIn-place symbolization\n\nOrdinalPatterns also implements the in-place probabilities! for StateSpaceSet input (or embedded vector input) for reducing allocations in looping scenarios. The length of the pre-allocated symbol vector must be the length of the dataset. For example\n\nusing ComplexityMeasures\nm, N = 2, 100\nest = OrdinalPatterns{m}(τ)\nx = StateSpaceSet(rand(N, m)) # some input dataset\nπs_ts = zeros(Int, N) # length must match length of `x`\np = probabilities!(πs_ts, est, x)\n\n\n\n\n\n","category":"type"},{"location":"api/discretization_counts_probs_api/#ComplexityMeasures.BubbleSortSwaps","page":"Discretization API","title":"ComplexityMeasures.BubbleSortSwaps","text":"BubbleSortSwaps <: CountBasedOutcomeSpace\nBubbleSortSwaps(; m = 3, τ = 1)\n\nThe BubbleSortSwaps outcome space is based on Manis et al. (2017)'s paper on \"bubble entropy\". \n\nDescription\n\nBubbleSortSwaps does the following:\n\nEmbeds the input data using embedding dimension m and embedding lag τ\nFor each state vector in the embedding, counting how many swaps are necessary for the bubble sort algorithm to sort state vectors.\n\nFor counts_and_outcomes, we then define a distribution over the number of necessary swaps. This distribution can then be used to estimate probabilities using probabilities_and_outcomes, which again can be used to estimate any InformationMeasure. An example of how to compute the \"Shannon bubble entropy\" is given below.\n\nOutcome space\n\nThe outcome_space for BubbleSortSwaps are the integers 0:N, where N = (m * (m - 1)) / 2 + 1 (the worst-case number of swaps). Hence, the number of total_outcomes is N + 1.\n\nImplements\n\ncodify. Returns the number of swaps required for each embedded state vector.\n\nExamples\n\nWith the BubbleSortSwaps outcome space, we can easily compute a \"bubble entropy\" inspired by (Manis et al., 2017). Note: this is not actually a new entropy - it is just a new way of discretizing the input data. To reproduce the bubble entropy complexity measure from (Manis et al., 2017), see BubbleEntropy.\n\nExamples\n\nusing ComplexityMeasures\nx = rand(100000)\no = BubbleSortSwaps(; m = 5) # 5-dimensional embedding vectors\ninformation(Shannon(; base = 2), o, x)\n\n# We can also compute any other \"bubble quantity\", for example the \n# \"Tsallis bubble extropy\", with arbitrary probabilities estimators:\ninformation(TsallisExtropy(), BayesianRegularization(), o, x)\n\n\n\n\n\n","category":"type"},{"location":"api/discretization_counts_probs_api/#ComplexityMeasures.ValueBinning","page":"Discretization API","title":"ComplexityMeasures.ValueBinning","text":"ValueBinning(b::AbstractBinning) <: OutcomeSpace\n\nAn OutcomeSpace based on binning the values of the data as dictated by the binning scheme b and formally computing their histogram, i.e., the frequencies of points in the bins. An alias to this is VisitationFrequency. Available binnings are subtypes of AbstractBinning.\n\nThe ValueBinning estimator has a linearithmic time complexity (n log(n) for n = length(x)) and a linear space complexity (l for l = dimension(x)). This allows computation of probabilities (histograms) of high-dimensional datasets and with small box sizes ε without memory overflow and with maximum performance. For performance reasons, the probabilities returned never contain 0s and are arbitrarily ordered.\n\nValueBinning(ϵ::Union{Real,Vector})\n\nA convenience method that accepts same input as RectangularBinning and initializes this binning directly.\n\nOutcomes\n\nThe outcome space for ValueBinning is the unique bins constructed from b. Each bin is identified by its left (lowest-value) corner, because bins are always left-closed-right-open intervals [a, b). The bins are in data units, not integer (cartesian indices units), and are returned as SVectors, i.e., same type as input data.\n\nFor convenience, outcome_space returns the outcomes in the same array format as the underlying binning (e.g., Matrix for 2D input).\n\nFor FixedRectangularBinning the outcome_space is well-defined from the binning, but for RectangularBinning input x is needed as well.\n\nImplements\n\ncodify. Used for encoding inputs where ordering matters (e.g. time series).\n\n\n\n\n\n","category":"type"},{"location":"api/discretization_counts_probs_api/#ComplexityMeasures.RectangularBinning","page":"Discretization API","title":"ComplexityMeasures.RectangularBinning","text":"RectangularBinning(ϵ, precise = false) <: AbstractBinning\n\nRectangular box partition of state space using the scheme ϵ, deducing the histogram extent and bin width from the input data.\n\nRectangularBinning is a convenience struct. It is re-cast into FixedRectangularBinning once the data are provided, so see that docstring for info on the bin calculation and the meaning of precise.\n\nBinning instructions are deduced from the type of ϵ as follows:\n\nϵ::Int divides each coordinate axis into ϵ equal-length intervals that cover all data.\nϵ::Float64 divides each coordinate axis into intervals of fixed size ϵ, starting from the axis minima until the data is completely covered by boxes.\nϵ::Vector{Int} divides the i-th coordinate axis into ϵ[i] equal-length intervals that cover all data.\nϵ::Vector{Float64} divides the i-th coordinate axis into intervals of fixed size ϵ[i], starting from the axis minima until the data is completely covered by boxes.\n\nRectangularBinning ensures all input data are covered by extending the created ranges if need be.\n\n\n\n\n\n","category":"type"},{"location":"api/discretization_counts_probs_api/#ComplexityMeasures.FixedRectangularBinning","page":"Discretization API","title":"ComplexityMeasures.FixedRectangularBinning","text":"FixedRectangularBinning <: AbstractBinning\nFixedRectangularBinning(ranges::Tuple{<:AbstractRange...}, precise = false)\n\nRectangular box partition of state space where the partition along each dimension is explicitly given by each range ranges, which is a tuple of AbstractRange subtypes. Typically, each range is the output of the range Base function, e.g., ranges = (0:0.1:1, range(0, 1; length = 101), range(2.1, 3.2; step = 0.33)). All ranges must be sorted.\n\nThe optional second argument precise dictates whether Julia Base's TwicePrecision is used for when searching where a point falls into the range. Useful for edge cases of points being almost exactly on the bin edges, but it is exactly four times as slow, so by default it is false.\n\nPoints falling outside the partition do not contribute to probabilities. Bins are always left-closed-right-open: [a, b). This means that the last value of each of the ranges dictates the last right-closing value. This value does not belong to the histogram! E.g., if given a range r = range(0, 1; length = 11), with r[end] = 1, the value 1 is outside the partition and would not attribute any increase of the probability corresponding to the last bin (here [0.9, 1))!\n\nEquivalently, the size of the histogram is histsize = map(r -> length(r)-1, ranges)!\n\nFixedRectangularBinning leads to a well-defined outcome space without knowledge of input data, see ValueBinning.\n\n\n\n\n\n","category":"type"},{"location":"api/discretization_counts_probs_api/#Example:-encoding-*columns*-(one-variable-at-a-time)","page":"Discretization API","title":"Example: encoding columns (one variable at a time)","text":"","category":"section"},{"location":"api/discretization_counts_probs_api/","page":"Discretization API","title":"Discretization API","text":"Some OutcomeSpaces dictate a sliding window which has the width of one element when used with CodifyVariables. ValueBinning is such an outcome space.","category":"page"},{"location":"api/discretization_counts_probs_api/","page":"Discretization API","title":"Discretization API","text":"using Associations\nusing Random; rng = Xoshiro(1234)\n\nx = rand(rng, 100)\no = ValueBinning(3)\ncx = codify(CodifyVariables(o), x)","category":"page"},{"location":"api/discretization_counts_probs_api/","page":"Discretization API","title":"Discretization API","text":"We can verify that ValueBinning preserves the cardinality of the input dataset.","category":"page"},{"location":"api/discretization_counts_probs_api/","page":"Discretization API","title":"Discretization API","text":"length(x) == length(cx)","category":"page"},{"location":"api/discretization_counts_probs_api/","page":"Discretization API","title":"Discretization API","text":"Other outcome spaces such as Dispersion or OrdinalPatterns do not preserve the cardinality of the input dataset when used with CodifyVariables. This is because when they are applied in a sliding window, they compress sliding windows consisting of potentially multiple points into single integers. This means that some points at the end of each input variable are lost. For example, with OrdinalPatterns, the number of encoded points decrease with the embedding parameter m.","category":"page"},{"location":"api/discretization_counts_probs_api/","page":"Discretization API","title":"Discretization API","text":"using Associations\nusing Random; rng = Xoshiro(1234)\n\nx = rand(rng, 100)\no = OrdinalPatterns(m = 3)\ncx = codify(CodifyVariables(o), x)","category":"page"},{"location":"api/discretization_counts_probs_api/","page":"Discretization API","title":"Discretization API","text":"We can simultaneously encode multiple variable/columns of a StateSpaceSet using the same outcome space, as long as the operation will result in the same number of encoded data points for each column.","category":"page"},{"location":"api/discretization_counts_probs_api/","page":"Discretization API","title":"Discretization API","text":"using Associations\nusing Random; rng = Xoshiro(1234)\n\nx = rand(rng, 100)\ny = rand(rng, 100)\no = OrdinalPatterns(m = 3)\n# Alternatively provide a tuple of input time series: codify(CodifyVariables(o), (x, y))\ncx, cy = codify(CodifyVariables(o), StateSpaceSet(x, y)) \n\n[cx cy]","category":"page"},{"location":"examples/examples_infer_graphs/#examples_network_inference","page":"Causal graph inference","title":"Causal graphs","text":"","category":"section"},{"location":"examples/examples_infer_graphs/","page":"Causal graph inference","title":"Causal graph inference","text":"Before introducing the causal graph examples, let's create a function that can plot directed graphs that we'll use below.","category":"page"},{"location":"examples/examples_infer_graphs/","page":"Causal graph inference","title":"Causal graph inference","text":"using Graphs, CairoMakie, GraphMakie\n\nfunction plotgraph(g; nlabels = repr.(1:nv(g)))\n f, ax, p = graphplot(g,\n ilabels = nlabels,\n ilabels_color = [:white for i in 1:nv(g)],\n node_color = :blue,\n node_size = 80,\n arrow_size = 15,\n figure_padding = 10\n )\n offsets = 0.02 * (p[:node_pos][] .- p[:node_pos][][1])\n offsets[1] = Point2f(0, 0.2)\n p.nlabels_offset[] = offsets\n autolimits!(ax)\n hidedecorations!(ax)\n hidespines!(ax)\n ax.aspect = DataAspect()\n return f\nend","category":"page"},{"location":"examples/examples_infer_graphs/","page":"Causal graph inference","title":"Causal graph inference","text":"We'll also implement a set of chained logistic maps with unidirectional coupling.","category":"page"},{"location":"examples/examples_infer_graphs/","page":"Causal graph inference","title":"Causal graph inference","text":"using DynamicalSystemsBase\nBase.@kwdef struct Logistic4Chain{V, RX, RY, RZ, RW, C1, C2, C3, Σ1, Σ2, Σ3, RNG}\n xi::V = [0.1, 0.2, 0.3, 0.4]\n rx::RX = 3.9\n ry::RY = 3.6\n rz::RZ = 3.6\n rw::RW = 3.8\n c_xy::C1 = 0.4\n c_yz::C2 = 0.4\n c_zw::C3 = 0.35\n σ_xy::Σ1 = 0.05\n σ_yz::Σ2 = 0.05\n σ_zw::Σ3 = 0.05\n rng::RNG = Random.default_rng()\nend\n\nfunction eom_logistic4_chain(u, p::Logistic4Chain, t)\n (; xi, rx, ry, rz, rw, c_xy, c_yz, c_zw, σ_xy, σ_yz, σ_zw, rng) = p\n x, y, z, w = u\n f_xy = (y + c_xy*(x + σ_xy * rand(rng)) ) / (1 + c_xy*(1+σ_xy))\n f_yz = (z + c_yz*(y + σ_yz * rand(rng)) ) / (1 + c_yz*(1+σ_yz))\n f_zw = (w + c_zw*(z + σ_zw * rand(rng)) ) / (1 + c_zw*(1+σ_zw))\n dx = rx * x * (1 - x)\n dy = ry * (f_xy) * (1 - f_xy)\n dz = rz * (f_yz) * (1 - f_yz)\n dw = rw * (f_zw) * (1 - f_zw)\n return SVector{4}(dx, dy, dz, dw)\nend\n\n\nfunction system(definition::Logistic4Chain)\n return DiscreteDynamicalSystem(eom_logistic4_chain, definition.xi, definition)\nend","category":"page"},{"location":"examples/examples_infer_graphs/#oce_example","page":"Causal graph inference","title":"Optimal causation entropy","text":"","category":"section"},{"location":"examples/examples_infer_graphs/","page":"Causal graph inference","title":"Causal graph inference","text":"Here, we use the OCE algorithm to infer a time series graph. We use a SurrogateAssociationTest for the initial step, and a LocalPermutationTest for the conditional steps.","category":"page"},{"location":"examples/examples_infer_graphs/","page":"Causal graph inference","title":"Causal graph inference","text":"using Associations\nusing StableRNGs\nrng = StableRNG(123)\n\n# An example system where `X → Y → Z → W`.\nsys = system(Logistic4Chain(; rng))\nx, y, z, w = columns(first(trajectory(sys, 300, Ttr = 10000)))\n\n# Independence tests for unconditional and conditional stages.\nuest = KSG2(MIShannon(); k = 3, w = 1)\nutest = SurrogateAssociationTest(uest; rng, nshuffles = 19)\ncest = MesnerShalizi(CMIShannon(); k = 3, w = 1)\nctest = LocalPermutationTest(cest; rng, nshuffles = 19)\n\n# Infer graph\nalg = OCE(; utest, ctest, α = 0.05, τmax = 1)\nparents = infer_graph(alg, [x, y, z, w])\n\n# Convert to graph and inspect edges\ng = SimpleDiGraph(parents)\ncollect(edges(g))","category":"page"},{"location":"examples/examples_infer_graphs/","page":"Causal graph inference","title":"Causal graph inference","text":"The algorithm nicely recovers the true causal directions. We can also plot the graph using the function we made above.","category":"page"},{"location":"examples/examples_infer_graphs/","page":"Causal graph inference","title":"Causal graph inference","text":"plotgraph(g; nlabels = [\"x\", \"y\", \"z\", \"w\"])","category":"page"},{"location":"examples/examples_infer_graphs/#pc_examples","page":"Causal graph inference","title":"PC-algorithm","text":"","category":"section"},{"location":"examples/examples_infer_graphs/#pc_examples_corr","page":"Causal graph inference","title":"Correlation-based tests","text":"","category":"section"},{"location":"examples/examples_infer_graphs/","page":"Causal graph inference","title":"Causal graph inference","text":"Here, we demonstrate the use of the PC-algorithm with the correlation-based CorrTest both for the pairwise (i.e. using PearsonCorrelation) and conditional (i.e. using PartialCorrelation) case.","category":"page"},{"location":"examples/examples_infer_graphs/","page":"Causal graph inference","title":"Causal graph inference","text":"We'll reproduce the first example from CausalInference.jl, where they also use a parametric correlation test to infer the skeleton graph for some normally distributed data.","category":"page"},{"location":"examples/examples_infer_graphs/","page":"Causal graph inference","title":"Causal graph inference","text":"using Associations\nusing StableRNGs\nrng = StableRNG(123)\nn = 300\nv = randn(rng, n)\nx = v + randn(rng, n)*0.25\nw = x + randn(rng, n)*0.25\nz = v + w + randn(rng, n)*0.25\ns = z + randn(rng, n)*0.25\nX = [x, v, w, z, s]\n\n# Infer a completed partially directed acyclic graph (CPDAG)\nalg = PC(CorrTest(), CorrTest(); α = 0.05)\nest_cpdag_parametric = infer_graph(alg, X; verbose = false)\n\n# Plot the graph\nplotgraph(est_cpdag_parametric; nlabels = [\"x\", \"v\", \"w\", \"z\", \"s\"])","category":"page"},{"location":"examples/examples_infer_graphs/#pc_examples_nonparametric","page":"Causal graph inference","title":"Nonparametric tests","text":"","category":"section"},{"location":"examples/examples_infer_graphs/","page":"Causal graph inference","title":"Causal graph inference","text":"The main difference between the PC algorithm implementation here and in CausalInference.jl is that our implementation automatically works with any compatible and IndependenceTest, and thus any combination of (nondirectional) AssociationMeasure and estimator.","category":"page"},{"location":"examples/examples_infer_graphs/","page":"Causal graph inference","title":"Causal graph inference","text":"Here, we replicate the example above, but using a nonparametric SurrogateAssociationTest with the Shannon mutual information MIShannon measure and the GaoOhViswanath estimator for the pairwise independence tests, and a LocalPermutationTest with conditional mutual information CMIShannon and the MesnerShalizi.","category":"page"},{"location":"examples/examples_infer_graphs/","page":"Causal graph inference","title":"Causal graph inference","text":"using Associations\nusing StableRNGs\nrng = StableRNG(123)\n\n# Use fewer observations, because MI/CMI takes longer to estimate\nn = 300\nv = randn(rng, n)\nx = v + randn(rng, n)*0.25\nw = x + randn(rng, n)*0.25\nz = v + w + randn(rng, n)*0.25\ns = z + randn(rng, n)*0.25\nX = [x, v, w, z, s]\n\nest_pairwise = JointProbabilities(MIShannon(), CodifyVariables(ValueBinning(3)))\nest_cond = MesnerShalizi(CMIShannon(); k = 5)\npairwise_test = SurrogateAssociationTest(est_pairwise; rng, nshuffles = 50)\ncond_test = LocalPermutationTest(est_cond; rng, nshuffles = 50)\nalg = PC(pairwise_test, cond_test; α = 0.05)\nest_cpdag_nonparametric = infer_graph(alg, X; verbose = false)\nplotgraph(est_cpdag_nonparametric)","category":"page"},{"location":"examples/examples_infer_graphs/","page":"Causal graph inference","title":"Causal graph inference","text":"We get the same basic structure of the graph, but which directional associations are correctly ruled out varies. In general, using different types of association measures with different independence tests, applied to general non-gaussian data, will not give the same results as the correlation-based tests.","category":"page"},{"location":"api/information_multivariate_api/","page":"Multivariate information API","title":"Multivariate information API","text":"CollapsedDocStrings = true","category":"page"},{"location":"api/information_multivariate_api/#information_api","page":"Multivariate information API","title":"Multivariate information API","text":"","category":"section"},{"location":"api/information_multivariate_api/","page":"Multivariate information API","title":"Multivariate information API","text":"information(::MultivariateInformationMeasureEstimator)\nMultivariateInformationMeasureEstimator","category":"page"},{"location":"api/information_multivariate_api/#ComplexityMeasures.information-Tuple{MultivariateInformationMeasureEstimator}","page":"Multivariate information API","title":"ComplexityMeasures.information","text":"information(est::MultivariateInformationMeasureEstimator, x...)\n\nEstimate some MultivariateInformationMeasure on input data x..., using the given MultivariateInformationMeasureEstimator.\n\nThis is just a convenience wrapper around association(est, x...).\n\n\n\n\n\n","category":"method"},{"location":"api/information_multivariate_api/#Associations.MultivariateInformationMeasureEstimator","page":"Multivariate information API","title":"Associations.MultivariateInformationMeasureEstimator","text":"MultivariateInformationMeasureEstimator\n\nThe supertype for all estimators of multivariate information measures.\n\nGeneric implementations\n\nJointProbabilities\nEntropyDecomposition\nMIDecomposition\nCMIDecomposition\n\nDedicated implementations\n\nMutualInformationEstimators:\n\nKraskovStögbauerGrassberger1\nKraskovStögbauerGrassberger2\nGaoOhViswanath\nGaoKannanOhViswanath\nGaussianMI\n\nConditionalMutualInformationEstimators:\n\nFPVP\nMesnerShalizi\nRahimzamani\nPoczosSchneiderCMI\nGaussianCMI\n\nTransferEntropyEstimators:\n\nZhu1\nLindner\n\n\n\n\n\n","category":"type"},{"location":"api/information_multivariate_api/#Estimators","page":"Multivariate information API","title":"Estimators","text":"","category":"section"},{"location":"api/information_multivariate_api/#Generic-estimators","page":"Multivariate information API","title":"Generic estimators","text":"","category":"section"},{"location":"api/information_multivariate_api/","page":"Multivariate information API","title":"Multivariate information API","text":"We provide a set of generic estimators that can be used to calculate potentially several types of information measures.","category":"page"},{"location":"api/information_multivariate_api/","page":"Multivariate information API","title":"Multivariate information API","text":"JointProbabilities\nEntropyDecomposition\nMIDecomposition\nCMIDecomposition","category":"page"},{"location":"api/information_multivariate_api/#Associations.JointProbabilities","page":"Multivariate information API","title":"Associations.JointProbabilities","text":"JointProbabilities <: InformationMeasureEstimator\nJointProbabilities(\n definition::MultivariateInformationMeasure,\n discretization::Discretization\n)\n\nJointProbabilities is a generic estimator for multivariate discrete information measures.\n\nUsage\n\nUse with association to compute an information measure from input data.\n\nDescription\n\nIt first encodes the input data according to the given discretization, then constructs probs, a multidimensional Probabilities instance. Finally, probs are forwarded to a PlugIn estimator, which computes the measure according to definition.\n\nCompatible encoding schemes\n\nCodifyVariables (encode each variable/column of the input data independently by applying an encoding in a sliding window over each input variable). \nCodifyPoints (encode each point/column of the input data)\n\nWorks for any OutcomeSpace that implements codify.\n\nnote: Joint probabilities vs decomposition methods\nUsing JointProbabilities to compute an information measure, e.g. conditional mutual estimation, is typically slower than other dedicated estimation procedures like EntropyDecomposition. The reason is that measures such as CMIShannon can be formulated as a sum of four entropies, which can be estimated individually and summed afterwards. This decomposition is fast because because we avoid explicitly estimating the entire joint pmf, which demands many extra calculation steps, However, the decomposition is biased, because it fails to fully take into consideration the joint relationships between the variables. Pick your estimator according to your needs.\n\nSee also: Counts, Probabilities, ProbabilitiesEstimator, OutcomeSpace, DiscreteInfoEstimator.\n\n\n\n\n\n","category":"type"},{"location":"api/information_multivariate_api/#Associations.EntropyDecomposition","page":"Multivariate information API","title":"Associations.EntropyDecomposition","text":"EntropyDecomposition(definition::MultivariateInformationMeasure, \n est::DifferentialInfoEstimator)\nEntropyDecomposition(definition::MultivariateInformationMeasure,\n est::DiscreteInfoEstimator,\n discretization::CodifyVariables{<:OutcomeSpace},\n pest::ProbabilitiesEstimator = RelativeAmount())\n\nEstimate the multivariate information measure specified by definition by rewriting its formula into some combination of entropy terms. \n\nIf calling the second method (discrete variant), then discretization is always done per variable/column and each column is encoded into integers using codify.\n\nUsage\n\nUse with association to compute a MultivariateInformationMeasure from input data: association(est::EntropyDecomposition, x...).\nUse with some IndependenceTest to test for independence between variables.\n\nDescription\n\nThe entropy terms are estimated using est, and then combined to form the final estimate of definition. No bias correction is applied. If est is a DifferentialInfoEstimator, then discretization and pest are ignored. If est is a DiscreteInfoEstimator, then discretization and a probabilities estimator pest must also be provided (default to RelativeAmount, which uses naive plug-in probabilities).\n\nCompatible differential information estimators\n\nIf using the first signature, any compatible DifferentialInfoEstimator can be used.\n\nCompatible outcome spaces for discrete estimation\n\nIf using the second signature, the outcome spaces can be used for discretisation. Note that not all outcome spaces will work with all measures.\n\nEstimator Principle\nUniqueElements Count of unique elements\nValueBinning Binning (histogram)\nOrdinalPatterns Ordinal patterns\nDispersion Dispersion patterns\nBubbleSortSwaps Sorting complexity\nCosineSimilarityBinning Cosine similarities histogram\n\nBias\n\nEstimating the definition by decomposition into a combination of entropy terms, which are estimated independently, will in general be more biased than when using a dedicated estimator. One reason is that this decomposition may miss out on crucial information in the joint space. To remedy this, dedicated information measure estimators typically derive the marginal estimates by first considering the joint space, and then does some clever trick to eliminate the bias that is introduced through a naive decomposition. Unless specified below, no bias correction is applied for EntropyDecomposition.\n\nHandling of overlapping parameters\n\nIf there are overlapping parameters between the measure to be estimated, and the lower-level decomposed measures, then the top-level measure parameter takes precedence. For example, if we want to estimate CMIShannon(base = 2) through a decomposition of entropies using the Kraskov(Shannon(base = ℯ)) Shannon entropy estimator, then base = 2 is used.\n\ninfo: Info\nNot all measures have the property that they can be decomposed into more fundamental information theoretic quantities. For example, MITsallisMartin can be decomposed into a combination of marginal entropies, while MIRenyiSarbu cannot. An error will be thrown if decomposition is not possible.\n\nDiscrete entropy decomposition\n\nThe second signature is for discrete estimation using DiscreteInfoEstimators, for example PlugIn. The given discretization scheme (typically an OutcomeSpace) controls how the joint/marginals are discretized, and the probabilities estimator pest controls how probabilities are estimated from counts.\n\nnote: Bias\nLike for DifferentialInfoEstimator, using a dedicated estimator for the measure in question will be more reliable than using a decomposition estimate. Here's how different discretizations are applied:ValueBinning. Bin visitation frequencies are counted in the joint space XY, then marginal visitations are obtained from the joint bin visits. This behaviour is the same for both FixedRectangularBinning and RectangularBinning (which adapts the grid to the data). When using FixedRectangularBinning, the range along the first dimension is used as a template for all other dimensions. This is a bit slower than naively binning each marginal, but lessens bias.\nOrdinalPatterns. Each timeseries is separately codify-ed according to its ordinal pattern (no bias correction).\nDispersion. Each timeseries is separately codify-ed according to its dispersion pattern (no bias correction).\n\nExamples\n\nExample 1: MIShannon estimation using decomposition into discrete Shannon entropy estimated using CodifyVariables with ValueBinning.\nExample 2: MIShannon estimation using decomposition into discrete Shannon entropy estimated using CodifyVariables with BubbleSortSwaps.\nExample 3: MIShannon estimation using decomposition into differental Shannon entropy estimated using the Kraskov estimator.\n\nSee also: MutualInformationEstimator, MultivariateInformationMeasure.\n\n\n\n\n\n","category":"type"},{"location":"api/information_multivariate_api/#Associations.MIDecomposition","page":"Multivariate information API","title":"Associations.MIDecomposition","text":"MIDecomposition(definition::MultivariateInformationMeasure, \n est::MutualInformationEstimator)\n\nEstimate the MultivariateInformationMeasure specified by definition by by decomposing, the measure, if possible, into a combination of mutual information terms. These terms are individually estimated using the given MutualInformationEstimator est, and finally combined to form the final value of the measure. \n\nUsage\n\nUse with association to compute a MultivariateInformationMeasure from input data: association(est::MIDecomposition, x...).\nUse with some IndependenceTest to test for independence between variables.\n\nExamples\n\nExample 1: Estimating CMIShannon using a decomposition into MIShannon terms using the KraskovStögbauerGrassberger1 mutual information estimator.\n\nSee also: MultivariateInformationMeasureEstimator.\n\n\n\n\n\n","category":"type"},{"location":"api/information_multivariate_api/#Associations.CMIDecomposition","page":"Multivariate information API","title":"Associations.CMIDecomposition","text":"CMIDecomposition(definition::MultivariateInformationMeasure, \n est::ConditionalMutualInformationEstimator)\n\nEstimate some multivariate information measure specified by definition, by decomposing it into a combination of conditional mutual information terms. \n\nUsage\n\nUse with association to compute a MultivariateInformationMeasure from input data: association(est::CMIDecomposition, x...).\nUse with some IndependenceTest to test for independence between variables.\n\nDescription\n\nEach of the conditional mutual information terms are estimated using est, which can be any ConditionalMutualInformationEstimator. Finally, these estimates are combined according to the relevant decomposition formula.\n\nThis estimator is similar to EntropyDecomposition, but definition is expressed as conditional mutual information terms instead of entropy terms.\n\nExamples\n\nExample 1: Estimating TEShannon by decomposing it into CMIShannon which is estimated using the FPVP estimator.\n\nSee also: ConditionalMutualInformationEstimator, MultivariateInformationMeasureEstimator, MultivariateInformationMeasure.\n\n\n\n\n\n","category":"type"},{"location":"api/information_multivariate_api/#Mutual-information-estimators","page":"Multivariate information API","title":"Mutual information estimators","text":"","category":"section"},{"location":"api/information_multivariate_api/","page":"Multivariate information API","title":"Multivariate information API","text":"MutualInformationEstimator\nKraskovStögbauerGrassberger1\nKraskovStögbauerGrassberger2\nGaoKannanOhViswanath\nGaoOhViswanath\nGaussianMI","category":"page"},{"location":"api/information_multivariate_api/#Associations.MutualInformationEstimator","page":"Multivariate information API","title":"Associations.MutualInformationEstimator","text":"MutualInformationEstimator\n\nThe supertype for dedicated MutualInformation estimators.\n\nConcrete implementations\n\nKraskovStögbauerGrassberger1\nKraskovStögbauerGrassberger2\nGaoOhViswanath\nGaoKannanOhViswanath\nGaussianMI\n\n\n\n\n\n","category":"type"},{"location":"api/information_multivariate_api/#Associations.KraskovStögbauerGrassberger1","page":"Multivariate information API","title":"Associations.KraskovStögbauerGrassberger1","text":"KSG1 <: MutualInformationEstimator\nKraskovStögbauerGrassberger1 <: MutualInformationEstimator\nKraskovStögbauerGrassberger1(; k::Int = 1, w = 0, metric_marginals = Chebyshev())\n\nThe KraskovStögbauerGrassberger1 mutual information estimator (you can use KSG1 for short) is the I^(1) k-th nearest neighbor estimator from Kraskov et al. (2004).\n\nCompatible definitions\n\nMIShannon\n\nUsage\n\nUse with association to compute Shannon mutual information from input data.\nUse with some IndependenceTest to test for independence between variables.\n\nKeyword arguments\n\nk::Int: The number of nearest neighbors to consider. Only information about the k-th nearest neighbor is actually used.\nmetric_marginals: The distance metric for the marginals for the marginals can be any metric from Distances.jl. It defaults to metric_marginals = Chebyshev(), which is the same as in Kraskov et al. (2004).\nw::Int: The Theiler window, which determines if temporal neighbors are excluded during neighbor searches in the joint space. Defaults to 0, meaning that only the point itself is excluded.\n\nExample\n\nusing Associations\nusing Random; rng = MersenneTwister(1234)\nx = rand(rng, 10000); y = rand(rng, 10000)\nassociation(KSG1(; k = 10), x, y) # should be near 0 (and can be negative)\n\n\n\n\n\n","category":"type"},{"location":"api/information_multivariate_api/#Associations.KraskovStögbauerGrassberger2","page":"Multivariate information API","title":"Associations.KraskovStögbauerGrassberger2","text":"KSG2 <: MutualInformationEstimator\nKraskovStögbauerGrassberger2 <: MutualInformationEstimator\nKraskovStögbauerGrassberger2(; k::Int = 1, w = 0, metric_marginals = Chebyshev())\n\nThe KraskovStögbauerGrassberger2 mutual information estimator (you can use KSG2 for short) is the I^(2) k-th nearest neighbor estimator from (Kraskov et al., 2004).\n\nCompatible definitions\n\nMIShannon\n\nUsage\n\nUse with association to compute Shannon mutual information from input data.\nUse with some IndependenceTest to test for independence between variables.\n\nKeyword arguments\n\nk::Int: The number of nearest neighbors to consider. Only information about the k-th nearest neighbor is actually used.\nmetric_marginals: The distance metric for the marginals for the marginals can be any metric from Distances.jl. It defaults to metric_marginals = Chebyshev(), which is the same as in Kraskov et al. (2004).\nw::Int: The Theiler window, which determines if temporal neighbors are excluded during neighbor searches in the joint space. Defaults to 0, meaning that only the point itself is excluded.\n\nDescription\n\nLet the joint StateSpaceSet X = bfX_1 bfX_2 ldots bfX_m be defined by the concatenation of the marginal StateSpaceSets bfX_k _k=1^m, where each bfX_k is potentially multivariate. Let bfx_1 bfx_2 ldots bfx_N be the points in the joint space X.\n\nThe KraskovStögbauerGrassberger2 estimator first locates, for each bfx_i in X, the point bfn_i in X, the k-th nearest neighbor to bfx_i, according to the maximum norm (Chebyshev metric). Let epsilon_i be the distance d(bfx_i bfn_i).\n\nConsider x_i^m in bfX_m, the i-th point in the marginal space bfX_m. For each bfx_i^m, we determine theta_i^m := the number of points bfx_k^m in bfX_m that are a distance less than epsilon_i away from bfx_i^m. That is, we use the distance from a query point bfx_i in X (in the joint space) to count neighbors of x_i^m in bfX_m (in the marginal space).\n\nShannon mutual information between the variables bfX_1 bfX_2 ldots bfX_m is then estimated as\n\nhatI_KSG2(bfX) =\n psi(k) -\n dfracm - 1k +\n (m - 1)psi(N) -\n dfrac1N sum_i = 1^N sum_j = 1^m psi(theta_i^j + 1)\n\nExample\n\nusing Associations\nusing Random; rng = MersenneTwister(1234)\nx = rand(rng, 10000); y = rand(rng, 10000)\nassociation(KSG2(; k = 10), x, y) # should be near 0 (and can be negative)\n\n\n\n\n\n","category":"type"},{"location":"api/information_multivariate_api/#Associations.GaoKannanOhViswanath","page":"Multivariate information API","title":"Associations.GaoKannanOhViswanath","text":"GaoKannanOhViswanath <: MutualInformationEstimator\nGaoKannanOhViswanath(definition = MIShannon(); k = 1, w = 0)\n\nThe GaoKannanOhViswanath (Shannon) estimator is designed for estimating Shannon mutual information between variables that may be either discrete, continuous or a mixture of both (Gao et al., 2017).\n\nCompatible definitions\n\nMIShannon\n\nKeyword arguments\n\nk::Int: The number of nearest neighbors to consider. Only information about the k-th nearest neighbor is actually used.\nw::Int: The Theiler window, which determines if temporal neighbors are excluded during neighbor searches in the joint space. Defaults to 0, meaning that only the point itself is excluded.\n\nUsage\n\nUse with association to compute Shannon mutual information from input data.\nUse with some IndependenceTest to test for independence between variables.\n\nDescription\n\nThe estimator starts by expressing mutual information in terms of the Radon-Nikodym derivative, and then estimates these derivatives using k-nearest neighbor distances from empirical samples.\n\nThe estimator avoids the common issue of having to add noise to data before analysis due to tied points, which may bias other estimators. Citing their paper, the estimator \"strongly outperforms natural baselines of discretizing the mixed random variables (by quantization) or making it continuous by adding a small Gaussian noise.\"\n\nwarn: Implementation note\nIn Gao et al. (2017), they claim (roughly speaking) that the estimator reduces to the KraskovStögbauerGrassberger1 estimator for continuous-valued data. However, KraskovStögbauerGrassberger1 uses the digamma function, while GaoKannanOhViswanath uses the logarithm instead, so the estimators are not exactly equivalent for continuous data.Moreover, in their algorithm 1, it is clearly not the case that the method falls back on the KraskovStögbauerGrassberger1 approach. The KraskovStögbauerGrassberger1 estimator uses k-th neighbor distances in the joint space, while the GaoKannanOhViswanath algorithm selects the maximum k-th nearest distances among the two marginal spaces, which are in general not the same as the k-th neighbor distance in the joint space (unless both marginals are univariate). Therefore, our implementation here differs slightly from algorithm 1 in GaoKannanOhViswanath. We have modified it in a way that mimics KraskovStögbauerGrassberger1 for continous data. Note that because of using the log function instead of digamma, there will be slight differences between the methods. See the source code for more details.\n\nnote: Explicitly convert your discrete data to floats\nEven though the GaoKannanOhViswanath estimator is designed to handle discrete data, our implementation demands that all input data are StateSpaceSets whose data points are floats. If you have discrete data, such as strings or symbols, encode them using integers and convert those integers to floats before passing them to association.\n\nExamples\n\nusing Associations\nusing Random; rng = MersenneTwister(1234)\nx = rand(rng, 10000); y = rand(rng, 10000)\nassociation(GaoKannanOhViswanath(; k = 10), x, y) # should be near 0 (and can be negative)\n\n\n\n\n\n","category":"type"},{"location":"api/information_multivariate_api/#Associations.GaoOhViswanath","page":"Multivariate information API","title":"Associations.GaoOhViswanath","text":"GaoOhViswanath <: MutualInformationEstimator\nGaoOhViswanath(definition = MIShannon(); k = 1, w = 0)\n\nThe GaoOhViswanath is a mutual information estimator based on nearest neighbors, and is also called the bias-improved-KSG estimator, or BI-KSG, by (Gao et al., 2018).\n\nCompatible definitions\n\nMIShannon\n\nKeyword arguments\n\nk::Int: The number of nearest neighbors to consider. Only information about the k-th nearest neighbor is actually used.\nw::Int: The Theiler window, which determines if temporal neighbors are excluded during neighbor searches in the joint space. Defaults to 0, meaning that only the point itself is excluded.\n\nUsage\n\nUse with association to compute Shannon mutual information from input data.\nUse with some IndependenceTest to test for independence between variables.\n\nDescription\n\nThe estimator is given by\n\nbeginalign*\nhatH_GAO(X Y)\n= hatH_KSG(X) + hatH_KSG(Y) - hatH_KZL(X Y) \n= psi(k) +\n log(N) +\n log\n left(\n dfracc_d_x 2 c_d_y 2c_d_x + d_y 2\n right)\n - \n dfrac1N sum_i=1^N left( log(n_x i 2) + log(n_y i 2) right)\nendalign*\n\nwhere c_d 2 = dfracpi^fracd2Gamma(dfracd2 + 1) is the volume of a d-dimensional unit mathcall_2-ball.\n\nExample\n\nusing Associations\nusing Random; rng = MersenneTwister(1234)\nx = rand(rng, 10000); y = rand(rng, 10000)\nassociation(GaoOhViswanath(; k = 10), x, y) # should be near 0 (and can be negative)\n\n\n\n\n\n","category":"type"},{"location":"api/information_multivariate_api/#Associations.GaussianMI","page":"Multivariate information API","title":"Associations.GaussianMI","text":"GaussianMI <: MutualInformationEstimator\nGaussianMI(; normalize::Bool = false)\n\nGaussianMI is a parametric estimator for Shannon mutual information.\n\nCompatible definitions\n\nMIShannon\n\nUsage\n\nUse with association to compute Shannon mutual information from input data.\nUse with some IndependenceTest to test for independence between variables.\n\nDescription\n\nGiven d_x-dimensional and d_y-dimensional input data X and Y, GaussianMI first constructs the d_x + d_y-dimensional joint StateSpaceSet XY. If normalize == true, then we follow the approach in Vejmelka & Palus (2008)(Vejmelka and Paluš, 2008) and transform each column in XY to have zero mean and unit standard deviation. If normalize == false, then the algorithm proceeds without normalization.\n\nNext, the C_{XY}, the correlation matrix for the (normalized) joint data XY is computed. The mutual information estimate GaussianMI assumes the input variables are distributed according to normal distributions with zero means and unit standard deviations. Therefore, given d_x-dimensional and d_y-dimensional input data X and Y, GaussianMI first constructs the joint StateSpaceSet XY, then transforms each column in XY to have zero mean and unit standard deviation, and finally computes the \\Sigma, the correlation matrix for XY.\n\nThe mutual information estimated (for normalize == false) is then estimated as\n\nhatI^S_Gaussian(X Y) = dfrac12\ndfrac det(Sigma_X) det(Sigma_Y)) det(Sigma))\n\nwhere we Sigma_X and Sigma_Y appear in Sigma as\n\nSigma = beginbmatrix\nSigma_X Sigma^\nSigma^ Sigma_Y\nendbmatrix\n\nIf normalize == true, then the mutual information is estimated as\n\nhatI^S_Gaussian(X Y) = -dfrac12 sum_i = 1^d_x + d_y sigma_i\n\nwhere sigma_i are the eigenvalues for Sigma.\n\nExample\n\nusing Associations\nusing Random; rng = MersenneTwister(1234)\nx = rand(rng, 10000); y = rand(rng, 10000)\nassociation(GaussianMI(), x, y) # should be near 0 (and can be negative)\n\n\n\n\n\n","category":"type"},{"location":"api/information_multivariate_api/#Conditional-mutual-information-estimators","page":"Multivariate information API","title":"Conditional mutual information estimators","text":"","category":"section"},{"location":"api/information_multivariate_api/","page":"Multivariate information API","title":"Multivariate information API","text":"ConditionalMutualInformationEstimator\nGaussianCMI\nFPVP\nMesnerShalizi\nRahimzamani\nPoczosSchneiderCMI","category":"page"},{"location":"api/information_multivariate_api/#Associations.ConditionalMutualInformationEstimator","page":"Multivariate information API","title":"Associations.ConditionalMutualInformationEstimator","text":"ConditionalMutualInformationEstimator\n\nThe supertype for dedicated ConditionalMutualInformation estimators.\n\nConcrete implementations\n\nFPVP\nGaussianCMI\nMesnerShalizi\nRahimzamani\nPoczosSchneiderCMI\n\n\n\n\n\n","category":"type"},{"location":"api/information_multivariate_api/#Associations.GaussianCMI","page":"Multivariate information API","title":"Associations.GaussianCMI","text":"GaussianCMI <: MutualInformationEstimator\nGaussianCMI(definition = CMIShannon(); normalize::Bool = false)\n\nGaussianCMI is a parametric ConditionalMutualInformationEstimator (Vejmelka and Paluš, 2008).\n\nCompatible definitions\n\nCMIShannon\n\nUsage\n\nUse with association to compute CMIShannon from input data.\nUse with some IndependenceTest to test for independence between variables.\n\nDescription\n\nGaussianCMI estimates Shannon CMI through a sum of two mutual information terms that each are estimated using GaussianMI (the normalize keyword is the same as for GaussianMI):\n\nhatI_Gaussian(X Y Z) = hatI_Gaussian(X Y Z) - hatI_Gaussian(X Z)\n\nExamples\n\nExample 1. Estimating CMIShannon. \n\n\n\n\n\n","category":"type"},{"location":"api/information_multivariate_api/#Associations.FPVP","page":"Multivariate information API","title":"Associations.FPVP","text":"FPVP <: ConditionalMutualInformationEstimator\nFPVP(definition = CMIShannon(); k = 1, w = 0)\n\nThe Frenzel-Pompe-Vejmelka-Paluš (or FPVP for short) ConditionalMutualInformationEstimator is used to estimate the conditional mutual information using a k-th nearest neighbor approach that is analogous to that of the KraskovStögbauerGrassberger1 mutual information estimator from Frenzel and Pompe (2007) and Vejmelka and Paluš (2008).\n\nk is the number of nearest neighbors. w is the Theiler window, which controls the number of temporal neighbors that are excluded during neighbor searches.\n\nCompatible definitions\n\nCMIShannon\n\nUsage\n\nUse with association to compute ConditionalMutualInformation measure from input data.\nUse with some IndependenceTest to test for independence between variables.\n\nExamples\n\nExample 1: Estimating CMIShannon\n\n\n\n\n\n","category":"type"},{"location":"api/information_multivariate_api/#Associations.MesnerShalizi","page":"Multivariate information API","title":"Associations.MesnerShalizi","text":"MesnerShalizi <: ConditionalMutualInformationEstimator\nMesnerShalizi(definition = CMIShannon(); k = 1, w = 0)\n\nThe MesnerShalizi ConditionalMutualInformationEstimator is designed for data that can be mixtures of discrete and continuous data (Mesner and Shalizi, 2020).\n\nk is the number of nearest neighbors. w is the Theiler window, which controls the number of temporal neighbors that are excluded during neighbor searches.\n\nCompatible definitions\n\nCMIShannon\n\nUsage\n\nUse with association to compute CMIShannon from input data.\nUse with some IndependenceTest to test for independence between variables.\n\nExamples\n\nusing Associations\nusing Random; rng = MersenneTwister(1234)\nx = rand(rng, 10000)\ny = rand(rng, 10000) .+ x\nz = rand(rng, 10000) .+ y\nassociation(MesnerShalizi(; k = 10), x, z, y) # should be near 0 (and can be negative)\n\n\n\n\n\n","category":"type"},{"location":"api/information_multivariate_api/#Associations.Rahimzamani","page":"Multivariate information API","title":"Associations.Rahimzamani","text":"Rahimzamani <: ConditionalMutualInformationEstimator\nRahimzamani(k = 1, w = 0)\n\nThe Rahimzamani ConditionalMutualInformationEstimator is designed for data that can be mixtures of discrete and continuous data (Rahimzamani et al., 2018).\n\nCompatible definitions\n\nCMIShannon\n\nUsage\n\nUse with association to compute a CMIShannon from input data.\nUse with some IndependenceTest to test for independence between variables.\n\nDescription\n\nThis estimator is very similar to the GaoKannanOhViswanath mutual information estimator, but has been expanded to the conditional mutual information case.\n\nk is the number of nearest neighbors. w is the Theiler window, which controls the number of temporal neighbors that are excluded during neighbor searches.\n\nExamples\n\nusing Associations\nusing Random; rng = MersenneTwister(1234)\nx = rand(rng, 10000)\ny = rand(rng, 10000) .+ x\nz = rand(rng, 10000) .+ y\nassociation(Rahimzamani(; k = 10), x, z, y) # should be near 0 (and can be negative)\n\n\n\n\n\n","category":"type"},{"location":"api/information_multivariate_api/#Associations.PoczosSchneiderCMI","page":"Multivariate information API","title":"Associations.PoczosSchneiderCMI","text":"PoczosSchneiderCMI <: ConditionalMutualInformationEstimator\nPoczosSchneiderCMI(definition = CMIRenyiPoczos(); k = 1, w = 0)\n\nThe PoczosSchneiderCMI ConditionalMutualInformationEstimator computes conditional mutual informations using a k-th nearest neighbor approach (Póczos and Schneider, 2012).\n\nk is the number of nearest neighbors. w is the Theiler window, which controls the number of temporal neighbors that are excluded during neighbor searches.\n\nCompatible definitions\n\nCMIRenyiPoczos\n\nUsage\n\nUse with association to compute CMIRenyiPoczos from input data.\nUse with some IndependenceTest to test for independence between variables.\n\nExamples\n\nusing Associations\nusing Random; rng = MersenneTwister(1234)\nx = rand(rng, 10000)\ny = rand(rng, 10000) .+ x\nz = rand(rng, 10000) .+ y\nassociation(PoczosSchneiderCMI(CMIRenyiPoczos(), k = 10), x, z, y) # should be near 0 (and can be negative)\n\n\n\n\n\n","category":"type"},{"location":"api/information_multivariate_api/#Transfer-entropy-estimators","page":"Multivariate information API","title":"Transfer entropy estimators","text":"","category":"section"},{"location":"api/information_multivariate_api/","page":"Multivariate information API","title":"Multivariate information API","text":"TransferEntropyEstimator\nZhu1\nLindner\nSymbolicTransferEntropy\nHilbert\nPhase\nAmplitude","category":"page"},{"location":"api/information_multivariate_api/#Associations.TransferEntropyEstimator","page":"Multivariate information API","title":"Associations.TransferEntropyEstimator","text":"The supertype of all dedicated transfer entropy estimators.\n\n\n\n\n\n","category":"type"},{"location":"api/information_multivariate_api/#Associations.Zhu1","page":"Multivariate information API","title":"Associations.Zhu1","text":"Zhu1 <: TransferEntropyEstimator\nZhu1(k = 1, w = 0, base = MathConstants.e)\n\nThe Zhu1 transfer entropy estimator (Zhu et al., 2015) for normalized input data (as described in Zhu et al. (2015)) for both for pairwise and conditional transfer entropy.\n\nCompatible definitions\n\nTEShannon\n\nUsage\n\nUse with association to compute TEShannon from input data.\nUse with some IndependenceTest to test for independence between variables.\n\nDescription\n\nThis estimator approximates probabilities within hyperrectangles surrounding each point xᵢ ∈ x using using k nearest neighbor searches. However, it also considers the number of neighbors falling on the borders of these hyperrectangles. This estimator is an extension to the entropy estimator in Singh et al. (2003).\n\nw is the Theiler window, which determines if temporal neighbors are excluded during neighbor searches (defaults to 0, meaning that only the point itself is excluded when searching for neighbours).\n\nDescription\n\nFor a given points in the joint embedding space jᵢ, this estimator first computes the distance dᵢ from jᵢ to its k-th nearest neighbor. Then, for each point mₖ[i] in the k-th marginal space, it counts the number of points within radius dᵢ.\n\nThe Shannon transfer entropy is then computed as\n\nTE_S(X to Y) =\npsi(k) + dfrac1N sum_i^n\nleft\n sum_k=1^3 left( psi(m_ki + 1) right)\nright\n\nwhere the index k references the three marginal subspaces T, TTf and ST for which neighbor searches are performed. Here this estimator has been modified to allow for conditioning too (a simple modification to Lindner et al. (2011)'s equation 5 and 6). \n\nExample\n\nusing Associations\nusing Random; rng = MersenneTwister(1234)\nx = rand(rng, 10000)\ny = rand(rng, 10000) .+ x\nz = rand(rng, 10000) .+ y\nest = Zhu1(TEShannon(), k = 10)\nassociation(est, x, z, y) # should be near 0 (and can be negative)\n\n\n\n\n\n","category":"type"},{"location":"api/information_multivariate_api/#Associations.Lindner","page":"Multivariate information API","title":"Associations.Lindner","text":"Lindner <: TransferEntropyEstimator\nLindner(definition = Shannon(); k = 1, w = 0, base = 2)\n\nThe Lindner transfer entropy estimator (Lindner et al., 2011), which is also used in the Trentool MATLAB toolbox, and is based on nearest neighbor searches.\n\nCompatible definitions\n\nTEShannon\n\nUsage\n\nUse with association to compute TEShannon from input data.\nUse with some IndependenceTest to test for independence between variables.\n\nKeyword parameters\n\nw is the Theiler window, which determines if temporal neighbors are excluded during neighbor searches (defaults to 0, meaning that only the point itself is excluded when searching for neighbours).\n\nThe estimator can be used both for pairwise and conditional transfer entropy estimation.\n\nDescription\n\nFor a given points in the joint embedding space jᵢ, this estimator first computes the distance dᵢ from jᵢ to its k-th nearest neighbor. Then, for each point mₖ[i] in the k-th marginal space, it counts the number of points within radius dᵢ.\n\nThe Shannon transfer entropy is then computed as\n\nTE_S(X to Y) =\npsi(k) + dfrac1N sum_i^n\nleft\n sum_k=1^3 left( psi(m_ki + 1) right)\nright\n\nwhere the index k references the three marginal subspaces T, TTf and ST for which neighbor searches are performed. Here this estimator has been modified to allow for conditioning too (a simple modification to Lindner et al. (2011)'s equation 5 and 6). \n\nExample\n\nusing Associations\nusing Random; rng = MersenneTwister(1234)\nx = rand(rng, 10000)\ny = rand(rng, 10000) .+ x\nz = rand(rng, 10000) .+ y\nest = Lindner(TEShannon(), k = 10)\nassociation(est, x, z, y) # should be near 0 (and can be negative)\n\n\n\n\n\n","category":"type"},{"location":"api/information_multivariate_api/#Associations.SymbolicTransferEntropy","page":"Multivariate information API","title":"Associations.SymbolicTransferEntropy","text":"SymbolicTransferEntropy <: TransferEntropyEstimator\nSymbolicTransferEntropy(definition = TEShannon(); m = 3, τ = 1, \n lt = ComplexityMeasures.isless_rand\n\nA convenience estimator for symbolic transfer entropy (Staniek and Lehnertz, 2008).\n\nCompatible measures\n\nTEShannon\n\nDescription\n\nSymbolic transfer entropy consists of two simple steps. First, the input time series are encoded using codify with the CodifyVariables discretization and the OrdinalPatterns outcome space. This transforms the input time series into integer time series. Transfer entropy entropy is then estimated from the encoded time series by applying \n\nTransfer entropy is then estimated as usual on the encoded timeseries with the embedding dictated by definition and the JointProbabilities estimator.\n\nExamples\n\nExample 1\n\n\n\n\n\n","category":"type"},{"location":"api/information_multivariate_api/#Associations.Hilbert","page":"Multivariate information API","title":"Associations.Hilbert","text":"Hilbert(est;\n source::InstantaneousSignalProperty = Phase(),\n target::InstantaneousSignalProperty = Phase(),\n cond::InstantaneousSignalProperty = Phase())\n) <: TransferDifferentialEntropyEstimator\n\nCompute transfer entropy on instantaneous phases/amplitudes of relevant signals, which are obtained by first applying the Hilbert transform to each signal, then extracting the phases/amplitudes of the resulting complex numbers (Paluš, 2014). Original time series are thus transformed to instantaneous phase/amplitude time series. Transfer entropy is then estimated using the provided est on those phases/amplitudes (use e.g. ValueBinning, or OrdinalPatterns).\n\ninfo: Info\nDetails on estimation of the transfer entropy (conditional mutual information) following the phase/amplitude extraction step is not given in Palus (2014). Here, after instantaneous phases/amplitudes have been obtained, these are treated as regular time series, from which transfer entropy is then computed as usual.\n\nSee also: Phase, Amplitude.\n\n\n\n\n\n","category":"type"},{"location":"api/information_multivariate_api/#Associations.Phase","page":"Multivariate information API","title":"Associations.Phase","text":"Phase <: InstantaneousSignalProperty\n\nIndicates that the instantaneous phases of a signal should be used. \n\n\n\n\n\n","category":"type"},{"location":"api/information_multivariate_api/#Associations.Amplitude","page":"Multivariate information API","title":"Associations.Amplitude","text":"Amplitude <: InstantaneousSignalProperty\n\nIndicates that the instantaneous amplitudes of a signal should be used. \n\n\n\n\n\n","category":"type"},{"location":"api/information_multivariate_api/#tutorial_infomeasures","page":"Multivariate information API","title":"A small tutorial","text":"","category":"section"},{"location":"api/information_multivariate_api/","page":"Multivariate information API","title":"Multivariate information API","text":"Associations.jl extends the single-variate information API in ComplexityMeasures.jl to information measures of multiple variables. ","category":"page"},{"location":"api/information_multivariate_api/#Definitions","page":"Multivariate information API","title":"Definitions","text":"","category":"section"},{"location":"api/information_multivariate_api/","page":"Multivariate information API","title":"Multivariate information API","text":"We define \"information measure\" as some functional of probability mass functions or probability densities. This definition may or may not agree with literature usage, depending on the context. We made this choice pragmatically based on user-friendlyness and coding-friendlyness, but still trying to maintain some level of meaningful terminology.","category":"page"},{"location":"api/information_multivariate_api/","page":"Multivariate information API","title":"Multivariate information API","text":"note: A note on naming: the same name for different things?\nUpon doing a literature review on the possible variants of information theoretic measures, it become painstakingly obvious that authors use the same name for different concepts. For novices, and experienced practitioners too, this can be confusing. Our API clearly distinguishes between methods that are conceptually the same but named differently in the literature due to differing estimation strategies, from methods that actually have different definitions.Multiple, equivalent definitions occur for example for the Shannon mutual information (MI; MIShannon), which has both a discrete and continuous version, and there there are multiple equivalent mathematical formulas for them: a direct sum/integral over a joint probability mass function (pmf), as a sum of three entropy terms, and as a Kullback-Leibler divergence between the joint pmf and the product of the marginal distributions. Since these definitions are all equivalent, we only need once type (MIShannon) to represent them.\nBut Shannon MI is not the only type of mutual information! For example, \"Tsallis mutual information\" has been proposed in different variants by various authors. Despite sharing the same name, these are actually nonequivalent definitions. We've thus assigned them entirely different measure names (e.g. MITsallisFuruichi and MITsallisMartin), with the author name at the end.","category":"page"},{"location":"api/information_multivariate_api/#Basic-estimation-strategy","page":"Multivariate information API","title":"Basic estimation strategy","text":"","category":"section"},{"location":"api/information_multivariate_api/","page":"Multivariate information API","title":"Multivariate information API","text":"To estimate a multivariate information measure in practice, you must first specify the definition of the measure, which is then used as input to an estimator of that measure. This estimator is then given to association. Every information measure has at least one estimator: JointProbabilities. Many measures have several additional estimators, and an overview can be found in the docstring for MultivariateInformationMeasureEstimator.","category":"page"},{"location":"api/information_multivariate_api/#Distances/divergences","page":"Multivariate information API","title":"Distances/divergences","text":"","category":"section"},{"location":"api/information_multivariate_api/","page":"Multivariate information API","title":"Multivariate information API","text":"There are many information measures in the literature that aim to quantify the distance/divergence between two probability mass functions (pmf) or densities. You can find those that we implement here.","category":"page"},{"location":"api/information_multivariate_api/","page":"Multivariate information API","title":"Multivariate information API","text":"As an example, let's quantify the KLDivergence between two probability mass functions estimated by symbolizing two input vectors x and y using OrdinalPatterns. Since the discrete KLDivergence can be expressed as a function of a joint pmf, we can use the JointProbabilities estimator.","category":"page"},{"location":"api/information_multivariate_api/","page":"Multivariate information API","title":"Multivariate information API","text":"using Associations\nusing Random; rng = MersenneTwister(1234)\nx, y = rand(rng, 1000), rand(rng, 1000)\n\n# Specify a discretization. We discretize per column.\ndisc = CodifyVariables(OrdinalPatterns(m=2))\n\ndef = KLDivergence()\nest = JointProbabilities(def, disc)\nassociation(est, x, y) # should be close to 0","category":"page"},{"location":"api/information_multivariate_api/","page":"Multivariate information API","title":"Multivariate information API","text":"Divergences are examples of asymmetric information measures, which we can see by flipping the order of the input data.","category":"page"},{"location":"api/information_multivariate_api/","page":"Multivariate information API","title":"Multivariate information API","text":"association(est, y, x)","category":"page"},{"location":"api/information_multivariate_api/#Conditional-entropies","page":"Multivariate information API","title":"Conditional entropies","text":"","category":"section"},{"location":"api/information_multivariate_api/","page":"Multivariate information API","title":"Multivariate information API","text":"Conditional entropies are another example of asymmetric information measures. They all have in common that they are functions of a joint pmf, and can therefore also be estimated using the JointProbabilities estimator. This time, we'll use a rectangular binning with 3 bins along each dimension to discretize the data.","category":"page"},{"location":"api/information_multivariate_api/","page":"Multivariate information API","title":"Multivariate information API","text":"using Associations\nusing Random; rng = Xoshiro(1234)\n\nx, y = randn(rng, 1000), randn(rng, 1000)\ndisc = CodifyVariables(ValueBinning(3))\ndef = ConditionalEntropyShannon(base = 2)\nest = JointProbabilities(def, disc)\nassociation(est, x, y)","category":"page"},{"location":"api/information_multivariate_api/#Joint-entropies","page":"Multivariate information API","title":"Joint entropies","text":"","category":"section"},{"location":"api/information_multivariate_api/","page":"Multivariate information API","title":"Multivariate information API","text":"Joint entropies, on the other hand, are symmetric. Joint entropies are functionals of a joint pmf, so we can still use the JointProbabilities estimator. This time, we use a Dispersion based discretization.","category":"page"},{"location":"api/information_multivariate_api/","page":"Multivariate information API","title":"Multivariate information API","text":"using Associations\nusing Random; rng = Xoshiro(1234)\n\nx, y = randn(rng, 1000), randn(rng, 1000)\ndisc = CodifyVariables(Dispersion())\nest = JointProbabilities(JointEntropyShannon(base = 2), disc)\nassociation(est, x, y) ≈ association(est, y, x) # should be true","category":"page"},{"location":"api/information_multivariate_api/#Mutual-informations","page":"Multivariate information API","title":"Mutual informations","text":"","category":"section"},{"location":"api/information_multivariate_api/","page":"Multivariate information API","title":"Multivariate information API","text":"Mutual informations, in particular MIShannon is an often-used symmetric measure for quantifing the (possibly nonlinear) association between variables. It appears in both discrete and differential form, and can be estimated in a multitude of ways. For example, one can use dedicated MutualInformationEstimators such as KraskovStögbauerGrassberger2 or GaussianMI:","category":"page"},{"location":"api/information_multivariate_api/","page":"Multivariate information API","title":"Multivariate information API","text":"using Associations\nusing StateSpaceSets\n# We'll construct two state space sets, to illustrate how we can discretize \n# multidimensional inputs using `CodifyPoints`.\nx, y = StateSpaceSet(rand(rng, 1000, 2)), StateSpaceSet(rand(rng, 1000, 2))\nest = KSG1(MIShannon(base = 2), k = 10)\nassociation(est, x, y)","category":"page"},{"location":"api/information_multivariate_api/","page":"Multivariate information API","title":"Multivariate information API","text":"The result should be symmetric:","category":"page"},{"location":"api/information_multivariate_api/","page":"Multivariate information API","title":"Multivariate information API","text":"association(est, x, y) ≈ association(est, y, x) # should be true","category":"page"},{"location":"api/information_multivariate_api/","page":"Multivariate information API","title":"Multivariate information API","text":"One can also estimate mutual information using the EntropyDecomposition estimator, or (like above) using the JointProbabilities estimator. Let's construct a differential entropy based estimator based on the Kraskov estimator.","category":"page"},{"location":"api/information_multivariate_api/","page":"Multivariate information API","title":"Multivariate information API","text":"est_diff = EntropyDecomposition(MIShannon(base = 2), Kraskov(Shannon(), k=10))","category":"page"},{"location":"api/information_multivariate_api/","page":"Multivariate information API","title":"Multivariate information API","text":"association(est_diff, x, y)","category":"page"},{"location":"api/information_multivariate_api/","page":"Multivariate information API","title":"Multivariate information API","text":"We can also construct a discrete entropy based estimator based on e.g. PlugIn estimator of Shannon entropy.","category":"page"},{"location":"api/information_multivariate_api/","page":"Multivariate information API","title":"Multivariate information API","text":"# We know that `x` and `y` were generated from a uniform distribution above,\n# so we set the minimum and maximum values of the encoding to 0 and 1,\n# respectively.\nencoding = RelativeMeanEncoding(0.0, 1.0; n = 4)\ndisc = CodifyPoints(encoding)\nest_disc = JointProbabilities(MIShannon(base = 2), disc)\nassociation(est_disc, x, y)","category":"page"},{"location":"api/information_multivariate_api/#JointProbabilities:-fine-grained-discretization-control","page":"Multivariate information API","title":"JointProbabilities: fine grained discretization control","text":"","category":"section"},{"location":"api/information_multivariate_api/","page":"Multivariate information API","title":"Multivariate information API","text":"For numerical data, we can estimate both counts and probabilities using CodifyVariables with any count-based OutcomeSpace. Here, we'll estimate MIShannon using one type of encoding for the first variable, and another type of encoding for the second variable.","category":"page"},{"location":"api/information_multivariate_api/","page":"Multivariate information API","title":"Multivariate information API","text":"using Associations\nusing Random; rng = Xoshiro(1234)\nx, y = rand(rng, 100), rand(rng, 100)\n\n# We must use outcome spaces with the same number of total outcomes.\n# This works becuase these outcome spaces construct embedding points\n# (\"windows\") in the same way/order; be careful if that isn't the case!\nox = CosineSimilarityBinning(nbins = factorial(3))\noy = OrdinalPatterns(m = 3)\n\n# Now estimate mutual information\ndiscretization = CodifyVariables((ox, oy))\nest = JointProbabilities(MIShannon(), discretization)\nassociation(est, x, y)","category":"page"},{"location":"api/information_multivariate_api/","page":"Multivariate information API","title":"Multivariate information API","text":"For more fine-grained control than CodifyVariables can offer, we can use CodifyPoints with one or several Encodings. Here's how we can estimate MIShannon one multivariate input data by discretizing each input variable in arbitrary ways.","category":"page"},{"location":"api/information_multivariate_api/","page":"Multivariate information API","title":"Multivariate information API","text":"using Associations\nusing Random; rng = Xoshiro(1234)\nx, y = StateSpaceSet(rand(rng, 1000, 2)), StateSpaceSet(rand(rng, 1000, 3))\n\n # min/max of the `rand` call is 0 and 1\nprecise = true # precise bin edges\nr = range(0, 1; length = 3)\nbinning = FixedRectangularBinning(r, dimension(x), precise)\nencoding_x = RectangularBinEncoding(binning, x)\nencoding_y = CombinationEncoding(RelativeMeanEncoding(0.0, 1, n = 2), OrdinalPatternEncoding(3))\ndiscretization = CodifyPoints(encoding_x, encoding_y)\n\n# Now estimate mutual information\nest = JointProbabilities(MIShannon(), discretization)\nassociation(est, x, y)","category":"page"},{"location":"associations/","page":"Association measures","title":"Association measures","text":"CollapsedDocStrings = true","category":"page"},{"location":"associations/#association_measures","page":"Association measures","title":"Associations","text":"","category":"section"},{"location":"associations/#Association-API","page":"Association measures","title":"Association API","text":"","category":"section"},{"location":"associations/","page":"Association measures","title":"Association measures","text":"The most basic components of Associations.jl are a collection of statistics that in some manner quantify the \"association\" between input datasets. Precisely what is meant by \"association\" depends on the measure, and precisely what is meant by \"quantify\" depends on the estimator of that measure. We formalize this notion below with the association function, which dispatches on AssociationMeasureEstimator and AssociationMeasure.","category":"page"},{"location":"associations/","page":"Association measures","title":"Association measures","text":"association\nAssociationMeasure\nAssociationMeasureEstimator","category":"page"},{"location":"associations/#Associations.association","page":"Association measures","title":"Associations.association","text":"association(estimator::AssociationMeasureEstimator, x, y, [z, ...]) → r\nassociation(definition::AssociationMeasure, x, y, [z, ...]) → r\n\nEstimate the (conditional) association between input variables x, y, z, … using the given estimator (an AssociationMeasureEstimator) or definition (an AssociationMeasure). \n\ninfo: Info\nThe type of the return value r depends on the measure/estimator. The interpretation of the returned value also depends on the specific measure and estimator used.\n\nExamples\n\nThe examples section of the online documentation has numerous using association.\n\n\n\n\n\n","category":"function"},{"location":"associations/#Associations.AssociationMeasure","page":"Association measures","title":"Associations.AssociationMeasure","text":"AssociationMeasure\n\nThe supertype of all association measures. \n\nAbstract implementations\n\nCurrently, the association measures are classified by abstract classes listed below. These abstract classes offer common functionality among association measures that are conceptually similar. This makes maintenance and framework extension easier than if each measure was implemented \"in isolation\".\n\nMultivariateInformationMeasure\nCrossmapMeasure\nClosenessMeasure\nCorrelationMeasure\n\nConcrete implementations\n\nConcrete subtypes are given as input to association. Many of these types require an AssociationMeasureEstimator to compute.\n\nType AssociationMeasure Pairwise Conditional\nCorrelation PearsonCorrelation ✓ ✖\nCorrelation PartialCorrelation ✓ ✓\nCorrelation DistanceCorrelation ✓ ✓\nCorrelation ChatterjeeCorrelation ✓ ✖\nCorrelation AzadkiaChatterjeeCoefficient ✓ ✓\nCloseness SMeasure ✓ ✖\nCloseness HMeasure ✓ ✖\nCloseness MMeasure ✓ ✖\nCloseness (ranks) LMeasure ✓ ✖\nCloseness JointDistanceDistribution ✓ ✖\nCross-mapping PairwiseAsymmetricInference ✓ ✖\nCross-mapping ConvergentCrossMapping ✓ ✖\nConditional recurrence MCR ✓ ✖\nConditional recurrence RMCD ✓ ✓\nShared information MIShannon ✓ ✖\nShared information MIRenyiJizba ✓ ✖\nShared information MIRenyiSarbu ✓ ✖\nShared information MITsallisFuruichi ✓ ✖\nShared information PartialCorrelation ✖ ✓\nShared information CMIShannon ✖ ✓\nShared information CMIRenyiSarbu ✖ ✓\nShared information CMIRenyiJizba ✖ ✓\nShared information CMIRenyiPoczos ✖ ✓\nShared information CMITsallisPapapetrou ✖ ✓\nShared information ShortExpansionConditionalMutualInformation ✖ ✓\nInformation transfer TEShannon ✓ ✓\nInformation transfer TERenyiJizba ✓ ✓\nPartial mutual information PartialMutualInformation ✖ ✓\nInformation measure JointEntropyShannon ✓ ✖\nInformation measure JointEntropyRenyi ✓ ✖\nInformation measure JointEntropyTsallis ✓ ✖\nInformation measure ConditionalEntropyShannon ✓ ✖\nInformation measure ConditionalEntropyTsallisAbe ✓ ✖\nInformation measure ConditionalEntropyTsallisFuruichi ✓ ✖\nDivergence HellingerDistance ✓ ✖\nDivergence KLDivergence ✓ ✖\nDivergence RenyiDivergence ✓ ✖\nDivergence VariationDistance ✓ ✖\n\n\n\n\n\n","category":"type"},{"location":"associations/#Associations.AssociationMeasureEstimator","page":"Association measures","title":"Associations.AssociationMeasureEstimator","text":"AssociationMeasureEstimator\n\nThe supertype of all association measure estimators.\n\nConcrete subtypes are given as input to association.\n\nAbstract subtypes\n\nMultivariateInformationMeasureEstimator\nCrossmapEstimator\n\nConcrete implementations\n\nAssociationMeasure Estimators\nPearsonCorrelation Not required\nDistanceCorrelation Not required\nPartialCorrelation Not required\nChatterjeeCorrelation Not required\nAzadkiaChatterjeeCoefficient Not required\nSMeasure Not required\nHMeasure Not required\nMMeasure Not required\nLMeasure Not required\nJointDistanceDistribution Not required\nPairwiseAsymmetricInference RandomVectors, RandomSegment\nConvergentCrossMapping RandomVectors, RandomSegment\nMCR Not required\nRMCD Not required\nMIShannon JointProbabilities, EntropyDecomposition, KraskovStögbauerGrassberger1, KraskovStögbauerGrassberger2, GaoOhViswanath, GaoKannanOhViswanath, GaussianMI\nMIRenyiJizba JointProbabilities, EntropyDecomposition\nMIRenyiSarbu JointProbabilities\nMITsallisFuruichi JointProbabilities, EntropyDecomposition\nMITsallisMartin JointProbabilities, EntropyDecomposition\nCMIShannon JointProbabilities, EntropyDecomposition, MIDecomposition, GaussianCMI, FPVP, MesnerShalizi, Rahimzamani\nCMIRenyiSarbu JointProbabilities\nCMIRenyiJizba JointProbabilities, EntropyDecomposition\nCMIRenyiPoczos PoczosSchneiderCMI\nCMITsallisPapapetrou JointProbabilities\nTEShannon JointProbabilities, EntropyDecomposition, Zhu1, Lindner\nTERenyiJizba JointProbabilities\nPartialMutualInformation JointProbabilities\nShortExpansionConditionalMutualInformation JointProbabilities\nJointEntropyShannon JointProbabilities\nJointEntropyRenyi JointProbabilities\nJointEntropyTsallis JointProbabilities\nConditionalEntropyShannon JointProbabilities\nConditionalEntropyTsallisAbe JointProbabilities\nConditionalEntropyTsallisFuruichi JointProbabilities\nHellingerDistance JointProbabilities\nKLDivergence JointProbabilities\nRenyiDivergence JointProbabilities\nVariationDistance JointProbabilities\n\n\n\n\n\n","category":"type"},{"location":"associations/","page":"Association measures","title":"Association measures","text":"Here are some examples of how to use association.","category":"page"},{"location":"associations/","page":"Association measures","title":"Association measures","text":"using Associations\nx, y, z = rand(1000), rand(1000), rand(1000);\nassociation(LMeasure(), x, y)\nassociation(DistanceCorrelation(), x, y)\nassociation(JointProbabilities(JointEntropyShannon(), CodifyVariables(Dispersion(c = 3, m = 2))), x, y)\nassociation(EntropyDecomposition(MIShannon(), PlugIn(Shannon()), CodifyVariables(OrdinalPatterns(m=3))), x, y)\nassociation(KSG2(MIShannon(base = 2)), x, y)\nassociation(JointProbabilities(PartialMutualInformation(), CodifyVariables(OrdinalPatterns(m=3))), x, y, z)\nassociation(FPVP(CMIShannon(base = 2)), x, y, z)","category":"page"},{"location":"associations/#information_api","page":"Association measures","title":"Information measures","text":"","category":"section"},{"location":"associations/","page":"Association measures","title":"Association measures","text":"MultivariateInformationMeasure","category":"page"},{"location":"associations/#Associations.MultivariateInformationMeasure","page":"Association measures","title":"Associations.MultivariateInformationMeasure","text":"MultivariateInformationMeasure <: AssociationMeasure\n\nThe supertype for all multivariate information-based measure definitions.\n\nDefinition\n\nFollowing Datseris and Haaga (2024), we define a multivariate information measure as any functional of a multidimensional probability mass functions (PMFs) or multidimensional probability density.\n\nImplementations\n\nJointEntropy definitions:\n\nJointEntropyShannon\nJointEntropyRenyi\nJointEntropyTsallis\n\nConditionalEntropy definitions:\n\nConditionalEntropyShannon\nConditionalEntropyTsallisAbe\nConditionalEntropyTsallisFuruichi\n\nDivergenceOrDistance definitions:\n\nHellingerDistance\nKLDivergence\nRenyiDivergence\nVariationDistance\n\nMutualInformation definitions:\n\nMIShannon\nMIRenyiJizba\nMIRenyiSarbu\nMITsallisMartin\nMITsallisFuruichi\n\nConditionalMutualInformation definitions:\n\nCMIShannon\nCMITsallisPapapetrou\nCMIRenyiJizba\nCMIRenyiPoczos\nCMIRenyiSarbu\n\nTransferEntropy definitions:\n\nTEShannon\nTERenyiJizba\n\nOther definitions:\n\nPartialMutualInformation\n\n\n\n\n\n","category":"type"},{"location":"associations/#conditional_entropies","page":"Association measures","title":"Conditional entropies","text":"","category":"section"},{"location":"associations/","page":"Association measures","title":"Association measures","text":"ConditionalEntropy\nConditionalEntropyShannon\nConditionalEntropyTsallisFuruichi\nConditionalEntropyTsallisAbe","category":"page"},{"location":"associations/#Associations.ConditionalEntropy","page":"Association measures","title":"Associations.ConditionalEntropy","text":"ConditionalEntropy <: MultivariateInformationMeasure\n\nThe supertype for all conditional entropy measures.\n\nConcrete subtypes\n\nConditionalEntropyShannon\nConditionalEntropyTsallisAbe\nConditionalEntropyTsallisFuruichi\n\n\n\n\n\n","category":"type"},{"location":"associations/#Associations.ConditionalEntropyShannon","page":"Association measures","title":"Associations.ConditionalEntropyShannon","text":"ConditionalEntropyShannon <: ConditionalEntropy\nConditionalEntropyShannon(; base = 2)\n\nThe Shannon conditional entropy measure.\n\nUsage\n\nUse with association to compute the Shannon conditional entropy between two variables.\n\nCompatible estimators\n\nJointProbabilities\n\nDiscrete definition\n\nSum formulation\n\nThe conditional entropy between discrete random variables X and Y with finite ranges mathcalX and mathcalY is defined as\n\nH^S(X Y) = -sum_x in mathcalX y in mathcalY p(x y) log(p(x y))\n\nThis is the definition used when calling association with a JointProbabilities estimator.\n\nTwo-entropies formulation\n\nEquivalently, the following differenConditionalEntropy of entropies hold\n\nH^S(X Y) = H^S(X Y) - H^S(Y)\n\nwhere H^S(cdot) and H^S(cdot cdot) are the Shannon entropy and Shannon joint entropy, respectively. This is the definition used when calling association with a ProbabilitiesEstimator.\n\nDifferential definition\n\nThe differential conditional Shannon entropy is analogously defined as\n\nH^S(X Y) = h^S(X Y) - h^S(Y)\n\nwhere h^S(cdot) and h^S(cdot cdot) are the Shannon differential entropy and Shannon joint differential entropy, respectively. This is the definition used when calling association with a DifferentialInfoEstimator.\n\nEstimation\n\nExample 1: Analytical example from Cover & Thomas's book.\nExample 2: JointProbabilities estimator withCodifyVariables discretization and UniqueElements outcome space on categorical data.\nExample 3: JointProbabilities estimator with CodifyPoints discretization and UniqueElementsEncoding encoding of points on numerical data.\n\n\n\n\n\n","category":"type"},{"location":"associations/#Associations.ConditionalEntropyTsallisFuruichi","page":"Association measures","title":"Associations.ConditionalEntropyTsallisFuruichi","text":"ConditionalEntropyTsallisFuruichi <: ConditionalEntropy\nConditionalEntropyTsallisFuruichi(; base = 2, q = 1.5)\n\nFuruichi (2006)'s discrete Tsallis conditional entropy definition.\n\nUsage\n\nUse with association to compute the Tsallis-Furuichi conditional entropy between two variables.\n\nCompatible estimators\n\nJointProbabilities\n\nDefinition\n\nFuruichi's Tsallis conditional entropy between discrete random variables X and Y with finite ranges mathcalX and mathcalY is defined as\n\nH_q^T(X Y) = -sum_x in mathcalX y in mathcalY\np(x y)^q log_q(p(x y))\n\nln_q(x) = fracx^1-q - 11 - q and q neq 1. For q = 1, H_q^T(X Y) reduces to the Shannon conditional entropy:\n\nH_q=1^T(X Y) = -sum_x in mathcalX y in mathcalY =\np(x y) log(p(x y))\n\nIf any of the entries of the marginal distribution for Y are zero, or the q-logarithm is undefined for a particular value, then the measure is undefined and NaN is returned.\n\nEstimation\n\nExample 1: JointProbabilities estimator withCodifyVariables discretization and UniqueElements outcome space on categorical data.\nExample 2: JointProbabilities estimator with CodifyPoints discretization and UniqueElementsEncoding encoding of points on numerical data.\n\n\n\n\n\n","category":"type"},{"location":"associations/#Associations.ConditionalEntropyTsallisAbe","page":"Association measures","title":"Associations.ConditionalEntropyTsallisAbe","text":"ConditionalEntropyTsallisAbe <: ConditionalEntropy\nConditionalEntropyTsallisAbe(; base = 2, q = 1.5)\n\nAbe and Rajagopal (2001)'s discrete Tsallis conditional entropy measure.\n\nUsage\n\nUse with association to compute the Tsallis-Abe conditional entropy between two variables.\n\nCompatible estimators\n\nJointProbabilities\n\nDefinition\n\nAbe & Rajagopal's Tsallis conditional entropy between discrete random variables X and Y with finite ranges mathcalX and mathcalY is defined as\n\nH_q^T_A(X Y) = dfracH_q^T(X Y) - H_q^T(Y)1 + (1-q)H_q^T(Y)\n\nwhere H_q^T(cdot) and H_q^T(cdot cdot) is the Tsallis entropy and the joint Tsallis entropy.\n\nEstimation\n\nExample 1: JointProbabilities estimator withCodifyVariables discretization and UniqueElements outcome space on categorical data.\nExample 2: JointProbabilities estimator with CodifyPoints discretization and UniqueElementsEncoding encoding of points on numerical data.\n\n\n\n\n\n","category":"type"},{"location":"associations/#divergences_and_distances","page":"Association measures","title":"Divergences and distances","text":"","category":"section"},{"location":"associations/","page":"Association measures","title":"Association measures","text":"DivergenceOrDistance\nHellingerDistance\nKLDivergence\nRenyiDivergence\nVariationDistance","category":"page"},{"location":"associations/#Associations.DivergenceOrDistance","page":"Association measures","title":"Associations.DivergenceOrDistance","text":"DivergenceOrDistance <: BivariateInformationMeasure\n\nThe supertype for bivariate information measures aiming to quantify some sort of divergence, distance or closeness between two probability distributions.\n\nSome of these measures are proper metrics, while others are not, but they have in common that they aim to quantify how \"far from each other\" two probabilities distributions are.\n\nConcrete implementations\n\nHellingerDistance\nKLDivergence\nRenyiDivergence\nVariationDistance\n\n\n\n\n\n","category":"type"},{"location":"associations/#Associations.HellingerDistance","page":"Association measures","title":"Associations.HellingerDistance","text":"HellingerDistance <: DivergenceOrDistance\n\nThe Hellinger distance.\n\nUsage\n\nUse with association to compute the compute the Hellinger distance between two pre-computed probability distributions, or from raw data using one of the estimators listed below.\n\nCompatible estimators\n\nJointProbabilities\n\nDescription\n\nThe Hellinger distance between two probability distributions P_X = (p_x(omega_1) ldots p_x(omega_n)) and P_Y = (p_y(omega_1) ldots p_y(omega_m)), both defined over the same OutcomeSpace Omega = omega_1 ldots omega_n , is defined as\n\nD_H(P_Y(Omega) P_Y(Omega)) =\ndfrac1sqrt2 sum_omega in Omega (sqrtp_x(omega) - sqrtp_y(omega))^2\n\nEstimation\n\nExample 1: From precomputed probabilities\nExample 2: JointProbabilities with OrdinalPatterns outcome space\n\n\n\n\n\n","category":"type"},{"location":"associations/#Associations.KLDivergence","page":"Association measures","title":"Associations.KLDivergence","text":"KLDivergence <: DivergenceOrDistance\n\nThe Kullback-Leibler (KL) divergence.\n\nUsage\n\nUse with association to compute the compute the KL-divergence between two pre-computed probability distributions, or from raw data using one of the estimators listed below.\n\nCompatible estimators\n\nJointDistanceDistribution\n\nEstimators\n\nJointProbabilities.\n\nDescription\n\nThe KL-divergence between two probability distributions P_X = (p_x(omega_1) ldots p_x(omega_n)) and P_Y = (p_y(omega_1) ldots p_y(omega_m)), both defined over the same OutcomeSpace Omega = omega_1 ldots omega_n , is defined as\n\nD_KL(P_Y(Omega) P_Y(Omega)) =\nsum_omega in Omega p_x(omega) logdfracp_x(omega)p_y(omega)\n\nImplements\n\nassociation. Used to compute the KL-divergence between two pre-computed probability distributions. If used with RelativeAmount, the KL divergence may be undefined to due some outcomes having zero counts. Use some other ProbabilitiesEstimator like BayesianRegularization to ensure all estimated probabilities are nonzero.\n\nnote: Note\nDistances.jl also defines KLDivergence. Quality it if you're loading both packages, i.e. do association(Associations.KLDivergence(), x, y).\n\nEstimation\n\nExample 1: From precomputed probabilities\nExample 2: JointProbabilities with OrdinalPatterns outcome space\n\n\n\n\n\n","category":"type"},{"location":"associations/#Associations.RenyiDivergence","page":"Association measures","title":"Associations.RenyiDivergence","text":"RenyiDivergence <: DivergenceOrDistance\nRenyiDivergence(q; base = 2)\n\nThe Rényi divergence of positive order q.\n\nUsage\n\nUse with association to compute the compute the Rényi divergence between two pre-computed probability distributions, or from raw data using one of the estimators listed below.\n\nCompatible estimators\n\nJointDistanceDistribution\n\nDescription\n\nThe Rényi divergence between two probability distributions P_X = (p_x(omega_1) ldots p_x(omega_n)) and P_Y = (p_y(omega_1) ldots p_y(omega_m)), both defined over the same OutcomeSpace Omega = omega_1 ldots omega_n , is defined as van Erven and Harremos (2014).\n\nD_q(P_Y(Omega) P_Y(Omega)) =\ndfrac1q - 1 log sum_omega in Omegap_x(omega)^qp_y(omega)^1-alpha\n\nImplements\n\ninformation. Used to compute the Rényi divergence between two pre-computed probability distributions. If used with RelativeAmount, the KL divergence may be undefined to due some outcomes having zero counts. Use some other ProbabilitiesEstimator like BayesianRegularization to ensure all estimated probabilities are nonzero.\n\nnote: Note\nDistances.jl also defines RenyiDivergence. Quality it if you're loading both packages, i.e. do association(Associations.RenyiDivergence(), x, y).\n\nEstimation\n\nExample 1: From precomputed probabilities\nExample 2: JointProbabilities with OrdinalPatterns outcome space\n\n\n\n\n\n","category":"type"},{"location":"associations/#Associations.VariationDistance","page":"Association measures","title":"Associations.VariationDistance","text":"VariationDistance <: DivergenceOrDistance\n\nThe variation distance.\n\nUsage\n\nUse with association to compute the compute the variation distance between two pre-computed probability distributions, or from raw data using one of the estimators listed below.\n\nCompatible estimators\n\nJointDistanceDistribution\n\nDescription\n\nThe variation distance between two probability distributions P_X = (p_x(omega_1) ldots p_x(omega_n)) and P_Y = (p_y(omega_1) ldots p_y(omega_m)), both defined over the same OutcomeSpace Omega = omega_1 ldots omega_n , is defined as\n\nD_V(P_Y(Omega) P_Y(Omega)) =\ndfrac12 sum_omega in Omega p_x(omega) - p_y(omega) \n\nExamples\n\nExample 1: From precomputed probabilities\nExample 2: JointProbabilities with OrdinalPatterns outcome space\n\n\n\n\n\n","category":"type"},{"location":"associations/#joint_entropies","page":"Association measures","title":"Joint entropies","text":"","category":"section"},{"location":"associations/","page":"Association measures","title":"Association measures","text":"JointEntropy\nJointEntropyShannon\nJointEntropyTsallis\nJointEntropyRenyi","category":"page"},{"location":"associations/#Associations.JointEntropy","page":"Association measures","title":"Associations.JointEntropy","text":"JointEntropy <: BivariateInformationMeasure\n\nThe supertype for all joint entropy measures.\n\nConcrete implementations\n\nJointEntropyShannon\nJointEntropyRenyi\nJointEntropyTsallis\n\n\n\n\n\n","category":"type"},{"location":"associations/#Associations.JointEntropyShannon","page":"Association measures","title":"Associations.JointEntropyShannon","text":"JointEntropyShannon <: JointEntropy\nJointEntropyShannon(; base = 2)\n\nThe Shannon joint entropy measure (Cover, 1999).\n\nUsage\n\nUse with association to compute the Shannon joint entropy between two variables.\n\nCompatible estimators\n\nJointProbabilities\n\nDefinition\n\nGiven two two discrete random variables X and Y with ranges mathcalX and mathcalX, Cover (1999) defines the Shannon joint entropy as\n\nH^S(X Y) = -sum_xin mathcalX y in mathcalY p(x y) log p(x y)\n\nwhere we define log(p(x y)) = 0 if p(x y) = 0.\n\nEstimation\n\nExample 1: JointProbabilities with Dispersion outcome space\n\n\n\n\n\n","category":"type"},{"location":"associations/#Associations.JointEntropyTsallis","page":"Association measures","title":"Associations.JointEntropyTsallis","text":"JointEntropyTsallis <: JointEntropy\nJointEntropyTsallis(; base = 2, q = 1.5)\n\nThe Tsallis joint entropy definition from Furuichi (2006). \n\nUsage\n\nUse with association to compute the Furuichi-Tsallis joint entropy between two variables.\n\nCompatible estimators\n\nJointProbabilities\n\nDefinition\n\nGiven two two discrete random variables X and Y with ranges mathcalX and mathcalX, Furuichi (2006) defines the Tsallis joint entropy as\n\nH_q^T(X Y) = -sum_xin mathcalX y in mathcalY p(x y)^q log_q p(x y)\n\nwhere log_q(x q) = dfracx^1-q - 11-q is the q-logarithm, and we define log_q(x q) = 0 if q = 0.\n\nEstimation\n\nExample 1: JointProbabilities with OrdinalPatterns outcome space\n\n\n\n\n\n","category":"type"},{"location":"associations/#Associations.JointEntropyRenyi","page":"Association measures","title":"Associations.JointEntropyRenyi","text":"JointEntropyRenyi <: JointEntropy\nJointEntropyRenyi(; base = 2, q = 1.5)\n\nThe Rényi joint entropy measure (Golshani et al., 2009).\n\nUsage\n\nUse with association to compute the Golshani-Rényi joint entropy between two variables.\n\nCompatible estimators\n\nJointProbabilities\n\nDefinition\n\nGiven two two discrete random variables X and Y with ranges mathcalX and mathcalX, Golshani et al. (2009) defines the Rényi joint entropy as\n\nH_q^R(X Y) = dfrac11-alpha log sum_i = 1^N p_i^q\n\nwhere q 0 and q = 1.\n\nEstimation\n\nExample 1: JointProbabilities with ValueBinning outcome space\n\n\n\n\n\n","category":"type"},{"location":"associations/#Mutual-informations","page":"Association measures","title":"Mutual informations","text":"","category":"section"},{"location":"associations/","page":"Association measures","title":"Association measures","text":"MutualInformation\nMIShannon\nMITsallisFuruichi\nMITsallisMartin\nMIRenyiJizba\nMIRenyiSarbu","category":"page"},{"location":"associations/#Associations.MutualInformation","page":"Association measures","title":"Associations.MutualInformation","text":"MutualInformation\n\nAbstract type for all mutual information measures.\n\nConcrete implementations\n\nMIShannon\nMITsallisMartin\nMITsallisFuruichi\nMIRenyiJizba\nMIRenyiSarbu\n\nSee also: MutualInformationEstimator\n\n\n\n\n\n","category":"type"},{"location":"associations/#Associations.MIShannon","page":"Association measures","title":"Associations.MIShannon","text":"MIShannon <: BivariateInformationMeasure\nMIShannon(; base = 2)\n\nThe Shannon mutual information I_S(X Y).\n\nUsage\n\nUse with association to compute the raw Shannon mutual information from input data using of of the estimators listed below.\nUse with independence to perform a formal hypothesis test for pairwise dependence using the Shannon mutual information.\n\nCompatible estimators\n\nJointProbabilities (generic)\nEntropyDecomposition (generic)\nKraskovStögbauerGrassberger1\nKraskovStögbauerGrassberger2\nGaoOhViswanath\nGaoKannanOhViswanath\nGaussianMI\n\nDiscrete definition\n\nThere are many equivalent formulations of discrete Shannon mutual information, meaning that it can be estimated in several ways, either using JointProbabilities (double-sum formulation), EntropyDecomposition (three-entropies decomposition), or some dedicated estimator.\n\nDouble sum formulation\n\nAssume we observe samples barbfX_1N_y = barbfX_1 ldots barbfX_n and barbfY_1N_x = barbfY_1 ldots barbfY_n from two discrete random variables X and Y with finite supports mathcalX = x_1 x_2 ldots x_M_x and mathcalY = y_1 y_2 ldots x_M_y. The double-sum estimate is obtained by replacing the double sum\n\nhatI_DS(X Y) =\n sum_x_i in mathcalX y_i in mathcalY p(x_i y_j) log left( dfracp(x_i y_i)p(x_i)p(y_j) right)\n\nwhere hatp(x_i) = fracn(x_i)N_x, hatp(y_i) = fracn(y_j)N_y, and hatp(x_i x_j) = fracn(x_i)N, and N = N_x N_y. This definition is used by association when called with a JointProbabilities estimator.\n\nThree-entropies formulation\n\nAn equivalent formulation of discrete Shannon mutual information is\n\nI^S(X Y) = H^S(X) + H_q^S(Y) - H^S(X Y)\n\nwhere H^S(cdot) and H^S(cdot cdot) are the marginal and joint discrete Shannon entropies. This definition is used by association when called with a EntropyDecomposition estimator and a discretization.\n\nDifferential mutual information\n\nOne possible formulation of differential Shannon mutual information is\n\nI^S(X Y) = h^S(X) + h_q^S(Y) - h^S(X Y)\n\nwhere h^S(cdot) and h^S(cdot cdot) are the marginal and joint differential Shannon entropies. This definition is used by association when called with EntropyDecomposition estimator and a DifferentialInfoEstimator.\n\nEstimation\n\nExample 1: JointProbabilities with ValueBinning outcome space.\nExample 2: JointProbabilities with UniqueElements outcome space on string data.\nExample 3: Dedicated GaussianMI estimator.\nExample 4: Dedicated KraskovStögbauerGrassberger1 estimator.\nExample 5: Dedicated KraskovStögbauerGrassberger2 estimator.\nExample 6: Dedicated GaoKannanOhViswanath estimator.\nExample 7: EntropyDecomposition with Kraskov estimator.\nExample 8: EntropyDecomposition with BubbleSortSwaps.\nExample 9: EntropyDecomposition with Jackknife estimator and ValueBinning outcome space.\nExample 10: Reproducing Kraskov et al. (2004).\n\n\n\n\n\n","category":"type"},{"location":"associations/#Associations.MITsallisFuruichi","page":"Association measures","title":"Associations.MITsallisFuruichi","text":"MITsallisFuruichi <: BivariateInformationMeasure\nMITsallisFuruichi(; base = 2, q = 1.5)\n\nThe discrete Tsallis mutual information from Furuichi (2006)(Furuichi, 2006), which in that paper is called the mutual entropy.\n\nUsage\n\nUse with association to compute the raw Tsallis-Furuichi mutual information from input data using of of the estimators listed below.\nUse with independence to perform a formal hypothesis test for pairwise dependence using the Tsallis-Furuichi mutual information.\n\nCompatible estimators\n\nJointProbabilities\nEntropyDecomposition\n\nDescription\n\nFuruichi's Tsallis mutual entropy between variables X in mathbbR^d_X and Y in mathbbR^d_Y is defined as\n\nI_q^T(X Y) = H_q^T(X) - H_q^T(X Y) = H_q^T(X) + H_q^T(Y) - H_q^T(X Y)\n\nwhere H^T(cdot) and H^T(cdot cdot) are the marginal and joint Tsallis entropies, and q is the Tsallis-parameter.\n\nEstimation\n\nExample 1: JointProbabilities with UniqueElements outcome space.\nExample 2: EntropyDecomposition with LeonenkoProzantoSavani estimator.\nExample 3: EntropyDecomposition with Dispersion\n\n\n\n\n\n","category":"type"},{"location":"associations/#Associations.MITsallisMartin","page":"Association measures","title":"Associations.MITsallisMartin","text":"MITsallisMartin <: BivariateInformationMeasure\nMITsallisMartin(; base = 2, q = 1.5)\n\nThe discrete Tsallis mutual information from Martin et al. (2004).\n\nUsage\n\nUse with association to compute the raw Tsallis-Martin mutual information from input data using of of the estimators listed below.\nUse with independence to perform a formal hypothesis test for pairwise dependence using the Tsallis-Martin mutual information.\n\nCompatible estimators\n\nJointProbabilities\nEntropyDecomposition\n\nDescription\n\nMartin et al.'s Tsallis mutual information between variables X in mathbbR^d_X and Y in mathbbR^d_Y is defined as\n\nI_textMartin^T(X Y q) = H_q^T(X) + H_q^T(Y) - (1 - q) H_q^T(X) H_q^T(Y) - H_q(X Y)\n\nwhere H^S(cdot) and H^S(cdot cdot) are the marginal and joint Shannon entropies, and q is the Tsallis-parameter.\n\nEstimation\n\nExample 1: JointProbabilities with UniqueElements outcome space.\nExample 2: EntropyDecomposition with LeonenkoProzantoSavani estimator.\nExample 3: EntropyDecomposition with OrdinalPatterns outcome space.\n\n\n\n\n\n","category":"type"},{"location":"associations/#Associations.MIRenyiJizba","page":"Association measures","title":"Associations.MIRenyiJizba","text":"MIRenyiJizba <: <: BivariateInformationMeasure\nMIRenyiJizba(; q = 1.5, base = 2)\n\nThe Rényi mutual information I_q^R_J(X Y) defined in (Jizba et al., 2012).\n\nUsage\n\nUse with association to compute the raw Rényi-Jizba mutual information from input data using of of the estimators listed below.\nUse with independence to perform a formal hypothesis test for pairwise dependence using the Rényi-Jizba mutual information.\n\nCompatible estimators\n\nJointProbabilities.\nEntropyDecomposition.\n\nDefinition\n\nI_q^R_J(X Y) = H_q^R(X) + H_q^R(Y) - H_q^R(X Y)\n\nwhere H_q^R(cdot) is the Rényi entropy.\n\nEstimation\n\nExample 1: JointProbabilities with UniqueElements outcome space.\nExample 2: EntropyDecomposition with LeonenkoProzantoSavani.\nExample 3: EntropyDecomposition with ValueBinning.\n\n\n\n\n\n","category":"type"},{"location":"associations/#Associations.MIRenyiSarbu","page":"Association measures","title":"Associations.MIRenyiSarbu","text":"MIRenyiSarbu <: BivariateInformationMeasure\nMIRenyiSarbu(; base = 2, q = 1.5)\n\nThe discrete Rényi mutual information from Sarbu (2014).\n\nUsage\n\nUse with association to compute the raw Rényi-Sarbu mutual information from input data using of of the estimators listed below.\nUse with independence to perform a formal hypothesis test for pairwise dependence using the Rényi-Sarbu mutual information.\n\nCompatible estimators\n\nJointProbabilities.\n\nDescription\n\nSarbu (2014) defines discrete Rényi mutual information as the Rényi alpha-divergence between the conditional joint probability mass function p(x y) and the product of the conditional marginals, p(x) cdot p(y):\n\nI(X Y)^R_q =\ndfrac1q-1\nlog left(\n sum_x in X y in Y\n dfracp(x y)^qleft( p(x)cdot p(y) right)^q-1\nright)\n\nEstimation\n\nExample 1: JointProbabilities with UniqueElements for categorical data.\nExample 2: JointProbabilities with CosineSimilarityBinning for numerical data.\n\n\n\n\n\n","category":"type"},{"location":"associations/#Conditional-mutual-informations","page":"Association measures","title":"Conditional mutual informations","text":"","category":"section"},{"location":"associations/","page":"Association measures","title":"Association measures","text":"ConditionalMutualInformation\nCMIShannon\nCMIRenyiSarbu\nCMIRenyiJizba\nCMIRenyiPoczos\nCMITsallisPapapetrou","category":"page"},{"location":"associations/#Associations.ConditionalMutualInformation","page":"Association measures","title":"Associations.ConditionalMutualInformation","text":"CondiitionalMutualInformation\n\nAbstract type for all mutual information measures.\n\nConcrete implementations\n\nCMIShannon\nCMITsallisPapapetrou\nCMIRenyiJizba\nCMIRenyiSarbu\nCMIRenyiPoczos\n\nSee also: ConditionalMutualInformationEstimator\n\n\n\n\n\n","category":"type"},{"location":"associations/#Associations.CMIShannon","page":"Association measures","title":"Associations.CMIShannon","text":"CMIShannon <: ConditionalMutualInformation\nCMIShannon(; base = 2)\n\nThe Shannon conditional mutual information (CMI) I^S(X Y Z).\n\nUsage\n\nUse with association to compute the raw Shannon conditional mutual information using of of the estimators listed below.\nUse with independence to perform a formal hypothesis test for pairwise conditional independence using the Shannon conditional mutual information.\n\nCompatible estimators\n\nJointProbabilities\nEntropyDecomposition\nMIDecomposition\nFPVP\nMesnerShalizi\nRahimzamani\nPoczosSchneiderCMI\nGaussianCMI\n\nSupported definitions\n\nConsider random variables X in mathbbR^d_X and Y in mathbbR^d_Y, given Z in mathbbR^d_Z. The Shannon conditional mutual information is defined as\n\nbeginalign*\nI(X Y Z)\n= H^S(X Z) + H^S(Y z) - H^S(X Y Z) - H^S(Z) \n= I^S(X Y Z) + I^S(X Y)\nendalign*\n\nwhere I^S(cdot cdot) is the Shannon mutual information MIShannon, and H^S(cdot) is the Shannon entropy.\n\nDifferential Shannon CMI is obtained by replacing the entropies by differential entropies.\n\nEstimation\n\nExample 1: EntropyDecomposition with Kraskov estimator.\nExample 2: EntropyDecomposition with ValueBinning estimator.\nExample 3: MIDecomposition with KraskovStögbauerGrassberger1 estimator.\n\n\n\n\n\n","category":"type"},{"location":"associations/#Associations.CMIRenyiSarbu","page":"Association measures","title":"Associations.CMIRenyiSarbu","text":"CMIRenyiSarbu <: ConditionalMutualInformation\nCMIRenyiSarbu(; base = 2, q = 1.5)\n\nThe Rényi conditional mutual information from Sarbu (2014).\n\nUsage\n\nUse with association to compute the raw Rényi-Sarbu conditional mutual information using of of the estimators listed below.\nUse with independence to perform a formal hypothesis test for pairwise conditional independence using the Rényi-Sarbu conditional mutual information.\n\nCompatible estimators\n\nJointProbabilities\n\nDiscrete description\n\nAssume we observe three discrete random variables X, Y and Z. Sarbu (2014) defines discrete conditional Rényi mutual information as the conditional Rényi alpha-divergence between the conditional joint probability mass function p(x y z) and the product of the conditional marginals, p(x z) cdot p(yz):\n\nI(X Y Z)^R_q =\ndfrac1q-1 sum_z in Z p(Z = z)\nlog left(\n sum_x in Xsum_y in Y\n dfracp(x yz)^qleft( p(xz)cdot p(yz) right)^q-1\nright)\n\n\n\n\n\n","category":"type"},{"location":"associations/#Associations.CMIRenyiJizba","page":"Association measures","title":"Associations.CMIRenyiJizba","text":"CMIRenyiJizba <: ConditionalMutualInformation\nCMIRenyiJizba(; base = 2, q = 1.5)\n\nThe Rényi conditional mutual information I_q^R_J(X Y Z) defined in Jizba et al. (2012).\n\nUsage\n\nUse with association to compute the raw Rényi-Jizba conditional mutual information using of of the estimators listed below.\nUse with independence to perform a formal hypothesis test for pairwise conditional independence using the Rényi-Jizba conditional mutual information.\n\nCompatible estimators\n\nJointProbabilities\nEntropyDecomposition\n\nDefinition\n\nI_q^R_J(X Y Z) = I_q^R_J(X Y Z) - I_q^R_J(X Z)\n\nwhere I_q^R_J(X Z) is the MIRenyiJizba mutual information.\n\nEstimation\n\nExample 1: JointProbabilities with BubbleSortSwaps outcome space.\nExample 2: EntropyDecomposition with OrdinalPatterns outcome space.\nExample 3: EntropyDecomposition with differential entropy estimator LeonenkoProzantoSavani.\n\n\n\n\n\n","category":"type"},{"location":"associations/#Associations.CMIRenyiPoczos","page":"Association measures","title":"Associations.CMIRenyiPoczos","text":"CMIRenyiPoczos <: ConditionalMutualInformation\nCMIRenyiPoczos(; base = 2, q = 1.5)\n\nThe differential Rényi conditional mutual information I_q^R_P(X Y Z) defined in Póczos and Schneider (2012).\n\nUsage\n\nUse with association to compute the raw Rényi-Poczos conditional mutual information using of of the estimators listed below.\nUse with independence to perform a formal hypothesis test for pairwise conditional independence using the Rényi-Poczos conditional mutual information.\n\nCompatible estimators\n\nPoczosSchneiderCMI\n\nDefinition\n\nbeginalign*\nI_q^R_P(X Y Z) = dfrac1q-1\nint int int dfracp_Z(z) p_X Y Z^q( p_XZ(xz) p_YZ(yz) )^q-1 \n= mathbbE_X Y Z sim p_X Y Z\nleft dfracp_X Z^1-q(X Z) p_Y Z^1-q(Y Z) p_X Y Z^1-q(X Y Z) p_Z^1-q(Z) right\nendalign*\n\nEstimation\n\nExample 1: Dedicated PoczosSchneiderCMI estimator.\n\n\n\n\n\n","category":"type"},{"location":"associations/#Associations.CMITsallisPapapetrou","page":"Association measures","title":"Associations.CMITsallisPapapetrou","text":"CMITsallisPapapetrou <: ConditionalMutualInformation\nCMITsallisPapapetrou(; base = 2, q = 1.5)\n\nThe Tsallis-Papapetrou conditional mutual information (Papapetrou and Kugiumtzis, 2020).\n\nUsage\n\nUse with association to compute the raw Tsallis-Papapetrou conditional mutual information using of of the estimators listed below.\nUse with independence to perform a formal hypothesis test for pairwise conditional independence using the Tsallis-Papapetrou conditional mutual information.\n\nCompatible estimators\n\nJointProbabilities\n\nDefinition\n\nTsallis-Papapetrou conditional mutual information is defined as \n\nI_T^q(X Y mid Z) = frac11 - q left( 1 - sum_XYZ fracp(x y z)^qp(x mid z)^q-1 p(y mid z)^q-1 p(z)^q-1 right)\n\n\n\n\n\n","category":"type"},{"location":"associations/#Transfer-entropy","page":"Association measures","title":"Transfer entropy","text":"","category":"section"},{"location":"associations/","page":"Association measures","title":"Association measures","text":"TransferEntropy\nTEShannon\nTERenyiJizba","category":"page"},{"location":"associations/#Associations.TransferEntropy","page":"Association measures","title":"Associations.TransferEntropy","text":"TransferEntropy <: AssociationMeasure\n\nThe supertype of all transfer entropy measures. Concrete subtypes are\n\nTEShannon\nTERenyiJizba\n\n\n\n\n\n","category":"type"},{"location":"associations/#Associations.TEShannon","page":"Association measures","title":"Associations.TEShannon","text":"TEShannon <: TransferEntropy\nTEShannon(; base = 2; embedding = EmbeddingTE()) <: TransferEntropy\n\nThe Shannon-type transfer entropy measure.\n\nUsage\n\nUse with association to compute the raw transfer entropy.\nUse with an IndependenceTest to perform a formal hypothesis test for pairwise and conditional dependence.\n\nDescription\n\nThe transfer entropy from source S to target T, potentially conditioned on C is defined as\n\nbeginalign*\nTE(S to T) = I^S(T^+ S^- T^-) \nTE(S to T C) = I^S(T^+ S^- T^- C^-)\nendalign*\n\nwhere I(T^+ S^- T^-) is the Shannon conditional mutual information (CMIShannon). The - and + subscripts on the marginal variables T^+, T^-, S^- and C^- indicate that the embedding vectors for that marginal are constructed using present/past values and future values, respectively.\n\nEstimation\n\nExample 1: EntropyDecomposition with TransferOperator outcome space.\nExample 2: Estimation using the SymbolicTransferEntropy estimator.\n\n\n\n\n\n","category":"type"},{"location":"associations/#Associations.TERenyiJizba","page":"Association measures","title":"Associations.TERenyiJizba","text":"TERenyiJizba() <: TransferEntropy\n\nThe Rényi transfer entropy from Jizba et al. (2012).\n\nUsage\n\nUse with association to compute the raw transfer entropy.\nUse with an IndependenceTest to perform a formal hypothesis test for pairwise and conditional dependence.\n\nDescription\n\nThe transfer entropy from source S to target T, potentially conditioned on C is defined as\n\nbeginalign*\nTE(S to T) = I_q^R_J(T^+ S^- T^-) \nTE(S to T C) = I_q^R_J(T^+ S^- T^- C^-)\nendalign*\n\nwhere I_q^R_J(T^+ S^- T^-) is Jizba et al. (2012)'s definition of conditional mutual information (CMIRenyiJizba). The - and + subscripts on the marginal variables T^+, T^-, S^- and C^- indicate that the embedding vectors for that marginal are constructed using present/past values and future values, respectively.\n\nEstimation\n\nEstimating Jizba's Rényi transfer entropy is a bit complicated, since it doesn't have a dedicated estimator. Instead, we re-write the Rényi transfer entropy as a Rényi conditional mutual information, and estimate it using an EntropyDecomposition with a suitable discrete/differential Rényi entropy estimator from the list below as its input.\n\nEstimator Sub-estimator Principle\nEntropyDecomposition LeonenkoProzantoSavani Four-entropies decomposition\nEntropyDecomposition ValueBinning Four-entropies decomposition\nEntropyDecomposition Dispersion Four-entropies decomposition\nEntropyDecomposition OrdinalPatterns Four-entropies decomposition\nEntropyDecomposition UniqueElements Four-entropies decomposition\nEntropyDecomposition TransferOperator Four-entropies decomposition\n\nAny of these estimators must be given as input to a `CMIDecomposition estimator.\n\nEstimation\n\nExample 1: EntropyDecomposition with TransferOperator outcome space.\n\n\n\n\n\n","category":"type"},{"location":"associations/","page":"Association measures","title":"Association measures","text":"The following utility functions and types are also useful for transfer entropy estimation.","category":"page"},{"location":"associations/","page":"Association measures","title":"Association measures","text":"optimize_marginals_te\nEmbeddingTE","category":"page"},{"location":"associations/#Associations.optimize_marginals_te","page":"Association measures","title":"Associations.optimize_marginals_te","text":"optimize_marginals_te([scheme = OptimiseTraditional()], s, t, [c]) → EmbeddingTE\n\nOptimize marginal embeddings for transfer entropy computation from source time series s to target time series t, conditioned on c if c is given, using the provided optimization scheme.\n\n\n\n\n\n","category":"function"},{"location":"associations/#Associations.EmbeddingTE","page":"Association measures","title":"Associations.EmbeddingTE","text":"EmbeddingTE(; dS = 1, dT = 1, dTf = 1, dC = 1, τS = -1, τT = -1, ηTf = 1, τC = -1)\nEmbeddingTE(opt::OptimiseTraditional, s, t, [c])\n\nEmbeddingTE provide embedding parameters for transfer entropy analysis using either TEShannon, TERenyiJizba, or in general any subtype of TransferEntropy.\n\nThe second method finds parameters using the \"traditional\" optimised embedding techniques from DynamicalSystems.jl\n\nConvention for generalized delay reconstruction\n\nWe use the following convention. Let s(i) be time series for the source variable, t(i) be the time series for the target variable and c(i) the time series for the conditional variable. To compute transfer entropy, we need the following marginals:\n\nbeginaligned\nT^+ = t(i+eta^1) t(i+eta^2) ldots (t(i+eta^d_T^+) \nT^- = (t(i+tau^0_T) t(i+tau^1_T) t(i+tau^2_T) ldots t(t + tau^d_T - 1_T)) \nS^- = (s(i+tau^0_S) s(i+tau^1_S) s(i+tau^2_S) ldots s(t + tau^d_S - 1_S)) \nC^- = (c(i+tau^0_C) c(i+tau^1_C) c(i+tau^2_C) ldots c(t + tau^d_C - 1_C)) \nendaligned\n\nDepending on the application, the delay reconstruction lags tau^k_T leq 0, tau^k_S leq 0, and tau^k_C leq 0 may be equally spaced, or non-equally spaced. The same applied to the prediction lag(s), but typically only a only a single predictions lag eta^k is used (so that d_T^+ = 1).\n\nFor transfer entropy, traditionally at least one tau^k_T, one tau^k_S and one tau^k_C equals zero. This way, the T^-, S^- and C^- marginals always contains present/past states, while the mathcal T marginal contain future states relative to the other marginals. However, this is not a strict requirement, and modern approaches that searches for optimal embeddings can return embeddings without the intantaneous lag.\n\nCombined, we get the generalized delay reconstruction mathbbE = (T^+_(d_T^+) T^-_(d_T) S^-_(d_S) C^-_(d_C)). Transfer entropy is then computed as\n\nbeginaligned\nTE_S rightarrow T C = int_mathbbE P(T^+ T^- S^- C^-)\nlog_bleft(fracP(T^+ T^- S^- C^-)P(T^+ T^- C^-)right)\nendaligned\n\nor, if conditionals are not relevant,\n\nbeginaligned\nTE_S rightarrow T = int_mathbbE P(T^+ T^- S^-)\nlog_bleft(fracP(T^+ T^- S^-)P(T^+ T^-)right)\nendaligned\n\nHere,\n\nT^+ denotes the d_T^+-dimensional set of vectors furnishing the future states of T (almost always equal to 1 in practical applications),\nT^- denotes the d_T-dimensional set of vectors furnishing the past and present states of T,\nS^- denotes the d_S-dimensional set of vectors furnishing the past and present of S, and\nC^- denotes the d_C-dimensional set of vectors furnishing the past and present of C.\n\nKeyword arguments\n\ndS, dT, dC, dTf (f for future) are the dimensions of the S^-, T^-, C^- and T^+ marginals. The parameters dS, dT, dC and dTf must each be a positive integer number.\nτS, τT, τC are the embedding lags for S^-, T^-, C^-. Each parameter are integers ∈ 𝒩⁰⁻, or a vector of integers ∈ 𝒩⁰⁻, so that S^-, T^-, C^- always represents present/past values. If e.g. τT is an integer, then for the T^- marginal is constructed using lags tau_T = 0 tau 2tau ldots (d_T- 1)tau_T . If is a vector, e.g. τΤ = [-1, -5, -7], then the dimension dT must match the lags, and precisely those lags are used: tau_T = -1 -5 -7 .\nThe prediction lag(s) ηTf is a positive integer. Combined with the requirement that the other delay parameters are zero or negative, this ensures that we're always predicting from past/present to future. In typical applications, ηTf = 1 is used for transfer entropy.\n\nExamples\n\nSay we wanted to compute the Shannon transfer entropy TE^S(S to T) = I^S(T^+ S^- T^-). Using some modern procedure for determining optimal embedding parameters using methods from DynamicalSystems.jl, we find that the optimal embedding of T^- is three-dimensional and is given by the lags [0, -5, -8]. Using the same procedure, we find that the optimal embedding of S^- is two-dimensional with lags -1 -8. We want to predicting a univariate version of the target variable one time step into the future (ηTf = 1). The total embedding is then the set of embedding vectors\n\nE_TE = (T(i+1) S(i-1) S(i-8) T(i) T(i-5) T(i-8)) . Translating this to code, we get:\n\nusing Associations\njulia> EmbeddingTE(dT=3, τT=[0, -5, -8], dS=2, τS=[-1, -4], ηTf=1)\n\n# output\nEmbeddingTE(dS=2, dT=3, dC=1, dTf=1, τS=[-1, -4], τT=[0, -5, -8], τC=-1, ηTf=1)\n\n\n\n\n\n","category":"type"},{"location":"associations/#Partial-mutual-information","page":"Association measures","title":"Partial mutual information","text":"","category":"section"},{"location":"associations/","page":"Association measures","title":"Association measures","text":"PartialMutualInformation","category":"page"},{"location":"associations/#Associations.PartialMutualInformation","page":"Association measures","title":"Associations.PartialMutualInformation","text":"PartialMutualInformation <: MultivariateInformationMeasure\nPartialMutualInformation(; base = 2)\n\nThe partial mutual information (PMI) measure of conditional association (Zhao et al., 2016).\n\nDefinition\n\nPMI is defined as for variables X, Y and Z as\n\nPMI(X Y Z) = D(p(x y z) p^*(xz) p^*(yz) p(z))\n\nwhere p(x y z) is the joint distribution for X, Y and Z, and D(cdot cdot) is the extended Kullback-Leibler divergence from p(x y z) to p^*(xz) p^*(yz) p(z). See Zhao et al. (2016) for details.\n\nEstimation\n\nThe PMI is estimated by first estimating a 3D probability mass function using probabilities, then computing PMI(X Y Z) from those probaiblities.\n\nProperties\n\nFor the discrete case, the following identities hold in theory (when estimating PMI, they may not).\n\nPMI(X, Y, Z) >= CMI(X, Y, Z) (where CMI is the Shannon CMI). Holds in theory, but when estimating PMI, the identity may not hold.\nPMI(X, Y, Z) >= 0. Holds both in theory and when estimating using discrete estimators.\nX ⫫ Y | Z => PMI(X, Y, Z) = CMI(X, Y, Z) = 0 (in theory, but not necessarily for estimation).\n\n\n\n\n\n","category":"type"},{"location":"associations/#Short-expansion-of-conditional-mutual-information","page":"Association measures","title":"Short expansion of conditional mutual information","text":"","category":"section"},{"location":"associations/","page":"Association measures","title":"Association measures","text":"ShortExpansionConditionalMutualInformation","category":"page"},{"location":"associations/#Associations.ShortExpansionConditionalMutualInformation","page":"Association measures","title":"Associations.ShortExpansionConditionalMutualInformation","text":"ShortExpansionConditionalMutualInformation <: MultivariateInformationMeasure\nShortExpansionConditionalMutualInformation(; base = 2)\nSECMI(; base = 2) # alias\n\nThe short expansion of (Shannon) conditional mutual information (SECMI) measure from Kubkowski et al. (2021).\n\nDescription\n\nThe SECMI measure is defined as\n\nSECMI(XYZ) = I(XY) + sum_k=1^m II(XZ_kY) = (1 - m) I(XY) + sum_k=1^m I(XYZ_k)\n\nThis quantity is estimated from data using one of the estimators below from the formula\n\nwidehatSECMI(XYZ) = widehatI(XY) + sum_k=1^m widehatII(XZ_kY) = (1 - m) widehatI(XY) + sum_k=1^m widehatI(XYZ_k)\n\nCompatible estimators\n\nJointProbabilities.\n\nEstimation\n\nExample 1: Estimating ShortExpansionConditionalMutualInformation using the JointProbabilities estimator using a CodifyVariables with ValueBinning discretization.\n\n\n\n\n\n","category":"type"},{"location":"associations/#correlation_api","page":"Association measures","title":"Correlation measures","text":"","category":"section"},{"location":"associations/","page":"Association measures","title":"Association measures","text":"CorrelationMeasure\nPearsonCorrelation\nPartialCorrelation\nDistanceCorrelation\nChatterjeeCorrelation\nAzadkiaChatterjeeCoefficient","category":"page"},{"location":"associations/#Associations.CorrelationMeasure","page":"Association measures","title":"Associations.CorrelationMeasure","text":"CorrelationMeasure <: AssociationMeasure end\n\nThe supertype for correlation measures.\n\nConcrete implementations\n\nPearsonCorrelation\nPartialCorrelation\nDistanceCorrelation\nChatterjeeCorrelation\nAzadkiaChatterjeeCoefficient\n\n\n\n\n\n","category":"type"},{"location":"associations/#Associations.PearsonCorrelation","page":"Association measures","title":"Associations.PearsonCorrelation","text":"PearsonCorrelation\n\nThe Pearson correlation of two variables.\n\nUsage\n\nUse with association to compute the raw Pearson correlation coefficient.\nUse with independence to perform a formal hypothesis test for pairwise dependence using the Pearson correlation coefficient.\n\nDescription\n\nThe sample Pearson correlation coefficient for real-valued random variables X and Y with associated samples x_i_i=1^N and y_i_i=1^N is defined as\n\nrho_xy = dfracsum_i=1^n (x_i - barx)(y_i - bary) sqrtsum_i=1^N (x_i - barx)^2sqrtsum_i=1^N (y_i - bary)^2\n\nwhere barx and bary are the means of the observations x_k and y_k, respectively.\n\n\n\n\n\n","category":"type"},{"location":"associations/#Associations.PartialCorrelation","page":"Association measures","title":"Associations.PartialCorrelation","text":"PartialCorrelation <: AssociationMeasure\n\nThe correlation of two variables, with the effect of a set of conditioning variables removed.\n\nUsage\n\nUse with association to compute the raw partial correlation coefficient.\nUse with independence to perform a formal hypothesis test for correlated-based conditional independence.\n\nDescription\n\nThere are several ways of estimating the partial correlation. We follow the matrix inversion method, because for StateSpaceSets, we can very efficiently compute the required joint covariance matrix Sigma for the random variables.\n\nFormally, let X_1 X_2 ldots X_n be a set of n real-valued random variables. Consider the joint precision matrix,P = (p_ij) = Sigma^-1. The partial correlation of any pair of variables (X_i X_j), given the remaining variables bfZ = X_k_i=1 i neq i j^n, is defined as\n\nrho_X_i X_j bfZ = -dfracp_ijsqrt p_ii p_jj \n\nIn practice, we compute the estimate\n\nhatrho_X_i X_j bfZ =\n-dfrachatp_ijsqrt hatp_ii hatp_jj \n\nwhere hatP = hatSigma^-1 is the sample precision matrix.\n\n\n\n\n\n","category":"type"},{"location":"associations/#Associations.DistanceCorrelation","page":"Association measures","title":"Associations.DistanceCorrelation","text":"DistanceCorrelation\n\nThe distance correlation (Székely et al., 2007) measure quantifies potentially nonlinear associations between pairs of variables. If applied to three variables, the partial distance correlation (Székely and Rizzo, 2014) is computed.\n\nUsage\n\nUse with association to compute the raw (partial) distance correlation coefficient.\nUse with independence to perform a formal hypothesis test for pairwise dependence.\n\nDescription\n\nThe distance correlation can be used to compute the association between two variables, or the conditional association between three variables, like so:\n\nassociation(DistanceCorrelation(), x, y) → dcor ∈ [0, 1]\nassociation(DistanceCorrelation(), x, y, z) → pdcor\n\nWith two variable, we comptue dcor, which is called the empirical/sample distance correlation (Székely et al., 2007). With three variables, the partial distance correlation pdcor is computed (Székely and Rizzo, 2014).\n\nwarn: Warn\nA partial distance correlation distance_correlation(X, Y, Z) = 0 doesn't always guarantee conditional independence X ⫫ Y | Z. Székely and Rizzo (2014) for an in-depth discussion.\n\n\n\n\n\n","category":"type"},{"location":"associations/#Associations.ChatterjeeCorrelation","page":"Association measures","title":"Associations.ChatterjeeCorrelation","text":"ChatterjeeCorrelation <: CorrelationMeasure\nChatterjeeCorrelation(; handle_ties = true, rng = Random.default_rng())\n\nThe Chatterjee correlation measure (Chatterjee, 2021) is an asymmetric measure of dependence between two variables. \n\ninfo: Speeding up computations\nIf handle_ties == true, then the first formula below is used. If you know for sure that there are no ties in your data, then set handle_ties == false, which will use the second (faster) formula below.\n\nnote: Randomization and reproducibility\nWhen rearranging the input datasets, the second variable y is sorted according to a sorting of the first variable x. If x has ties, then these ties are broken randomly and uniformly. For complete reproducibility in this step, you can specify rng. If x has no ties, then no randomization is performed.\n\nUsage\n\nUse with association to compute the raw Chatterjee correlation coefficient.\nUse with SurrogateAssociationTest to perform a surrogate test for significance of a Chatterjee-type association (example). When using a surrogate test for significance, the first input variable is shuffled according to the given surrogate method.\n\nDescription\n\nThe correlation statistic is defined as\n\nepsilon_n(X Y) = \n1 - dfracnsum_i=1^n-1 r_i+1 - r_i2sum_i=1^n \n\nWhen there are no ties among the Y_1 Y_2 ldots Y_n, the measure is \n\nepsilon_n(X Y) = \n1 - dfrac3sum_i=1^n-1 r_i+1 - r_in^2 - 1\n\nThis statistic estimates a quantity proposed by Dette et al. (2013), as indicated in Shi et al. (2022). It can therefore also be called the Chatterjee-Dette-Siburg-Stoimenov correlation coefficient.\n\nEstimation\n\nExample 1. Estimating the Chatterjee correlation coefficient for independent and for dependent variables. \nExample 2. Testing the significance of a Chatterjee-type association using a surrogate test.\n\n\n\n\n\n","category":"type"},{"location":"associations/#Associations.AzadkiaChatterjeeCoefficient","page":"Association measures","title":"Associations.AzadkiaChatterjeeCoefficient","text":"AzadkiaChatterjeeCoefficient <: AssociationMeasure\nAzadkiaChatterjeeCoefficient(; theiler::Int = 0)\n\nThe Azadkia-Chatterjee coefficient (Azadkia and Chatterjee, 2021) is a coefficient for pairwise and conditional association inspired by the Chatterjee-Dette-Siburg-Stoimenov coefficient (Chatterjee, 2021; Dette et al., 2013) (see ChatterjeeCorrelation).\n\nUsage\n\nUse with association to compute the raw Azadkia-Chatterjee coefficient.\nUse with SurrogateAssociationTest to perform a surrogate test for significance of a pairwise or conditional Azadkia-Chatterjee-type association (example). When using a surrogate test for significance, only the first input variable is shuffled according to the given surrogate method.\nUse with LocalPermutationTest to perform a test of conditional independence (example).\n\nDescription\n\nThe pairwise statistic is \n\nT_n(Y boldsymbolZ boldsymbolX) = dfracsum_i=1^n left( min(R_i R_M_(i)) - min(R_i R_N_(i)) right) sum_i=1^n left(R_i - min(R_i R_N_(i)) right)\n\nwhere R_i is the rank of the point Y_i among all Y_is, and M_(i) and N_(i) are indices of nearest neighbors of the points boldsymbolX_i and (boldsymbolX_i boldsymbolZ_i), respectively (given appropriately constructed marginal spaces). The theiler keyword argument is an integer controlling the number of nearest neighbors to exclude during neighbor searches. The Theiler window defaults to 0, which excludes self-neighbors, and is the only option considered in Azadkia and Chatterjee (2021).\n\nIn the case where boldsymbolX has no components (i.e. we're not conditioning), we also consider L_i as the number of j such that Y_j geq Y_i. The measure is then defined as \n\nT_n(Y boldsymbolZ) = \ndfracsum_i=1^n left( n min(R_i R_M_(i)) - L_i^2 right) sum_i=1^n left( L_i (n - L_i) right)\n\nThe value of the coefficient is on [0, 1] when the number of samples goes to ∞, but is not restricted to this interval in practice. \n\nInput data\n\nIf the input data contain duplicate points, consider adding a small magnitude of noise to the input data. Otherwise, errors will occur when locating nearest neighbors.\n\nEstimation\n\nExample 1. Estimating the Azadkia-Chatterjee coefficient to quantify associations for a chain of unidirectionally coupled variables, showcasing both pairwise and conditional associations.\nExample 2. Using SurrogateAssociationTest in combination with the Azadkia-Chatterjee coefficient to quantify significance of pairwise and conditional associations.\nExample 3. Using LocalPermutationTest in combination with the Azadkia-Chatterjee coefficient to perform a test for conditional independence.\n\n\n\n\n\n","category":"type"},{"location":"associations/#cross_map_api","page":"Association measures","title":"Cross-map measures","text":"","category":"section"},{"location":"associations/","page":"Association measures","title":"Association measures","text":"The cross-map measures define different ways of quantifying association based on the concept of \"cross mapping\", which has appeared in many contexts in the literature, and gained huge popularity with Sugihara et al. (2012)'s on convergent cross mapping.","category":"page"},{"location":"associations/","page":"Association measures","title":"Association measures","text":"Since their paper, several cross mapping methods and frameworks have emerged in the literature. In Associations.jl, we provide a unified interface for using these cross mapping methods.","category":"page"},{"location":"associations/","page":"Association measures","title":"Association measures","text":"CrossmapMeasure\nConvergentCrossMapping\nPairwiseAsymmetricInference","category":"page"},{"location":"associations/#Associations.CrossmapMeasure","page":"Association measures","title":"Associations.CrossmapMeasure","text":"CrossmapMeasure <: AssociationMeasure\n\nThe supertype for all cross-map measures. Concrete subtypes are\n\nConvergentCrossMapping, or CCM for short.\nPairwiseAsymmetricInference, or PAI for short.\n\nSee also: CrossmapEstimator.\n\n\n\n\n\n","category":"type"},{"location":"associations/#Associations.ConvergentCrossMapping","page":"Association measures","title":"Associations.ConvergentCrossMapping","text":"ConvergentCrossMapping <: CrossmapMeasure\nConvergentCrossMapping(; d::Int = 2, τ::Int = -1, w::Int = 0,\n f = Statistics.cor, embed_warn = true)\n\nThe convergent cross mapping measure (Sugihara et al., 2012).\n\nUsage\n\nUse with association together with a CrossmapEstimator to compute the cross-map correlation between input variables.\n\nCompatible estimators\n\nRandomSegment\nRandomVectors\nExpandingSegment\n\nDescription\n\nThe Theiler window w controls how many temporal neighbors are excluded during neighbor searches (w = 0 means that only the point itself is excluded). f is a function that computes the agreement between observations and predictions (the default, f = Statistics.cor, gives the Pearson correlation coefficient).\n\nEmbedding\n\nLet S(i) be the source time series variable and T(i) be the target time series variable. This version produces regular embeddings with fixed dimension d and embedding lag τ as follows:\n\n( S(i) S(i+tau) S(i+2tau) ldots S(i+(d-1)tau T(i))_i=1^N-(d-1)tau\n\nIn this joint embedding, neighbor searches are performed in the subspace spanned by the first D-1 variables, while the last (D-th) variable is to be predicted.\n\nWith this convention, τ < 0 implies \"past/present values of source used to predict target\", and τ > 0 implies \"future/present values of source used to predict target\". The latter case may not be meaningful for many applications, so by default, a warning will be given if τ > 0 (embed_warn = false turns off warnings).\n\nEstimation\n\nExample 1. Estimation with RandomVectors estimator.\nExample 2. Estimation with RandomSegment estimator.\nExample 3: Reproducing figures from Sugihara et al. (2012).\n\n\n\n\n\n","category":"type"},{"location":"associations/#Associations.PairwiseAsymmetricInference","page":"Association measures","title":"Associations.PairwiseAsymmetricInference","text":"PairwiseAsymmetricInference <: CrossmapMeasure\nPairwiseAsymmetricInference(; d::Int = 2, τ::Int = -1, w::Int = 0,\n f = Statistics.cor, embed_warn = true)\n\nThe pairwise asymmetric inference (PAI) measure (McCracken and Weigel, 2014) is a version of ConvergentCrossMapping that searches for neighbors in mixed embeddings (i.e. both source and target variables included); otherwise, the algorithms are identical.\n\nUsage\n\nUse with association to compute the pairwise asymmetric inference measure between variables.\n\nCompatible estimators\n\nRandomSegment\nRandomVectors\nExpandingSegment\n\nDescription\n\nThe Theiler window w controls how many temporal neighbors are excluded during neighbor searches (w = 0 means that only the point itself is excluded). f is a function that computes the agreement between observations and predictions (the default, f = Statistics.cor, gives the Pearson correlation coefficient).\n\nEmbedding\n\nThere are many possible ways of defining the embedding for PAI. Currently, we only implement the \"add one non-lagged source timeseries to an embedding of the target\" approach, which is used as an example in McCracken & Weigel's paper. Specifically: Let S(i) be the source time series variable and T(i) be the target time series variable. PairwiseAsymmetricInference produces regular embeddings with fixed dimension d and embedding lag τ as follows:\n\n(S(i) T(i+(d-1)tau ldots T(i+2tau) T(i+tau) T(i)))_i=1^N-(d-1)tau\n\nIn this joint embedding, neighbor searches are performed in the subspace spanned by the first D variables, while the last variable is to be predicted.\n\nWith this convention, τ < 0 implies \"past/present values of source used to predict target\", and τ > 0 implies \"future/present values of source used to predict target\". The latter case may not be meaningful for many applications, so by default, a warning will be given if τ > 0 (embed_warn = false turns off warnings).\n\nEstimation\n\nExample 1. Estimation with RandomVectors estimator.\nExample 2. Estimation with RandomSegment estimator.\nExample 3. Reproducing McCracken & Weigel's results from the original paper.\n\n\n\n\n\n","category":"type"},{"location":"associations/#closeness_api","page":"Association measures","title":"Closeness measures","text":"","category":"section"},{"location":"associations/","page":"Association measures","title":"Association measures","text":"ClosenessMeasure\nJointDistanceDistribution\nSMeasure\nHMeasure\nMMeasure\nLMeasure","category":"page"},{"location":"associations/#Associations.ClosenessMeasure","page":"Association measures","title":"Associations.ClosenessMeasure","text":"ClosenessMeasure <: AssociationMeasure\n\nThe supertype for all multivariate information-based measure definitions.\n\nImplementations\n\nJointDistanceDistribution\nSMeasure\nHMeasure\nMMeasure\nLMeasure\n\n\n\n\n\n","category":"type"},{"location":"associations/#Associations.JointDistanceDistribution","page":"Association measures","title":"Associations.JointDistanceDistribution","text":"JointDistanceDistribution <: AssociationMeasure end\nJointDistanceDistribution(; metric = Euclidean(), B = 10, D = 2, τ = -1, μ = 0.0)\n\nThe joint distance distribution (JDD) measure (Amigó and Hirata, 2018).\n\nUsage\n\nUse with association to compute the joint distance distribution measure Δ from Amigó and Hirata (2018).\nUse with independence to perform a formal hypothesis test for directional dependence.\n\nKeyword arguments\n\ndistance_metric::Metric: An instance of a valid distance metric from Distances.jl. Defaults to Euclidean().\nB::Int: The number of equidistant subintervals to divide the interval [0, 1] into when comparing the normalised distances.\nD::Int: Embedding dimension.\nτ::Int: Embedding delay. By convention, τ is negative.\nμ: The hypothetical mean value of the joint distance distribution if there is no coupling between x and y (default is μ = 0.0).\n\nDescription\n\nFrom input time series x(t) and y(t), we first construct the delay embeddings (note the positive sign in the embedding lags; therefore the input parameter τ is by convention negative).\n\nbeginalign*\nbfx_i = (x_i x_i+tau ldots x_i+(d_x - 1)tau) \nbfy_i = (y_i y_i+tau ldots y_i+(d_y - 1)tau) \nendalign*\n\nThe algorithm then proceeds to analyze the distribution of distances between points of these embeddings, as described in Amigó and Hirata (2018).\n\nExamples\n\nIndependence testing using JDD\n\n\n\n\n\n","category":"type"},{"location":"associations/#Associations.SMeasure","page":"Association measures","title":"Associations.SMeasure","text":"SMeasure < ClosenessMeasure\nSMeasure(; K::Int = 2, dx = 2, dy = 2, τx = - 1, τy = -1, w = 0)\n\nSMeasure is a bivariate association measure from Arnhold et al. (1999) and Quiroga et al. (2000) that measure directional dependence between two input (potentially multivariate) time series.\n\nNote that τx and τy are negative; see explanation below.\n\nUsage\n\nUse with association to compute the raw s-measure statistic.\nUse with independence to perform a formal hypothesis test for directional dependence.\n\nDescription\n\nThe steps of the algorithm are:\n\nFrom input time series x(t) and y(t), construct the delay embeddings (note the positive sign in the embedding lags; therefore inputs parameters τx and τy are by convention negative).\n\nbeginalign*\nbfx_i = (x_i x_i+tau_x ldots x_i+(d_x - 1)tau_x) \nbfy_i = (y_i y_i+tau_y ldots y_i+(d_y - 1)tau_y) \nendalign*\n\nLet r_ij and s_ij be the indices of the K-th nearest neighbors of bfx_i and bfy_i, respectively. Neighbors closed than w time indices are excluded during searches (i.e. w is the Theiler window).\nCompute the the mean squared Euclidean distance to the K nearest neighbors for each x_i, using the indices r_i j.\n\nR_i^(k)(x) = dfrac1k sum_i=1^k(bfx_i bfx_r_ij)^2\n\nCompute the y-conditioned mean squared Euclidean distance to the K nearest neighbors for each x_i, now using the indices s_ij.\n\nR_i^(k)(xy) = dfrac1k sum_i=1^k(bfx_i bfx_s_ij)^2\n\nDefine the following measure of independence, where 0 leq S leq 1, and low values indicate independence and values close to one occur for synchronized signals.\n\nS^(k)(xy) = dfrac1N sum_i=1^N dfracR_i^(k)(x)R_i^(k)(xy)\n\nInput data\n\nThe algorithm is slightly modified from (Arnhold et al., 1999) to allow univariate timeseries as input.\n\nIf x and y are StateSpaceSets then use x and y as is and ignore the parameters dx/τx and dy/τy.\nIf x and y are scalar time series, then create dx and dy dimensional embeddings, respectively, of both x and y, resulting in N different m-dimensional embedding points X = x_1 x_2 ldots x_N and Y = y_1 y_2 ldots y_N . τx and τy control the embedding lags for x and y.\nIf x is a scalar-valued vector and y is a StateSpaceSet, or vice versa, then create an embedding of the scalar timeseries using parameters dx/τx or dy/τy.\n\nIn all three cases, input StateSpaceSets are length-matched by eliminating points at the end of the longest StateSpaceSet (after the embedding step, if relevant) before analysis.\n\nSee also: ClosenessMeasure.\n\n\n\n\n\n","category":"type"},{"location":"associations/#Associations.HMeasure","page":"Association measures","title":"Associations.HMeasure","text":"HMeasure <: AssociationMeasure\nHMeasure(; K::Int = 2, dx = 2, dy = 2, τx = - 1, τy = -1, w = 0)\n\nThe HMeasure (Arnhold et al., 1999) is a pairwise association measure. It quantifies the probability with which close state of a target timeseries/embedding are mapped to close states of a source timeseries/embedding.\n\nNote that τx and τy are negative by convention. See docstring for SMeasure for an explanation.\n\nUsage\n\nUse with association to compute the raw h-measure statistic.\nUse with independence to perform a formal hypothesis test for directional dependence.\n\nDescription\n\nThe HMeasure (Arnhold et al., 1999) is similar to the SMeasure, but the numerator of the formula is replaced by R_i(x), the mean squared Euclidean distance to all other points, and there is a log-term inside the sum:\n\nH^(k)(xy) = dfrac1N sum_i=1^N\nlog left( dfracR_i(x)R_i^(k)(xy) right)\n\nParameters are the same and R_i^(k)(xy) is computed as for SMeasure.\n\nSee also: ClosenessMeasure.\n\n\n\n\n\n","category":"type"},{"location":"associations/#Associations.MMeasure","page":"Association measures","title":"Associations.MMeasure","text":"MMeasure <: ClosenessMeasure\nMMeasure(; K::Int = 2, dx = 2, dy = 2, τx = - 1, τy = -1, w = 0)\n\nThe MMeasure (Andrzejak et al., 2003) is a pairwise association measure. It quantifies the probability with which close state of a target timeseries/embedding are mapped to close states of a source timeseries/embedding.\n\nNote that τx and τy are negative by convention. See docstring for SMeasure for an explanation.\n\nUsage\n\nUse with association to compute the raw m-measure statistic.\nUse with independence to perform a formal hypothesis test for directional dependence.\n\nDescription\n\nThe MMeasure is based on SMeasure and HMeasure. It is given by\n\nM^(k)(xy) = dfrac1N sum_i=1^N\nlog left( dfracR_i(x) - R_i^(k)(xy)R_i(x) - R_i^k(x) right)\n\nwhere R_i(x) is computed as for HMeasure, while R_i^k(x) and R_i^(k)(xy) is computed as for SMeasure. Parameters also have the same meaning as for SMeasure/HMeasure.\n\nSee also: ClosenessMeasure.\n\n\n\n\n\n","category":"type"},{"location":"associations/#Associations.LMeasure","page":"Association measures","title":"Associations.LMeasure","text":"LMeasure <: ClosenessMeasure\nLMeasure(; K::Int = 2, dx = 2, dy = 2, τx = - 1, τy = -1, w = 0)\n\nThe LMeasure (Chicharro and Andrzejak, 2009) is a pairwise association measure. It quantifies the probability with which close state of a target timeseries/embedding are mapped to close states of a source timeseries/embedding.\n\nNote that τx and τy are negative by convention. See docstring for SMeasure for an explanation.\n\nUsage\n\nUse with association to compute the raw L-measure statistic.\nUse with independence to perform a formal hypothesis test for directional dependence.\n\nDescription\n\nLMeasure is similar to MMeasure, but uses distance ranks instead of the raw distances.\n\nLet bfx_i be an embedding vector, and let g_ij denote the rank that the distance between bfx_i and some other vector bfx_j in a sorted ascending list of distances between bfx_i and bfx_i neq j In other words, g_ij this is just the N-1 nearest neighbor distances sorted )\n\nLMeasure is then defined as\n\nL^(k)(xy) = dfrac1N sum_i=1^N\nlog left( dfracG_i(x) - G_i^(k)(xy)G_i(x) - G_i^k(x) right)\n\nwhere G_i(x) = fracN2 and G_i^K(x) = frack+12 are the mean and minimal rank, respectively.\n\nThe y-conditioned mean rank is defined as\n\nG_i^(k)(xy) = dfrac1Ksum_j=1^K g_iw_i j\n\nwhere w_ij is the index of the j-th nearest neighbor of bfy_i.\n\nSee also: ClosenessMeasure.\n\n\n\n\n\n","category":"type"},{"location":"associations/#Recurrence-measures","page":"Association measures","title":"Recurrence measures","text":"","category":"section"},{"location":"associations/","page":"Association measures","title":"Association measures","text":"MCR\nRMCD","category":"page"},{"location":"associations/#Associations.MCR","page":"Association measures","title":"Associations.MCR","text":"MCR <: AssociationMeasure\nMCR(; r, metric = Euclidean())\n\nAn association measure based on mean conditional probabilities of recurrence (MCR) introduced by Romano et al. (2007).\n\nUsage\n\nUse with association to compute the raw MCR for pairwise or conditional association.\nUse with IndependenceTest to perform a formal hypothesis test for pairwise or conditional association.\n\nDescription\n\nr is mandatory keyword which specifies the recurrence threshold when constructing recurrence matrices. It can be instance of any subtype of AbstractRecurrenceType from RecurrenceAnalysis.jl. To use any r that is not a real number, you have to do using RecurrenceAnalysis first. The metric is any valid metric from Distances.jl.\n\nFor input variables X and Y, the conditional probability of recurrence is defined as\n\nM(X Y) = dfrac1N sum_i=1^N p(bfy_i bfx_i) =\ndfrac1N sum_i=1^N dfracsum_i=1^N J_R_i j^X Ysum_i=1^N R_i j^X\n\nwhere R_i j^X is the recurrence matrix and J_R_i j^X Y is the joint recurrence matrix, constructed using the given metric. The measure M(Y X) is defined analogously.\n\nRomano et al. (2007)'s interpretation of this quantity is that if X drives Y, then M(X|Y) > M(Y|X), if Y drives X, then M(Y|X) > M(X|Y), and if coupling is symmetric, then M(Y|X) = M(X|Y).\n\nInput data\n\nX and Y can be either both univariate timeseries, or both multivariate StateSpaceSets.\n\nEstimation\n\nExample 1. Pairwise versus conditional MCR.\n\n\n\n\n\n","category":"type"},{"location":"associations/#Associations.RMCD","page":"Association measures","title":"Associations.RMCD","text":"RMCD <: AssociationMeasure\nRMCD(; r, metric = Euclidean(), base = 2)\n\nThe recurrence measure of conditional dependence, or RMCD (Ramos et al., 2017), is a recurrence-based measure that mimics the conditional mutual information, but uses recurrence probabilities.\n\nUsage\n\nUse with association to compute the raw RMCD for pairwise or conditional association.\nUse with IndependenceTest to perform a formal hypothesis test for pairwise or conditional association.\n\nDescription\n\nr is a mandatory keyword which specifies the recurrence threshold when constructing recurrence matrices. It can be instance of any subtype of AbstractRecurrenceType from RecurrenceAnalysis.jl. To use any r that is not a real number, you have to do using RecurrenceAnalysis first. The metric is any valid metric from Distances.jl.\n\nBoth the pairwise and conditional RMCD is non-negative, but due to round-off error, negative values may occur. If that happens, an RMCD value of 0.0 is returned.\n\nDescription\n\nThe RMCD measure is defined by\n\nI_RMCD(X Y Z) = dfrac1N\nsum_i left\ndfrac1N sum_j R_ij^X Y Z\nlog left(\n dfracsum_j R_ij^X Y Z sum_j R_ij^Z sum_j sum_j R_ij^X Z sum_j sum_j R_ij^Y Z\n right)\nright\n\nwhere base controls the base of the logarithm. I_RMCD(X Y Z) is zero when Z = X, Z = Y or when X, Y and Z are mutually independent.\n\nOur implementation allows dropping the third/last argument, in which case the following mutual information-like quantitity is computed (not discussed in Ramos et al. (2017).\n\nI_RMCD(X Y) = dfrac1N\nsum_i left\ndfrac1N sum_j R_ij^X Y\nlog left(\n dfracsum_j R_ij^X R_ij^Y sum_j R_ij^X Y\n right)\nright\n\nEstimation\n\nExample 1. Pairwise versus conditional RMCD.\n\n\n\n\n\n","category":"type"},{"location":"api/counts_and_probabilities_api/","page":"Multivariate counts and probabilities API","title":"Multivariate counts and probabilities API","text":"CollapsedDocStrings = true","category":"page"},{"location":"api/counts_and_probabilities_api/#counts_and_probabilities_api","page":"Multivariate counts and probabilities API","title":"Multivariate counts and probabilities API","text":"","category":"section"},{"location":"api/counts_and_probabilities_api/","page":"Multivariate counts and probabilities API","title":"Multivariate counts and probabilities API","text":"For counting and probabilities, Associations.jl extends the single-variable machinery in ComplexityMeasures.jl to multiple variables.","category":"page"},{"location":"api/counts_and_probabilities_api/","page":"Multivariate counts and probabilities API","title":"Multivariate counts and probabilities API","text":"Associations.Counts\nAssociations.counts(::OutcomeSpace)","category":"page"},{"location":"api/counts_and_probabilities_api/#ComplexityMeasures.Counts","page":"Multivariate counts and probabilities API","title":"ComplexityMeasures.Counts","text":"Counts <: Array{<:Integer, N}\nCounts(counts [, outcomes [, dimlabels]]) → c\n\nCounts stores an N-dimensional array of integer counts corresponding to a set of outcomes. This is typically called a \"frequency table\" or \"contingency table\".\n\nIf c isa Counts, then c.outcomes[i] is an abstract vector containing the outcomes along the i-th dimension, where c[i][j] is the count corresponding to the outcome c.outcomes[i][j], and c.dimlabels[i] is the label of the i-th dimension. Both labels and outcomes are assigned automatically if not given. c itself can be manipulated and iterated over like its stored array.\n\n\n\n\n\n","category":"type"},{"location":"api/counts_and_probabilities_api/#ComplexityMeasures.counts-Tuple{OutcomeSpace}","page":"Multivariate counts and probabilities API","title":"ComplexityMeasures.counts","text":"counts(o::UniqueElements, x₁, x₂, ..., xₙ) → Counts{N}\ncounts(encoding::CodifyPoints, x₁, x₂, ..., xₙ) → Counts{N}\ncounts(encoding::CodifyVariables, x₁, x₂, ..., xₙ) → Counts{N}\n\nConstruct an N-dimensional contingency table from the input iterables x₁, x₂, ..., xₙ which are such that length(x₁) == length(x₂) == ⋯ == length(xₙ).\n\nIf x₁, x₂, ..., xₙ are already discrete, then use UniqueElements as the first argument to directly construct the joint contingency table.\n\nIf x₁, x₂, ..., xₙ need to be discretized, provide as the first argument\n\nCodifyPoints (encodes every point in each of the input variables xᵢs individually)\nCodifyVariables (encodes every xᵢ individually using a sliding window encoding). NB: If using different OutcomeSpaces for the different xᵢ, then total_outcomes must be the same for every outcome space.\n\nExamples\n\n# Discretizing some non-discrete data using a sliding-window encoding for each variable\nx, y = rand(100), rand(100)\nc = CodifyVariables(OrdinalPatterns(m = 4))\ncounts(c, x, y)\n\n# Discretizing the data by binning each individual data point\nbinning = RectangularBinning(3)\nencoding = RectangularBinEncoding(binning, [x; y]) # give input values to ensure binning covers all data\nc = CodifyPoints(encoding)\ncounts(c, x, y)\n\n# Counts table for already discrete data\nn = 50 # all variables must have the same number of elements\nx = rand([\"dog\", \"cat\", \"mouse\"], n)\ny = rand(1:3, n)\nz = rand([(1, 2), (2, 1)], n)\n\ncounts(UniqueElements(), x, y, z)\n\nSee also: CodifyPoints, CodifyVariables, UniqueElements, OutcomeSpace, probabilities.\n\n\n\n\n\n","category":"method"},{"location":"api/counts_and_probabilities_api/","page":"Multivariate counts and probabilities API","title":"Multivariate counts and probabilities API","text":"Associations.Probabilities\nAssociations.probabilities(::OutcomeSpace)","category":"page"},{"location":"api/counts_and_probabilities_api/#ComplexityMeasures.Probabilities","page":"Multivariate counts and probabilities API","title":"ComplexityMeasures.Probabilities","text":"Probabilities <: Array{<:AbstractFloat, N}\nProbabilities(probs::Array [, outcomes [, dimlabels]]) → p\nProbabilities(counts::Counts [, outcomes [, dimlabels]]) → p\n\nProbabilities stores an N-dimensional array of probabilities, while ensuring that the array sums to 1 (normalized probability mass). In most cases the array is a standard vector. p itself can be manipulated and iterated over, just like its stored array.\n\nThe probabilities correspond to outcomes that describe the axes of the array. If p isa Probabilities, then p.outcomes[i] is an an abstract vector containing the outcomes along the i-th dimension. The outcomes have the same ordering as the probabilities, so that p[i][j] is the probability for outcome p.outcomes[i][j]. The dimensions of the array are named, and can be accessed by p.dimlabels, where p.dimlabels[i] is the label of the i-th dimension. Both outcomes and dimlabels are assigned automatically if not given. If the input is a set of Counts, and outcomes and dimlabels are not given, then the labels and outcomes are inherited from the counts.\n\nExamples\n\njulia> probs = [0.2, 0.2, 0.2, 0.2]; Probabilities(probs) # will be normalized to sum to 1\n Probabilities{Float64,1} over 4 outcomes\n Outcome(1) 0.25\n Outcome(2) 0.25\n Outcome(3) 0.25\n Outcome(4) 0.25\n\njulia> c = Counts([12, 16, 12], [\"out1\", \"out2\", \"out3\"]); Probabilities(c)\n Probabilities{Float64,1} over 3 outcomes\n \"out1\" 0.3\n \"out2\" 0.4\n \"out3\" 0.3\n\n\n\n\n\n","category":"type"},{"location":"api/counts_and_probabilities_api/#ComplexityMeasures.probabilities-Tuple{OutcomeSpace}","page":"Multivariate counts and probabilities API","title":"ComplexityMeasures.probabilities","text":"probabilities(o::UniqueElements, x₁, x₂, ..., xₙ) → Counts{N}\nprobabilities(encoding::CodifyPoints, x₁, x₂, ..., xₙ) → Counts{N}\nprobabilities(encoding::CodifyVariables, x₁, x₂, ..., xₙ) → Counts{N}\n\nConstruct an N-dimensional Probabilities array from the input iterables x₁, x₂, ..., xₙ which are such that length(x₁) == length(x₂) == ⋯ == length(xₙ).\n\nDescription\n\nProbabilities are computed by first constructing a joint contingency matrix in the form of a Counts instance. \n\nIf x₁, x₂, ..., xₙ are already discrete, then use UniqueElements as the first argument to directly construct the joint contingency table.\n\nIf x₁, x₂, ..., xₙ need to be discretized, provide as the first argument\n\nCodifyPoints (encodes every point in each of the input variables xᵢs individually)\nCodifyVariables (encodes every xᵢ individually using a sliding window encoding).\n\nExamples\n\n# Discretizing some non-discrete data using a sliding-window encoding for each variable\nx, y = rand(100), rand(100)\nc = CodifyVariables(OrdinalPatterns(m = 4))\nprobabilities(c, x, y)\n\n# Discretizing the data by binning each individual data point\nbinning = RectangularBinning(3)\nencoding = RectangularBinEncoding(binning, [x; y]) # give input values to ensure binning covers all data\nc = CodifyPoints(encoding)\nprobabilities(c, x, y)\n\n# Joint probabilities for already discretized data\nn = 50 # all variables must have the same number of elements\nx = rand([\"dog\", \"cat\", \"mouse\"], n)\ny = rand(1:3, n)\nz = rand([(1, 2), (2, 1)], n)\n\nprobabilities(UniqueElements(), x, y, z)\n\nSee also: CodifyPoints, CodifyVariables, UniqueElements, OutcomeSpace.\n\n\n\n\n\n","category":"method"},{"location":"api/counts_and_probabilities_api/","page":"Multivariate counts and probabilities API","title":"Multivariate counts and probabilities API","text":"The utility function marginal is also useful.","category":"page"},{"location":"api/counts_and_probabilities_api/","page":"Multivariate counts and probabilities API","title":"Multivariate counts and probabilities API","text":"marginal","category":"page"},{"location":"api/counts_and_probabilities_api/#Associations.marginal","page":"Multivariate counts and probabilities API","title":"Associations.marginal","text":"marginal(p::Probabilities; dims = 1:ndims(p))\nmarginal(c::Counts; dims = 1:ndims(p))\n\nGiven a set of counts c (a contingency table), or a multivariate probability mass function p, return the marginal counts/probabilities along the given dims.\n\n\n\n\n\n","category":"function"},{"location":"api/counts_and_probabilities_api/#tutorial_probabilities","page":"Multivariate counts and probabilities API","title":"Example: estimating Counts and Probabilities","text":"","category":"section"},{"location":"api/counts_and_probabilities_api/","page":"Multivariate counts and probabilities API","title":"Multivariate counts and probabilities API","text":"Estimating multivariate counts (contingency matrices) and PMFs is simple. If the data are pre-discretized, then we can use UniqueElements to simply count the number of occurrences.","category":"page"},{"location":"api/counts_and_probabilities_api/","page":"Multivariate counts and probabilities API","title":"Multivariate counts and probabilities API","text":"using Associations\nn = 50 # the number of samples must be the same for each input variable\nx = rand([\"dog\", \"cat\", \"snake\"], n)\ny = rand(1:4, n)\nz = rand([(2, 1), (0, 0), (1, 1)], n)\ndiscretization = CodifyVariables(UniqueElements())\ncounts(discretization, x, y, z)","category":"page"},{"location":"api/counts_and_probabilities_api/","page":"Multivariate counts and probabilities API","title":"Multivariate counts and probabilities API","text":"Probabilities are computed analogously, except counts are normalized to sum to 1.","category":"page"},{"location":"api/counts_and_probabilities_api/","page":"Multivariate counts and probabilities API","title":"Multivariate counts and probabilities API","text":"discretization = CodifyVariables(UniqueElements())\nprobabilities(discretization, x, y, z)","category":"page"},{"location":"api/counts_and_probabilities_api/","page":"Multivariate counts and probabilities API","title":"Multivariate counts and probabilities API","text":"For numerical data, we can estimate both counts and probabilities using CodifyVariables with any count-based OutcomeSpace.","category":"page"},{"location":"api/counts_and_probabilities_api/","page":"Multivariate counts and probabilities API","title":"Multivariate counts and probabilities API","text":"using Associations\nx, y = rand(100), rand(100)\ndiscretization = CodifyVariables(BubbleSortSwaps(m = 4))\nprobabilities(discretization, x, y)","category":"page"},{"location":"api/counts_and_probabilities_api/","page":"Multivariate counts and probabilities API","title":"Multivariate counts and probabilities API","text":"For more fine-grained control, we can use CodifyPoints with one or several Encodings.","category":"page"},{"location":"api/counts_and_probabilities_api/","page":"Multivariate counts and probabilities API","title":"Multivariate counts and probabilities API","text":"using Associations\nx, y = StateSpaceSet(rand(1000, 2)), StateSpaceSet(rand(1000, 3))\n\n # min/max of the `rand` call is 0 and 1\nprecise = true # precise bin edges\nr = range(0, 1; length = 3)\nbinning = FixedRectangularBinning(r, dimension(x), precise)\nencoding_x = RectangularBinEncoding(binning, x)\nencoding_y = CombinationEncoding(RelativeMeanEncoding(0.0, 1, n = 2), OrdinalPatternEncoding(3))\ndiscretization = CodifyPoints(encoding_x, encoding_y)\n\n# now estimate probabilities\nprobabilities(discretization, x, y)","category":"page"},{"location":"examples/examples_associations/#examples_associations","page":"Associations","title":"Examples of association measure estimation","text":"","category":"section"},{"location":"examples/examples_associations/#[HellingerDistance](@ref)","page":"Associations","title":"HellingerDistance","text":"","category":"section"},{"location":"examples/examples_associations/#example_HellingerDistance_precomputed_probabilities","page":"Associations","title":"From precomputed probabilities","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\n# From pre-computed PMFs\np1 = Probabilities([0.1, 0.5, 0.2, 0.2])\np2 = Probabilities([0.3, 0.3, 0.2, 0.2])\nassociation(HellingerDistance(), p1, p2)","category":"page"},{"location":"examples/examples_associations/#example_HellingerDistance_JointProbabilities_OrdinalPatterns","page":"Associations","title":"JointProbabilities + OrdinalPatterns","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"We expect the Hellinger distance between two uncorrelated variables to be close to zero.","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Random; rng = Xoshiro(1234)\nn = 100000\nx, y = rand(rng, n), rand(rng, n)\nest = JointProbabilities(HellingerDistance(), CodifyVariables(OrdinalPatterns(m=3)))\ndiv_hd = association(est, x, y) # pretty close to zero","category":"page"},{"location":"examples/examples_associations/#[KLDivergence](@ref)","page":"Associations","title":"KLDivergence","text":"","category":"section"},{"location":"examples/examples_associations/#example_KLDivergence_precomputed_probabilities","page":"Associations","title":"From precomputed probabilities","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\n# From pre-computed PMFs\np1 = Probabilities([0.1, 0.5, 0.2, 0.2])\np2 = Probabilities([0.3, 0.3, 0.2, 0.2])\nassociation(KLDivergence(), p1, p2)","category":"page"},{"location":"examples/examples_associations/#example_KLDivergence_JointProbabilities_OrdinalPatterns","page":"Associations","title":"JointProbabilities + OrdinalPatterns","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"We expect the KLDivergence between two uncorrelated variables to be close to zero.","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Random; rng = Xoshiro(1234)\nn = 100000\nx, y = rand(rng, n), rand(rng, n)\nest = JointProbabilities(KLDivergence(), CodifyVariables(OrdinalPatterns(m=3)))\ndiv_hd = association(est, x, y) # pretty close to zero","category":"page"},{"location":"examples/examples_associations/#[RenyiDivergence](@ref)","page":"Associations","title":"RenyiDivergence","text":"","category":"section"},{"location":"examples/examples_associations/#example_RenyiDivergence_precomputed_probabilities","page":"Associations","title":"From precomputed probabilities","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\n# From pre-computed PMFs\np1 = Probabilities([0.1, 0.5, 0.2, 0.2])\np2 = Probabilities([0.3, 0.3, 0.2, 0.2])\nassociation(RenyiDivergence(), p1, p2)","category":"page"},{"location":"examples/examples_associations/#example_RenyiDivergence_JointProbabilities_OrdinalPatterns","page":"Associations","title":"JointProbabilities + OrdinalPatterns","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"We expect the RenyiDivergence between two uncorrelated variables to be close to zero.","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Random; rng = Xoshiro(1234)\nn = 100000\nx, y = rand(rng, n), rand(rng, n)\nest = JointProbabilities(RenyiDivergence(), CodifyVariables(OrdinalPatterns(m=3)))\ndiv_hd = association(est, x, y) # pretty close to zero","category":"page"},{"location":"examples/examples_associations/#[VariationDistance](@ref)","page":"Associations","title":"VariationDistance","text":"","category":"section"},{"location":"examples/examples_associations/#example_VariationDistance_precomputed_probabilities","page":"Associations","title":"From precomputed probabilities","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\n# From pre-computed PMFs\np1 = Probabilities([0.1, 0.5, 0.2, 0.2])\np2 = Probabilities([0.3, 0.3, 0.2, 0.2])\nassociation(VariationDistance(), p1, p2)","category":"page"},{"location":"examples/examples_associations/#example_VariationDistance_JointProbabilities_OrdinalPatterns","page":"Associations","title":"JointProbabilities + OrdinalPatterns","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"We expect the VariationDistance between two uncorrelated variables to be close to zero.","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Random; rng = Xoshiro(1234)\nn = 100000\nx, y = rand(rng, n), rand(rng, n)\nest = JointProbabilities(VariationDistance(), CodifyVariables(OrdinalPatterns(m=3)))\ndiv_hd = association(est, x, y) # pretty close to zero","category":"page"},{"location":"examples/examples_associations/#[JointEntropyShannon](@ref)","page":"Associations","title":"JointEntropyShannon","text":"","category":"section"},{"location":"examples/examples_associations/#example_JointEntropyShannon_Dispersion","page":"Associations","title":"JointProbabilities with Dispersion","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Random; rng = Xoshiro(1234)\nx, y = rand(rng, 100), rand(rng, 100)\nmeasure = JointEntropyShannon()\ndiscretization = CodifyVariables(Dispersion(m = 2, c = 3))\nest = JointProbabilities(measure, discretization)\nassociation(est, x, y)","category":"page"},{"location":"examples/examples_associations/#[JointEntropyTsallis](@ref)","page":"Associations","title":"JointEntropyTsallis","text":"","category":"section"},{"location":"examples/examples_associations/#example_JointEntropyTsallis_OrdinalPatterns","page":"Associations","title":"JointProbabilities with OrdinalPatterns","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Random; rng = Xoshiro(1234)\nx, y = rand(rng, 100), rand(rng, 100)\nmeasure = JointEntropyTsallis()\ndiscretization = CodifyVariables(OrdinalPatterns(m = 3))\nest = JointProbabilities(measure, discretization)\nassociation(est, x, y)","category":"page"},{"location":"examples/examples_associations/#[JointEntropyRenyi](@ref)","page":"Associations","title":"JointEntropyRenyi","text":"","category":"section"},{"location":"examples/examples_associations/#example_JointEntropyRenyi_ValueBinning","page":"Associations","title":"JointProbabilities with OrdinalPatterns","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Random; rng = Xoshiro(1234)\nx, y = rand(rng, 100), rand(rng, 100)\nmeasure = JointEntropyRenyi(q = 0.5)\ndiscretization = CodifyVariables(ValueBinning(2))\nest = JointProbabilities(measure, discretization)\nassociation(est, x, y)","category":"page"},{"location":"examples/examples_associations/#[ConditionalEntropyShannon](@ref)","page":"Associations","title":"ConditionalEntropyShannon","text":"","category":"section"},{"location":"examples/examples_associations/#example_ConditionalEntropyShannon_analytical","page":"Associations","title":"Analytical examples","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"This is essentially example 2.2.1 in Cover & Thomas (2006), where they use the following relative frequency table as an example. Notethat Julia is column-major, so we need to transpose their example. Then their X is in the first dimension of our table (along columns) and their Y is our second dimension (rows).","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nfreqs_yx = [1//8 1//16 1//32 1//32; \n 1//16 1//8 1//32 1//32;\n 1//16 1//16 1//16 1//16; \n 1//4 0//1 0//1 0//1];\n# `freqs_yx` is already normalized, se we can feed it directly to `Probabilities`\npxy = Probabilities(freqs_yx)","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"The marginal distribution for x (first dimension) is","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"marginal(pxy, dims = 2)","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"The marginal distribution for y (second dimension) is","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"marginal(pxy, dims = 1)","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"And the Shannon conditional entropy H^S(X Y)","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"ce_x_given_y = association(ConditionalEntropyShannon(), pxy) |> Rational","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"This is the same as in their example. Hooray! To compute H^S(Y X), we just need to flip the contingency matrix.","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"pyx = Probabilities(transpose(freqs_yx))\nce_y_given_x = association(ConditionalEntropyShannon(), pyx) |> Rational","category":"page"},{"location":"examples/examples_associations/#example_ConditionalEntropyShannon_JointProbabilities_CodifyVariables_UniqueElements","page":"Associations","title":"JointProbabilities + CodifyVariables + UniqueElements","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"We can of course also estimate conditional entropy from data. To do so, we'll use the JointProbabilities estimator, which constructs a multivariate PMF for us. Thus, we don't explicitly need a set of counts, like in the example above, because they are estimated under the hood for us. ","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"Let's first demonstrate on some categorical data. For that, we must use UniqueElements as the discretization (i.e. just count unique elements).","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Random; rng = Xoshiro(1234)\nn = 1000\nrating = rand(rng, 1:6, n)\nmovie = rand(rng, [\"The Witcher: the movie\", \"Lord of the Rings\"], n)\n\ndisc = CodifyVariables(UniqueElements())\nest = JointProbabilities(ConditionalEntropyShannon(), disc)\nassociation(est, rating, movie)","category":"page"},{"location":"examples/examples_associations/#example_ConditionalEntropyShannon_JointProbabilities_CodifyPoints_UniqueElementsEncoding","page":"Associations","title":"JointProbabilities + CodifyPoints + UniqueElementsEncoding","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Random; rng = Xoshiro(1234)\nx, y, z = rand(rng, 1:5, 100), rand(rng, 1:5, 100), rand(rng, 1:3, 100)\nX = StateSpaceSet(x, z)\nY = StateSpaceSet(y, z)\ndisc = CodifyPoints(UniqueElementsEncoding(X), UniqueElementsEncoding(Y));\nest = JointProbabilities(ConditionalEntropyShannon(), disc);\nassociation(est, X, Y)","category":"page"},{"location":"examples/examples_associations/#[ConditionalEntropyTsallisAbe](@ref)","page":"Associations","title":"ConditionalEntropyTsallisAbe","text":"","category":"section"},{"location":"examples/examples_associations/#example_ConditionalEntropyTsallisAbe_JointProbabilities_CodifyVariables_UniqueElements","page":"Associations","title":"JointProbabilities + CodifyVariables + UniqueElements","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"We'll here repeat the analysis we did for ConditionalEntropyShannon above.","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Random; rng = Xoshiro(1234)\nn = 1000\nrating = rand(rng, 1:6, n)\nmovie = rand(rng, [\"The Witcher: the movie\", \"Lord of the Rings\"], n)\n\ndisc = CodifyVariables(UniqueElements())\nest = JointProbabilities(ConditionalEntropyTsallisAbe(q =1.5), disc)\nassociation(est, rating, movie)","category":"page"},{"location":"examples/examples_associations/#example_ConditionalEntropyTsallisAbe_JointProbabilities_CodifyPoints_UniqueElementsEncoding","page":"Associations","title":"JointProbabilities + CodifyPoints + UniqueElementsEncoding","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Random; rng = Xoshiro(1234)\nx, y, z = rand(rng, 1:5, 100), rand(rng, 1:5, 100), rand(rng, 1:3, 100)\nX = StateSpaceSet(x, z)\nY = StateSpaceSet(y, z)\ndisc = CodifyPoints(UniqueElementsEncoding(X), UniqueElementsEncoding(Y));\nest = JointProbabilities(ConditionalEntropyTsallisAbe(q = 1.5), disc);\nassociation(est, X, Y)","category":"page"},{"location":"examples/examples_associations/#[ConditionalEntropyTsallisFuruichi](@ref)","page":"Associations","title":"ConditionalEntropyTsallisFuruichi","text":"","category":"section"},{"location":"examples/examples_associations/#example_ConditionalEntropyTsallisFuruichi_JointProbabilities_CodifyVariables_UniqueElements","page":"Associations","title":"JointProbabilities + CodifyVariables + UniqueElements","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"We'll here repeat the analysis we did for ConditionalEntropyShannon and ConditionalEntropyTsallisAbe above.","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Random; rng = Xoshiro(1234)\nn = 1000\nrating = rand(rng, 1:6, n)\nmovie = rand(rng, [\"The Witcher: the movie\", \"Lord of the Rings\"], n)\n\ndisc = CodifyVariables(UniqueElements())\nest = JointProbabilities(ConditionalEntropyTsallisFuruichi(q =0.5), disc)\nassociation(est, rating, movie)","category":"page"},{"location":"examples/examples_associations/#example_ConditionalEntropyTsallisFuruichi_JointProbabilities_CodifyPoints_UniqueElementsEncoding","page":"Associations","title":"JointProbabilities + CodifyPoints + UniqueElementsEncoding","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Random; rng = Xoshiro(1234)\nx, y, z = rand(rng, 1:5, 100), rand(rng, 1:5, 100), rand(rng, 1:3, 100)\nX = StateSpaceSet(x, z)\nY = StateSpaceSet(y, z)\ndisc = CodifyPoints(UniqueElementsEncoding(X), UniqueElementsEncoding(Y));\nest = JointProbabilities(ConditionalEntropyTsallisFuruichi(q = 0.5), disc);\nassociation(est, X, Y)","category":"page"},{"location":"examples/examples_associations/#[MIShannon](@ref)","page":"Associations","title":"MIShannon","text":"","category":"section"},{"location":"examples/examples_associations/#example_MIShannon_JointProbabilities_ValueBinning","page":"Associations","title":"JointProbabilities + ValueBinning","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Random; rng = MersenneTwister(1234)\nx = rand(rng, 1000)\ny = rand(rng, 1000)\ndiscretization = CodifyVariables(ValueBinning(FixedRectangularBinning(0, 1, 5)))\nest = JointProbabilities(MIShannon(), discretization)\nassociation(est, x, y)","category":"page"},{"location":"examples/examples_associations/#example_MIShannon_JointProbabilities_UniqueElements","page":"Associations","title":"JointProbabilities + UniqueElements","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"The JointProbabilities estimator can also be used with categorical data. For example, let's compare the Shannon mutual information between the preferences of a population sample with regards to different foods.","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nn = 1000\npreferences = rand([\"neutral\", \"like it\", \"hate it\"], n);\nrandom_foods = rand([\"water\", \"flour\", \"bananas\", \"booze\", \"potatoes\", \"beans\", \"soup\"], n)\nbiased_foods = map(preferences) do preference\n if cmp(preference, \"neutral\") == 1\n return rand([\"water\", \"flour\"])\n elseif cmp(preference, \"like it\") == 1\n return rand([\"bananas\", \"booze\"])\n else\n return rand([\"potatoes\", \"beans\", \"soup\"])\n end\nend\n\nest = JointProbabilities(MIShannon(), UniqueElements())\nassociation(est, preferences, biased_foods), association(est, preferences, random_foods)","category":"page"},{"location":"examples/examples_associations/#example_MIShannon_GaussianMI","page":"Associations","title":"Dedicated GaussianMI estimator","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Distributions\nusing Statistics\n\nn = 1000\nusing Associations\nx = randn(1000)\ny = rand(1000) .+ x\nassociation(GaussianMI(MIShannon()), x, y) # defaults to `MIShannon()`","category":"page"},{"location":"examples/examples_associations/#example_MIShannon_KSG1","page":"Associations","title":"Dedicated KraskovStögbauerGrassberger1 estimator","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nx, y = rand(1000), rand(1000)\nassociation(KSG1(MIShannon(); k = 5), x, y)","category":"page"},{"location":"examples/examples_associations/#example_MIShannon_KSG2","page":"Associations","title":"Dedicated KraskovStögbauerGrassberger2 estimator","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nx, y = rand(1000), rand(1000)\nassociation(KSG2(MIShannon(); k = 5), x, y)","category":"page"},{"location":"examples/examples_associations/#example_MIShannon_GaoKannanOhViswanath","page":"Associations","title":"Dedicated GaoKannanOhViswanath estimator","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nx, y = rand(1000), rand(1000)\nassociation(GaoKannanOhViswanath(MIShannon(); k = 10), x, y)","category":"page"},{"location":"examples/examples_associations/#example_MIShannon_EntropyDecomposition_Kraskov","page":"Associations","title":"EntropyDecomposition + Kraskov","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"We can compute MIShannon by naively applying a DifferentialInfoEstimator. Note that this doesn't apply any bias correction.","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nx, y = rand(1000), rand(1000)\nassociation(EntropyDecomposition(MIShannon(), Kraskov(k = 3)), x, y)","category":"page"},{"location":"examples/examples_associations/#example_MIShannon_EntropyDecomposition_BubbleSortSwaps","page":"Associations","title":"EntropyDecomposition + BubbleSortSwaps","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"We can also compute MIShannon by naively applying a DiscreteInfoEstimator. Note that this doesn't apply any bias correction.","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nx, y = rand(1000), rand(1000)\ndisc = CodifyVariables(BubbleSortSwaps(m=5))\nhest = PlugIn(Shannon())\nassociation(EntropyDecomposition(MIShannon(), hest, disc), x, y)","category":"page"},{"location":"examples/examples_associations/#example_MIShannon_EntropyDecomposition_Jackknife_ValueBinning","page":"Associations","title":"EntropyDecomposition + Jackknife + ValueBinning","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"Shannon mutual information can be written as a sum of marginal entropy terms. Here, we use CodifyVariables with ValueBinning bin the data and compute discrete Shannon mutual information.","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Random; rng = MersenneTwister(1234)\nx = rand(rng, 50)\ny = rand(rng, 50)\n\n# Use the H3-estimation method with a discrete visitation frequency based \n# probabilities estimator over a fixed grid covering the range of the data,\n# which is on [0, 1].\ndiscretization = CodifyVariables(ValueBinning(FixedRectangularBinning(0, 1, 5)))\nhest = Jackknife(Shannon())\nest = EntropyDecomposition(MIShannon(), hest, discretization)\nassociation(est, x, y)","category":"page"},{"location":"examples/examples_associations/#example_MIShannon_reproducing_Kraskov","page":"Associations","title":"Reproducing Kraskov et al. (2004)","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"Here, we'll reproduce Figure 4 from Kraskov et al. (2004)'s seminal paper on the nearest-neighbor based mutual information estimator. We'll estimate the mutual information between marginals of a bivariate Gaussian for a fixed time series length of 1000, varying the number of neighbors. Note: in the original paper, they show multiple curves corresponding to different time series length. We only show two single curves: one for the KraskovStögbauerGrassberger1 estimator and one for the KraskovStögbauerGrassberger2 estimator.","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing LinearAlgebra: det\nusing Distributions: MvNormal\nusing StateSpaceSets: StateSpaceSet\nusing CairoMakie\nusing Statistics\n\nN = 800\nc = 0.9\nΣ = [1 c; c 1]\nN2 = MvNormal([0, 0], Σ)\nmitrue = -0.5*log(det(Σ)) # in nats\nks = [2; 5; 7; 10:10:70] .* 2\n\nnreps = 10 # plot average over 10 independent realizations\nmis_ksg1 = zeros(nreps, length(ks))\nmis_ksg2 = zeros(nreps, length(ks))\nfor i = 1:nreps\n D2 = StateSpaceSet([rand(N2) for i = 1:N])\n X = D2[:, 1] |> StateSpaceSet\n Y = D2[:, 2] |> StateSpaceSet\n for (j, k) in enumerate(ks)\n est1 = KSG1(MIShannon(; base = ℯ); k)\n est2 = KSG2(MIShannon(; base = ℯ); k)\n mis_ksg1[i, j] = association(est1, X, Y)\n mis_ksg2[i, j] = association(est2, X, Y)\n end\nend\nfig = Figure()\nax = Axis(fig[1, 1], xlabel = \"k / N\", ylabel = \"Mutual infomation (nats)\")\nscatterlines!(ax, ks ./ N, mean(mis_ksg1, dims = 1) |> vec, label = \"KSG1\")\nscatterlines!(ax, ks ./ N, mean(mis_ksg2, dims = 1) |> vec, label = \"KSG2\")\nhlines!(ax, [mitrue], color = :black, linewidth = 3, label = \"I (true)\")\naxislegend()\nfig","category":"page"},{"location":"examples/examples_associations/#Estimator-comparison-for-[MIShannon](@ref)","page":"Associations","title":"Estimator comparison for MIShannon","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"Most estimators suffer from significant bias when applied to discrete, finite data. One possible resolution is to add a small amount of noise to discrete variables, so that the data becomes continuous in practice.","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"But instead of adding noise to your data, you can also consider using an estimator that is specifically designed to deal with continuous-discrete mixture data. One example is the GaoKannanOhViswanath estimator. Below, we compare its performance to KraskovStögbauerGrassberger1 on uniformly distributed discrete multivariate data. The true mutual information is zero. While the \"naive\" KraskovStögbauerGrassberger1 estimator diverges from the true value for these data, the GaoKannanOhViswanath converges to the true value.","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Statistics\nusing StateSpaceSets: StateSpaceSet\nusing Statistics: mean\nusing CairoMakie\n\nfunction compare_ksg_gkov(;\n k = 5,\n base = 2,\n nreps = 10,\n Ls = [500:100:1000; 1500; 2500; 5000; 7000])\n\n\n mis_ksg1_mix = zeros(nreps, length(Ls))\n mis_ksg1_discrete = zeros(nreps, length(Ls))\n mis_ksg1_cont = zeros(nreps, length(Ls))\n mis_gkov_mix = zeros(nreps, length(Ls))\n mis_gkov_discrete = zeros(nreps, length(Ls))\n mis_gkov_cont = zeros(nreps, length(Ls))\n\n for (j, L) in enumerate(Ls)\n for i = 1:nreps\n X = StateSpaceSet(float.(rand(1:8, L, 2)))\n Y = StateSpaceSet(float.(rand(1:8, L, 2)))\n Z = StateSpaceSet(rand(L, 2))\n W = StateSpaceSet(rand(L, 2))\n est_gkov = GaoKannanOhViswanath(MIShannon(; base = ℯ); k)\n est_ksg1 = KSG1(MIShannon(; base = ℯ); k)\n mis_ksg1_discrete[i, j] = association(est_ksg1, X, Y)\n mis_gkov_discrete[i, j] = association(est_gkov, X, Y)\n mis_ksg1_mix[i, j] = association(est_ksg1, X, Z)\n mis_gkov_mix[i, j] = association(est_gkov, X, Z)\n mis_ksg1_cont[i, j] = association(est_ksg1, Z, W)\n mis_gkov_cont[i, j] = association(est_gkov, Z, W)\n end\n end\n return mis_ksg1_mix, mis_ksg1_discrete, mis_ksg1_cont,\n mis_gkov_mix, mis_gkov_discrete, mis_gkov_cont\nend\n\nfig = Figure()\nax = Axis(fig[1, 1], \n xlabel = \"Sample size\", \n ylabel = \"Mutual information (bits)\")\nLs = [100; 200; 500; 1000; 2500; 5000; 7000]\nnreps = 5\nk = 3\nmis_ksg1_mix, mis_ksg1_discrete, mis_ksg1_cont,\n mis_gkov_mix, mis_gkov_discrete, mis_gkov_cont = \n compare_ksg_gkov(; nreps, k, Ls)\n\nscatterlines!(ax, Ls, mean(mis_ksg1_mix, dims = 1) |> vec, \n label = \"KSG1 (mixed)\", color = :black, \n marker = :utriangle)\nscatterlines!(ax, Ls, mean(mis_ksg1_discrete, dims = 1) |> vec, \n label = \"KSG1 (discrete)\", color = :black, \n linestyle = :dash, marker = '▲')\nscatterlines!(ax, Ls, mean(mis_ksg1_cont, dims = 1) |> vec, \n label = \"KSG1 (continuous)\", color = :black, \n linestyle = :dot, marker = '●')\nscatterlines!(ax, Ls, mean(mis_gkov_mix, dims = 1) |> vec, \n label = \"GaoKannanOhViswanath (mixed)\", color = :red, \n marker = :utriangle)\nscatterlines!(ax, Ls, mean(mis_gkov_discrete, dims = 1) |> vec, \n label = \"GaoKannanOhViswanath (discrete)\", color = :red, \n linestyle = :dash, marker = '▲')\nscatterlines!(ax, Ls, mean(mis_gkov_cont, dims = 1) |> vec, \n label = \"GaoKannanOhViswanath (continuous)\", color = :red, \n linestyle = :dot, marker = '●')\naxislegend(position = :rb)\nfig","category":"page"},{"location":"examples/examples_associations/#Estimation-using-[DifferentialInfoEstimator](@ref)s:-a-comparison","page":"Associations","title":"Estimation using DifferentialInfoEstimators: a comparison","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"Let's compare the performance of a subset of the implemented mutual information estimators. We'll use example data from Lord et al., where the analytical mutual information is known.","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing LinearAlgebra: det\nusing StateSpaceSets: StateSpaceSet\nusing Distributions: MvNormal\nusing LaTeXStrings\nusing CairoMakie\n\n# adapted from https://juliadatascience.io/makie_colors\nfunction new_cycle_theme()\n # https://nanx.me/ggsci/reference/pal_locuszoom.html\n my_colors = [\"#D43F3AFF\", \"#EEA236FF\", \"#5CB85CFF\", \"#46B8DAFF\",\n \"#357EBDFF\", \"#9632B8FF\", \"#B8B8B8FF\"]\n cycle = Cycle([:color, :linestyle, :marker], covary=true) # alltogether\n my_markers = [:circle, :rect, :utriangle, :dtriangle, :diamond,\n :pentagon, :cross, :xcross]\n my_linestyle = [nothing, :dash, :dot, :dashdot, :dashdotdot]\n return Theme(\n fontsize = 22, font=\"CMU Serif\",\n colormap = :linear_bmy_10_95_c78_n256,\n palette = (\n color = my_colors, \n marker = my_markers, \n linestyle = my_linestyle,\n ),\n Axis = (\n backgroundcolor= (:white, 0.2), \n xgridstyle = :dash, \n ygridstyle = :dash\n ),\n Lines = (\n cycle= cycle,\n ), \n ScatterLines = (\n cycle = cycle,\n ),\n Scatter = (\n cycle = cycle,\n ),\n Legend = (\n bgcolor = (:grey, 0.05), \n framecolor = (:white, 0.2),\n labelsize = 13,\n )\n )\nend\n\nrun(est; f::Function, # function that generates data\n base::Real = ℯ, \n nreps::Int = 10, \n αs = [1e-6, 1e-5, 1e-4, 1e-3, 1e-2, 1e-1], \n n::Int = 1000) =\n map(α -> association(est, f(α, n)...), αs)\n\nfunction compute_results(f::Function; estimators, k = 5, k_lord = 20,\n n = 1000, base = ℯ, nreps = 10,\n as = 7:-1:0,\n αs = [1/10^(a) for a in as])\n \n is = [zeros(length(αs)) for est in estimators]\n for (k, est) in enumerate(estimators)\n tmp = zeros(length(αs))\n for i = 1:nreps\n tmp .+= run(est; f = f, αs, base, n)\n end\n is[k] .= tmp ./ nreps\n end\n\n return is\nend\n\nfunction plot_results(f::Function, ftrue::Function; \n base, estimators, k_lord, k, \n as = 7:-1:0, αs = [1/10^(a) for a in as], kwargs...\n )\n is = compute_results(f; \n base, estimators, k_lord, k, as, αs, kwargs...)\n itrue = [ftrue(α; base) for α in αs]\n\n xmin, xmax = minimum(αs), maximum(αs)\n \n ymin = floor(Int, min(minimum(itrue), minimum(Iterators.flatten(is))))\n ymax = ceil(Int, max(maximum(itrue), maximum(Iterators.flatten(is))))\n f = Figure()\n ax = Axis(f[1, 1],\n xlabel = \"α\", ylabel = \"I (nats)\",\n xscale = log10, aspect = 1,\n xticks = (αs, [latexstring(\"10^{$(-a)}\") for a in as]),\n yticks = (ymin:ymax)\n )\n xlims!(ax, (1/10^first(as), 1/10^last(as)))\n ylims!(ax, (ymin, ymax))\n lines!(ax, αs, itrue, \n label = \"I (true)\", linewidth = 4, color = :black)\n for (i, est) in enumerate(estimators)\n if est isa EntropyDecomposition\n es = typeof(est.est).name.name |> String\n else\n es = typeof(est).name.name |> String\n end\n @show es\n lbl = occursin(\"Lord\", es) ? \"$es (k = $k_lord)\" : \"$es (k = $k)\"\n scatter!(ax, αs, is[i], label = lbl)\n lines!(ax, αs, is[i])\n\n end\n axislegend()\n return f\nend\n\nset_theme!(new_cycle_theme())\nk_lord = 20\nk = 5\nbase = ℯ\n\ndef = MIShannon(base = ℯ)\nestimators = [\n EntropyDecomposition(def, Kraskov(; k)),\n EntropyDecomposition(def, KozachenkoLeonenko()),\n EntropyDecomposition(def, Zhu(; k)),\n EntropyDecomposition(def, ZhuSingh(; k)),\n EntropyDecomposition(def, Gao(; k)),\n EntropyDecomposition(def, Lord(; k = k_lord)),\n EntropyDecomposition(def, LeonenkoProzantoSavani(Shannon(); k)),\n KSG1(def; k),\n KSG2(def; k),\n GaoOhViswanath(def; k),\n GaoKannanOhViswanath(def; k),\n GaussianMI(def),\n];","category":"page"},{"location":"examples/examples_associations/#Example-system:-family-1","page":"Associations","title":"Example system: family 1","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"In this system, samples are concentrated around the diagonal X = Y, and the strip of samples gets thinner as alpha to 0.","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"function family1(α, n::Int)\n x = rand(n)\n v = rand(n)\n y = x + α * v\n return StateSpaceSet(x), StateSpaceSet(y)\nend\n\n# True mutual information values for these data\nfunction ifamily1(α; base = ℯ)\n mi = -log(α) - α - log(2)\n return mi / log(base, ℯ)\nend\n\nfig = plot_results(family1, ifamily1; \n k_lord = k_lord, k = k, nreps = 10, n = 800,\n estimators = estimators,\n base = base)","category":"page"},{"location":"examples/examples_associations/#Example-system:-family-2","page":"Associations","title":"Example system: family 2","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"function family2(α, n::Int)\n Σ = [1 α; α 1]\n N2 = MvNormal(zeros(2), Σ)\n D2 = StateSpaceSet([rand(N2) for i = 1:n])\n X = StateSpaceSet(D2[:, 1])\n Y = StateSpaceSet(D2[:, 2])\n return X, Y\nend\n\nfunction ifamily2(α; base = ℯ)\n return (-0.5 * log(1 - α^2)) / log(ℯ, base)\nend\n\nαs = 0.05:0.05:0.95\nestimators = estimators\nwith_theme(new_cycle_theme()) do\n f = Figure();\n ax = Axis(f[1, 1], xlabel = \"α\", ylabel = \"I (nats)\")\n is_true = map(α -> ifamily2(α), αs)\n is_est = map(est -> run(est; f = family2, αs, nreps = 20), estimators)\n lines!(ax, αs, is_true, \n label = \"I (true)\", color = :black, linewidth = 3)\n for (i, est) in enumerate(estimators)\n if est isa EntropyDecomposition\n estname = typeof(est.est).name.name |> String\n else\n estname = typeof(est).name.name |> String\n end\n scatterlines!(ax, αs, is_est[i], label = estname)\n end\n axislegend(position = :lt)\n return f\nend","category":"page"},{"location":"examples/examples_associations/#Example-system:-family-3","page":"Associations","title":"Example system: family 3","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"In this system, we draw samples from a 4D Gaussian distribution distributed as specified in the ifamily3 function below. We let X be the two first variables, and Y be the two last variables.","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"function ifamily3(α; base = ℯ)\n Σ = [7 -5 -1 -3; -5 5 -1 3; -1 -1 3 -1; -3 3 -1 2+α]\n Σx = Σ[1:2, 1:2]; Σy = Σ[3:4, 3:4]\n mi = 0.5*log(det(Σx) * det(Σy) / det(Σ))\n return mi / log(ℯ, base)\nend\n\nfunction family3(α, n::Int)\n Σ = [7 -5 -1 -3; -5 5 -1 3; -1 -1 3 -1; -3 3 -1 2+α]\n N4 = MvNormal(zeros(4), Σ)\n D4 = StateSpaceSet([rand(N4) for i = 1:n])\n X = D4[:, 1:2]\n Y = D4[:, 3:4]\n return X, Y\nend\n\nfig = plot_results(family3, ifamily3; \n k_lord = k_lord, k = k, nreps = 5, n = 800,\n estimators = estimators, base = base)","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"We see that the Lord estimator, which estimates local volume elements using a singular-value decomposition (SVD) of local neighborhoods, outperforms the other estimators by a large margin.","category":"page"},{"location":"examples/examples_associations/#[MIRenyiJizba](@ref)","page":"Associations","title":"MIRenyiJizba","text":"","category":"section"},{"location":"examples/examples_associations/#example_MIRenyiJizba_JointProbabilities_UniqueElements","page":"Associations","title":"JointProbabilities + UniqueElements","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"MIRenyiJizba can be estimated for categorical data using JointProbabilities estimator with the UniqueElements outcome space.","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Random; rng = Xoshiro(1234)\nx = rand(rng, [\"a\", \"b\", \"c\"], 200);\ny = rand(rng, [\"hello\", \"yoyo\", \"heyhey\"], 200);\nest = JointProbabilities(MIRenyiJizba(), UniqueElements())\nassociation(est, x, y)","category":"page"},{"location":"examples/examples_associations/#example_MIRenyiJizba_JointProbabilities_LeonenkoProzantoSavani","page":"Associations","title":"EntropyDecomposition + LeonenkoProzantoSavani","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"MIRenyiJizba can also estimated for numerical data using EntropyDecomposition in combination with any DifferentialInfoEstimator capable of estimating differential Renyi entropy.","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Random; rng = Xoshiro(1234)\nx = randn(rng, 50); y = randn(rng, 50);\ndef = MIRenyiJizba()\nest_diff = EntropyDecomposition(def, LeonenkoProzantoSavani(Renyi(), k=3))\nassociation(est_diff, x, y) ","category":"page"},{"location":"examples/examples_associations/#example_MIRenyiJizba_EntropyDecomposition_ValueBinning","page":"Associations","title":"EntropyDecomposition + LeonenkoProzantoSavani","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"MIRenyiJizba can also estimated for numerical data using EntropyDecomposition in combination with any DiscreteInfoEstimator capable of estimating differential Renyi entropy over some OutcomeSpace, e.g. ValueBinning.","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Random; rng = Xoshiro(1234)\nx = randn(rng, 50); y = randn(rng, 50);\ndef = MIRenyiJizba()\n\ndisc = CodifyVariables(ValueBinning(2))\nest_disc = EntropyDecomposition(def, PlugIn(Renyi()), disc);\nassociation(est_disc, x, y)","category":"page"},{"location":"examples/examples_associations/#[MIRenyiSarbu](@ref)","page":"Associations","title":"MIRenyiSarbu","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"MIRenyiSarbu can be estimated using the JointProbabilities estimator in combination with any CodifyVariables or CodifyPoints discretization scheme.","category":"page"},{"location":"examples/examples_associations/#example_MIRenyiSarbu_JointProbabilities_UniqueElements","page":"Associations","title":"JointProbabilities + UniqueElements","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Random; rng = Xoshiro(1234)\nx = rand(rng, [\"a\", \"b\", \"c\"], 200)\ny = rand(rng, [\"hello\", \"yoyo\", \"heyhey\"], 200)\n\nest = JointProbabilities(MIRenyiSarbu(), CodifyVariables(UniqueElements()))\nassociation(est, x, y)","category":"page"},{"location":"examples/examples_associations/#example_MIRenyiSarbu_JointProbabilities_CosineSimilarityBinning","page":"Associations","title":"JointProbabilities + CosineSimilarityBinning","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Random; rng = Xoshiro(1234)\nx = rand(rng, 200)\ny = rand(rng, 200)\n\nest = JointProbabilities(MIRenyiSarbu(), CodifyVariables(CosineSimilarityBinning()))\nassociation(est, x, y)","category":"page"},{"location":"examples/examples_associations/#[MITsallisFuruichi](@ref)","page":"Associations","title":"MITsallisFuruichi","text":"","category":"section"},{"location":"examples/examples_associations/#example_MITsallisFuruichi_JointProbabilities_UniqueElements","page":"Associations","title":"JointProbabilities + UniqueElements","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"MITsallisFuruichi can be estimated using the JointProbabilities estimator in combination with any CodifyVariables or CodifyPoints discretization scheme.","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Random; rng = Xoshiro(1234)\nx = rand(rng, 200)\ny = rand(rng, 200)\n\nest = JointProbabilities(MITsallisFuruichi(q = 0.3), UniqueElements())\nassociation(est, x, y) ","category":"page"},{"location":"examples/examples_associations/#example_MITsallisFuruichi_EntropyDecomposition_LeonenkoProzantoSavani","page":"Associations","title":"EntropyDecomposition + LeonenkoProzantoSavani","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Random; rng = Xoshiro(1234)\nx = rand(rng, 200)\ny = rand(rng, 200)\n\nest_diff = EntropyDecomposition(MITsallisFuruichi(), LeonenkoProzantoSavani(Tsallis(q= 2)))\nassociation(est_diff, x, y)","category":"page"},{"location":"examples/examples_associations/#example_MITsallisFuruichi_EntropyDecomposition_Dispersion","page":"Associations","title":"EntropyDecomposition + Dispersion","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Random; rng = Xoshiro(1234)\nx = rand(rng, 200)\ny = rand(rng, 200)\ndisc = CodifyVariables(Dispersion())\nest_disc = EntropyDecomposition(MITsallisFuruichi(), PlugIn(Tsallis()), disc)\n\nassociation(est_disc, x, y)","category":"page"},{"location":"examples/examples_associations/#[MITsallisMartin](@ref)","page":"Associations","title":"MITsallisMartin","text":"","category":"section"},{"location":"examples/examples_associations/#example_MITsallisMartin_JointProbabilities_UniqueElements","page":"Associations","title":"JointProbabilities + UniqueElements","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Random; rng = Xoshiro(1234)\nx = rand(rng, 200)\ny = rand(rng, 200)\n\nest = JointProbabilities(MITsallisMartin(q = 1.5), UniqueElements())\nassociation(est, x, y) ","category":"page"},{"location":"examples/examples_associations/#example_MITsallisMartin_EntropyDecomposition_LeonenkoProzantoSavani","page":"Associations","title":"EntropyDecomposition + LeonenkoProzantoSavani","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"MITsallisMartin can be estimated using a decomposition into entropy terms using EntropyDecomposition with any compatible estimator that can estimate differential Tsallis entropy. ","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Random; rng = Xoshiro(1234)\nx = rand(rng, 500)\ny = rand(rng, 500)\n\nest_diff = EntropyDecomposition(MITsallisMartin(), LeonenkoProzantoSavani(Tsallis(q= 1.5)))\nassociation(est_diff, x, y)","category":"page"},{"location":"examples/examples_associations/#example_MITsallisMartin_EntropyDecomposition_OrdinalPatterns","page":"Associations","title":"EntropyDecomposition + OrdinalPatterns","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Random; rng = Xoshiro(1234)\nx = rand(rng, 200)\ny = rand(rng, 200)\ndisc = CodifyVariables(OrdinalPatterns())\nest_disc = EntropyDecomposition(MITsallisMartin(), PlugIn(Tsallis()), disc)\n\nassociation(est_disc, x, y)","category":"page"},{"location":"examples/examples_associations/#[CMIShannon](@ref)","page":"Associations","title":"CMIShannon","text":"","category":"section"},{"location":"examples/examples_associations/#example_CMIShannon_GaussianCMI","page":"Associations","title":"CMIShannon with GaussianCMI","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Distributions\nusing Statistics\n\nn = 1000\n# A chain X → Y → Z\nx = randn(1000)\ny = randn(1000) .+ x\nz = randn(1000) .+ y\nassociation(GaussianCMI(), x, z, y) # defaults to `CMIShannon()`","category":"page"},{"location":"examples/examples_associations/#example_CMIShannon_FPVP","page":"Associations","title":"CMIShannon with FPVP","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Distributions\nusing Statistics\n\nn = 1000\n# A chain X → Y → Z\nx = rand(Normal(-1, 0.5), n)\ny = rand(BetaPrime(0.5, 1.5), n) .+ x\nz = rand(Chisq(100), n)\nz = (z ./ std(z)) .+ y\n\n# We expect zero (in practice: very low) CMI when computing I(X; Z | Y), because\n# the link between X and Z is exclusively through Y, so when observing Y,\n# X and Z should appear independent.\nassociation(FPVP(k = 5), x, z, y) # defaults to `CMIShannon()`","category":"page"},{"location":"examples/examples_associations/#[CMIShannon](@ref)-with-[MesnerShalizi](@ref)","page":"Associations","title":"CMIShannon with MesnerShalizi","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Distributions\nusing Statistics\nusing Random; rng = Xoshiro(1234)\n\nn = 1000\n# A chain X → Y → Z\nx = rand(rng, Normal(-1, 0.5), n)\ny = rand(rng, BetaPrime(0.5, 1.5), n) .+ x\nz = rand(rng, Chisq(100), n)\nz = (z ./ std(z)) .+ y\n\n# We expect zero (in practice: very low) CMI when computing I(X; Z | Y), because\n# the link between X and Z is exclusively through Y, so when observing Y,\n# X and Z should appear independent.\nassociation(MesnerShalizi(; k = 10), x, z, y) # defaults to `CMIShannon()`","category":"page"},{"location":"examples/examples_associations/#[CMIShannon](@ref)-with-[Rahimzamani](@ref)","page":"Associations","title":"CMIShannon with Rahimzamani","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Distributions\nusing Statistics\nusing Random; rng = Xoshiro(1234)\n\nn = 1000\n# A chain X → Y → Z\nx = rand(rng, Normal(-1, 0.5), n)\ny = rand(rng, BetaPrime(0.5, 1.5), n) .+ x\nz = rand(rng, Chisq(100), n)\nz = (z ./ std(z)) .+ y\n\n# We expect zero (in practice: very low) CMI when computing I(X; Z | Y), because\n# the link between X and Z is exclusively through Y, so when observing Y,\n# X and Z should appear independent.\nassociation(Rahimzamani(CMIShannon(base = 10); k = 10), x, z, y)","category":"page"},{"location":"examples/examples_associations/#example_CMIShannon_MIDecomposition","page":"Associations","title":"MIDecomposition","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"Shannon-type conditional mutual information can be decomposed as a sum of mutual information terms, which we can each estimate with any dedicated MutualInformationEstimator estimator.","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Random; rng = MersenneTwister(1234)\nx = rand(rng, 300)\ny = rand(rng, 300) .+ x\nz = rand(rng, 300) .+ y\n\nest = MIDecomposition(CMIShannon(), KSG1(MIShannon(base = 2), k = 3))\nassociation(est, x, z, y) # should be near 0 (and can be negative)","category":"page"},{"location":"examples/examples_associations/#[CMIRenyiPoczos](@ref)","page":"Associations","title":"CMIRenyiPoczos","text":"","category":"section"},{"location":"examples/examples_associations/#CMIRenyiPoczos_PoczosSchneiderCMI","page":"Associations","title":"PoczosSchneiderCMI","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Distributions\nusing Statistics\nusing Random; rng = Xoshiro(1234)\n\nn = 1000\n# A chain X → Y → Z\nx = rand(rng, Normal(-1, 0.5), n)\ny = rand(rng, BetaPrime(0.5, 1.5), n) .+ x\nz = rand(rng, Chisq(100), n)\nz = (z ./ std(z)) .+ y\n\n# We expect zero (in practice: very low) CMI when computing I(X; Z | Y), because\n# the link between X and Z is exclusively through Y, so when observing Y,\n# X and Z should appear independent.\nest = PoczosSchneiderCMI(CMIRenyiPoczos(base = 2, q = 1.2); k = 5)\nassociation(est, x, z, y)","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"In addition to the dedicated ConditionalMutualInformationEstimators, any MutualInformationEstimator can also be used to compute conditional mutual information using the chain rule of mutual information. However, the naive application of these estimators don't perform any bias correction when taking the difference of mutual information terms.","category":"page"},{"location":"examples/examples_associations/#[CMIShannon](@ref)-2","page":"Associations","title":"CMIShannon","text":"","category":"section"},{"location":"examples/examples_associations/#example_CMIShannon_MIDecomposition_KSG1","page":"Associations","title":"MIDecomposition + KraskovStögbauerGrassberger1","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Distributions\nusing Statistics\n\nn = 1000\n# A chain X → Y → Z\nx = rand(Normal(-1, 0.5), n)\ny = rand(BetaPrime(0.5, 1.5), n) .+ x\nz = rand(Chisq(100), n)\nz = (z ./ std(z)) .+ y\n\n# We expect zero (in practice: very low) CMI when computing I(X; Z | Y), because\n# the link between X and Z is exclusively through Y, so when observing Y,\n# X and Z should appear independent.\nest = MIDecomposition(CMIShannon(base = 2), KSG1(k = 10))\nassociation(est, x, z, y)","category":"page"},{"location":"examples/examples_associations/#[ShortExpansionConditionalMutualInformation](@ref)","page":"Associations","title":"ShortExpansionConditionalMutualInformation","text":"","category":"section"},{"location":"examples/examples_associations/#example_ShortExpansionConditionalMutualInformation_JointProbabilities_CodifyVariables_ValueBinning","page":"Associations","title":"JointProbabilities with CodifyVariables and ValueBinning","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Test\nusing Random; rng = Xoshiro(1234)\nn = 20\nx = rand(rng, n)\ny = randn(rng, n) .+ x .^ 2\nz = randn(rng, n) .* y\n\n# An estimator for estimating the SECMI measure\nest = JointProbabilities(SECMI(base = 2), CodifyVariables(ValueBinning(3)))\nassociation(est, x, z, y)","category":"page"},{"location":"examples/examples_associations/#example_CMIShannon_EntropyDecomposition_Kraskov","page":"Associations","title":"EntropyDecomposition + Kraskov","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"Any DifferentialInfoEstimator can also be used to compute conditional mutual information using a sum of entropies. For that, we usethe EntropyDecomposition estimator. No bias correction is applied for EntropyDecomposition either.","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Distributions\nusing Random; rng = Xoshiro(1234)\nn = 500\n# A chain X → Y → Z\nx = rand(rng, Epanechnikov(0.5, 1.0), n)\ny = rand(rng, Normal(0, 0.2), n) .+ x\nz = rand(rng, FDist(3, 2), n)\nest = EntropyDecomposition(CMIShannon(), Kraskov(k = 5))\nassociation(est, x, z, y)","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"Any DiscreteInfoEstimator that computes entropy can also be used to compute conditional mutual information using a sum of entropies. For that, we also use EntropyDecomposition. In the discrete case, we also have to specify a discretization (an OutcomeSpace).","category":"page"},{"location":"examples/examples_associations/#example_CMIShannon_EntropyDecomposition_ValueBinning","page":"Associations","title":"EntropyDecomposition + ValueBinning","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Distributions\nusing Random; rng = Xoshiro(1234)\nn = 500\n# A chain X → Y → Z\nx = rand(rng, Epanechnikov(0.5, 1.0), n)\ny = rand(rng, Normal(0, 0.2), n) .+ x\nz = rand(rng, FDist(3, 2), n)\ndiscretization = CodifyVariables(ValueBinning(RectangularBinning(5)))\nhest = PlugIn(Shannon())\nest = EntropyDecomposition(CMIShannon(), hest, discretization)\nassociation(est, x, y, z)","category":"page"},{"location":"examples/examples_associations/#[CMIRenyiJizba](@ref)","page":"Associations","title":"CMIRenyiJizba","text":"","category":"section"},{"location":"examples/examples_associations/#example_CMIRenyiJizba_JointProbabilities_BubbleSortSwaps","page":"Associations","title":"JointProbabilities + BubbleSortSwaps","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Random; rng = Xoshiro(1234)\nx = rand(rng, 100)\ny = x .+ rand(rng, 100)\nz = y .+ rand(rng, 100)\ndisc = CodifyVariables(BubbleSortSwaps(m = 4))\nest = JointProbabilities(CMIRenyiJizba(), disc)\nassociation(est, x, z, y)","category":"page"},{"location":"examples/examples_associations/#example_CMIRenyiJizba_EntropyDecomposition_LeonenkoProzantoSavani","page":"Associations","title":"EntropyDecomposition + LeonenkoProzantoSavani","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Random; rng = Xoshiro(1234)\nx, y, z = rand(rng, 1000), rand(rng, 1000), rand(rng, 1000)\ndef = CMIRenyiJizba(q = 1.5)\n\n# Using a differential Rényi entropy estimator\nest = EntropyDecomposition(def, LeonenkoProzantoSavani(Renyi(), k = 10))\nassociation(est, x, y, z)","category":"page"},{"location":"examples/examples_associations/#example_CMIRenyiJizba_EntropyDecomposition_OrdinalPatterns","page":"Associations","title":"EntropyDecomposition + OrdinalPatterns","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Random; rng = Xoshiro(1234)\nx, y, z = rand(rng, 1000), rand(rng, 1000), rand(rng, 1000)\ndef = CMIRenyiJizba(q = 1.5)\n\n# Using a plug-in Rényi entropy estimator, discretizing using ordinal patterns.\nest = EntropyDecomposition(def, PlugIn(Renyi()), CodifyVariables(OrdinalPatterns(m=2)), RelativeAmount())\nassociation(est, x, y, z)","category":"page"},{"location":"examples/examples_associations/#[TEShannon](@ref)","page":"Associations","title":"TEShannon","text":"","category":"section"},{"location":"examples/examples_associations/#example_TEShannon_EntropyDecomposition_TransferOperator","page":"Associations","title":"EntropyDecomposition + TransferOperator","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"For transfer entropy examples, we'll construct some time series for which there is time-delayed forcing between variables.","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"\nusing Associations\nusing DynamicalSystemsBase\nusing StableRNGs\nrng = StableRNG(123)\n\nBase.@kwdef struct Logistic4Chain{V, RX, RY, RZ, RW, C1, C2, C3, Σ1, Σ2, Σ3, RNG}\n xi::V = [0.1, 0.2, 0.3, 0.4]\n rx::RX = 3.9\n ry::RY = 3.6\n rz::RZ = 3.6\n rw::RW = 3.8\n c_xy::C1 = 0.4\n c_yz::C2 = 0.4\n c_zw::C3 = 0.35\n σ_xy::Σ1 = 0.05\n σ_yz::Σ2 = 0.05\n σ_zw::Σ3 = 0.05\n rng::RNG = Random.default_rng()\nend\n\nfunction eom_logistic4_chain(u, p::Logistic4Chain, t)\n (; xi, rx, ry, rz, rw, c_xy, c_yz, c_zw, σ_xy, σ_yz, σ_zw, rng) = p\n x, y, z, w = u\n f_xy = (y + c_xy*(x + σ_xy * rand(rng)) ) / (1 + c_xy*(1+σ_xy))\n f_yz = (z + c_yz*(y + σ_yz * rand(rng)) ) / (1 + c_yz*(1+σ_yz))\n f_zw = (w + c_zw*(z + σ_zw * rand(rng)) ) / (1 + c_zw*(1+σ_zw))\n dx = rx * x * (1 - x)\n dy = ry * (f_xy) * (1 - f_xy)\n dz = rz * (f_yz) * (1 - f_yz)\n dw = rw * (f_zw) * (1 - f_zw)\n return SVector{4}(dx, dy, dz, dw)\nend\n\nfunction system(definition::Logistic4Chain)\n return DiscreteDynamicalSystem(eom_logistic4_chain, definition.xi, definition)\nend\n\n# An example system where `X → Y → Z → W`.\nsys = system(Logistic4Chain(; rng))\nx, y, z, w = columns(first(trajectory(sys, 300, Ttr = 10000)))\n\nprecise = true # precise bin edges\ndiscretization = CodifyVariables(TransferOperator(RectangularBinning(2, precise))) #\nest_disc_to = EntropyDecomposition(TEShannon(), PlugIn(Shannon()), discretization);\nassociation(est_disc_to, x, y), association(est_disc_to, y, x)","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"The Shannon-type transfer entropy from x to y is stronger than from y to x, which is what we expect if x drives y.","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"association(est_disc_to, x, z), association(est_disc_to, x, z, y)","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"The Shannon-type transfer entropy from x to z is stronger than the transfer entropy from x to z given y. This is expected, because x drives z through y, so \"conditioning away\" the effect of y should decrease the estimated information transfer.","category":"page"},{"location":"examples/examples_associations/#example_TEShannon_CMIDecomposition","page":"Associations","title":"CMIDecomposition","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Random; rng = MersenneTwister(1234)\nx = rand(rng, 1000)\ny = rand(rng, 1000) .+ x\nz = rand(rng, 1000) .+ y\n\n# Estimate transfer entropy by representing it as a CMI and using the `FPVP` estimator.\nest = CMIDecomposition(TEShannon(base = 2), FPVP(k = 3))\nassociation(est, x, z, y) # should be near 0 (and can be negative)","category":"page"},{"location":"examples/examples_associations/#example_TEShannon_SymbolicTransferEntropy","page":"Associations","title":"SymbolicTransferEntropy estimator","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"The SymbolicTransferEntropy estimator is just a convenience wrapper which utilizes CodifyVariableswith the OrdinalPatterns outcome space to discretize the input time series before computing transfer entropy.","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"We'll use coupled time series from the logistic4 system above, where x → y → z → w. Thus, we expect that the association for the direction x → y is larger than for y → x. We also expect an association x → z, but the association should weaken when conditioning on the intermediate value y.","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing DynamicalSystemsBase\nusing Random; rng = Xoshiro(1234)\nsys = system(Logistic4Chain(; rng))\nx, y, z, w = columns(first(trajectory(sys, 300, Ttr = 10000)))\nest = SymbolicTransferEntropy(m = 5)\nassociation(est, x, y), association(est, y, x), association(est, x, z), association(est, x, z, y)","category":"page"},{"location":"examples/examples_associations/#example_TEShannon_estimator-comparison","page":"Associations","title":"Comparing different estimators ","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"Let's reproduce Figure 4 from Zhu et al. (2015), where they test some dedicated transfer entropy estimators on a bivariate autoregressive system. We will test","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"The Lindner and Zhu1 dedicated transfer entropy estimators, which try to eliminate bias.\nThe KraskovStögbauerGrassberger1 estimator, which computes TE naively as a sum of mutual information terms (without guaranteed cancellation of biases for the total sum).\nThe Kraskov estimator, which computes TE naively as a sum of entropy terms (without guaranteed cancellation of biases for the total sum).","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing CairoMakie\nusing Statistics\nusing Distributions: Normal\n\nfunction model2(n::Int)\n 𝒩x = Normal(0, 0.1)\n 𝒩y = Normal(0, 0.1)\n x = zeros(n+2)\n y = zeros(n+2)\n x[1] = rand(𝒩x)\n x[2] = rand(𝒩x)\n y[1] = rand(𝒩y)\n y[2] = rand(𝒩y)\n\n for i = 3:n+2\n x[i] = 0.45*sqrt(2)*x[i-1] - 0.9*x[i-2] - 0.6*y[i-2] + rand(𝒩x)\n y[i] = 0.6*x[i-2] - 0.175*sqrt(2)*y[i-1] + 0.55*sqrt(2)*y[i-2] + rand(𝒩y)\n end\n return x[3:end], y[3:end]\nend\nte_true = 0.42 # eyeball the theoretical value from their Figure 4.\n\nm = TEShannon(embedding = EmbeddingTE(dT = 2, dS = 2), base = ℯ)\nestimators = [ \n Zhu1(m, k = 8), \n Lindner(m, k = 8), \n MIDecomposition(m, KSG1(k = 8)),\n EntropyDecomposition(m, Kraskov(k = 8)),\n]\nLs = [floor(Int, 2^i) for i in 8.0:0.5:11]\nnreps = 8\ntes_xy = [[zeros(nreps) for i = 1:length(Ls)] for e in estimators]\ntes_yx = [[zeros(nreps) for i = 1:length(Ls)] for e in estimators]\nfor (k, est) in enumerate(estimators)\n for (i, L) in enumerate(Ls)\n for j = 1:nreps\n x, y = model2(L);\n tes_xy[k][i][j] = association(est, x, y)\n tes_yx[k][i][j] = association(est, y, x)\n end\n end\nend\n\nymin = minimum(map(x -> minimum(Iterators.flatten(Iterators.flatten(x))), (tes_xy, tes_yx)))\nestimator_names = [\"Zhu1\", \"Lindner\", \"KSG1\", \"Kraskov\"]\nls = [:dash, :dot, :dash, :dot]\nmr = [:rect, :hexagon, :xcross, :pentagon]\n\nfig = Figure(resolution = (800, 350))\nax_xy = Axis(fig[1,1], xlabel = \"Signal length\", ylabel = \"TE (nats)\", title = \"x → y\")\nax_yx = Axis(fig[1,2], xlabel = \"Signal length\", ylabel = \"TE (nats)\", title = \"y → x\")\nfor (k, e) in enumerate(estimators)\n label = estimator_names[k]\n marker = mr[k]\n scatterlines!(ax_xy, Ls, mean.(tes_xy[k]); label, marker)\n scatterlines!(ax_yx, Ls, mean.(tes_yx[k]); label, marker)\n hlines!(ax_xy, [te_true]; xmin = 0.0, xmax = 1.0, linestyle = :dash, color = :black) \n hlines!(ax_yx, [te_true]; xmin = 0.0, xmax = 1.0, linestyle = :dash, color = :black)\n linkaxes!(ax_xy, ax_yx)\nend\naxislegend(ax_xy, position = :rb)\n\nfig","category":"page"},{"location":"examples/examples_associations/#Reproducing-Schreiber-(2000)","page":"Associations","title":"Reproducing Schreiber (2000)","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"Let's try to reproduce the results from Schreiber's original paper (Schreiber, 2000) where he introduced the transfer entropy. We'll here use the JointProbabilities estimator, discretizing per column of the input data using the CodifyVariables discretization scheme with the ValueBinning outcome space.","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing DynamicalSystemsBase\nusing CairoMakie\nusing Statistics\nusing Random; Random.seed!(12234);\n\nfunction ulam_system(dx, x, p, t)\n f(x) = 2 - x^2\n ε = p[1]\n dx[1] = f(ε*x[length(dx)] + (1-ε)*x[1])\n for i in 2:length(dx)\n dx[i] = f(ε*x[i-1] + (1-ε)*x[i])\n end\nend\n\nds = DiscreteDynamicalSystem(ulam_system, rand(100) .- 0.5, [0.04])\nfirst(trajectory(ds, 1000; Ttr = 1000));\n\nεs = 0.02:0.02:1.0\nte_x1x2 = zeros(length(εs)); te_x2x1 = zeros(length(εs))\n# Guess an appropriate bin width of 0.2 for the histogram\ndisc = CodifyVariables(ValueHistogram(0.2))\nest = JointProbabilities(TEShannon(; base = 2), disc)\n\nfor (i, ε) in enumerate(εs)\n set_parameter!(ds, 1, ε)\n tr = first(trajectory(ds, 300; Ttr = 5000))\n X1 = tr[:, 1]; X2 = tr[:, 2]\n @assert !any(isnan, X1)\n @assert !any(isnan, X2)\n te_x1x2[i] = association(est, X1, X2)\n te_x2x1[i] = association(est, X2, X1)\nend\n\nfig = Figure(size = (800, 600))\nax = Axis(fig[1, 1], xlabel = \"epsilon\", ylabel = \"Transfer entropy (bits)\")\nlines!(ax, εs, te_x1x2, label = \"X1 to X2\", color = :black, linewidth = 1.5)\nlines!(ax, εs, te_x2x1, label = \"X2 to X1\", color = :red, linewidth = 1.5)\naxislegend(ax, position = :lt)\nreturn fig","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"As expected, transfer entropy from X1 to X2 is higher than from X2 to X1 across parameter values for ε. But, by our definition of the ulam system, dynamical coupling only occurs from X1 to X2. The results, however, show nonzero transfer entropy in both directions. What does this mean?","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"Computing transfer entropy from finite time series introduces bias, and so does any particular choice of entropy estimator used to calculate it. To determine whether a transfer entropy estimate should be trusted, we can employ surrogate testing. We'll generate surrogate using TimeseriesSurrogates.jl. One possible way to do so is to use a SurrogateAssociationTest with independence, but here we'll do the surrogate resampling manually, so we can plot and inspect the results.","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"In the example below, we continue with the same time series generated above. However, at each value of ε, we also compute transfer entropy for nsurr = 50 different randomly shuffled (permuted) versions of the source process. If the original transfer entropy exceeds that of some percentile the transfer entropy estimates of the surrogate ensemble, we will take that as \"significant\" transfer entropy.","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"nsurr = 25 # in real applications, you should use more surrogates\nbase = 2\nte_x1x2 = zeros(length(εs)); te_x2x1 = zeros(length(εs))\nte_x1x2_surr = zeros(length(εs), nsurr); te_x2x1_surr = zeros(length(εs), nsurr)\n\n# use same bin-width as before\ndisc = CodifyVariables(ValueHistogram(0.2))\nest = JointProbabilities(TEShannon(; base = 2), disc)\n\nfor (i, ε) in enumerate(εs)\n set_parameter!(ds, 1, ε)\n tr = first(trajectory(ds, 300; Ttr = 5000))\n X1 = tr[:, 1]; X2 = tr[:, 2]\n @assert !any(isnan, X1)\n @assert !any(isnan, X2)\n te_x1x2[i] = association(est, X1, X2)\n te_x2x1[i] = association(est, X2, X1)\n s1 = surrogenerator(X1, RandomShuffle()); s2 = surrogenerator(X2, RandomShuffle())\n\n for j = 1:nsurr\n te_x1x2_surr[i, j] = association(est, s1(), X2)\n te_x2x1_surr[i, j] = association(est, s2(), X1)\n end\nend\n\n# Compute 95th percentiles of the surrogates for each ε\nqs_x1x2 = [quantile(te_x1x2_surr[i, :], 0.95) for i = 1:length(εs)]\nqs_x2x1 = [quantile(te_x2x1_surr[i, :], 0.95) for i = 1:length(εs)]\n\nfig = with_theme(theme_minimal(), markersize = 2) do\n fig = Figure()\n ax = Axis(fig[1, 1], xlabel = \"epsilon\", ylabel = \"Transfer entropy (bits)\")\n scatterlines!(ax, εs, te_x1x2, label = \"X1 to X2\", color = :black, linewidth = 1.5)\n scatterlines!(ax, εs, qs_x1x2, color = :black, linestyle = :dot, linewidth = 1.5)\n scatterlines!(ax, εs, te_x2x1, label = \"X2 to X1\", color = :red)\n scatterlines!(ax, εs, qs_x2x1, color = :red, linestyle = :dot)\n axislegend(ax, position = :lt)\n return fig\nend\nfig","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"The plot above shows the original transfer entropies (solid lines) and the 95th percentile transfer entropies of the surrogate ensembles (dotted lines). As expected, using the surrogate test, the transfer entropies from X1 to X2 are mostly significant (solid black line is above dashed black line). The transfer entropies from X2 to X1, on the other hand, are mostly not significant (red solid line is below red dotted line).","category":"page"},{"location":"examples/examples_associations/#[TERenyiJizba](@ref)","page":"Associations","title":"TERenyiJizba","text":"","category":"section"},{"location":"examples/examples_associations/#example_TERenyiJizba_EntropyDecomposition_TransferOperator","page":"Associations","title":"EntropyDecomposition + TransferOperator","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"We can perform the same type of analysis as above using TERenyiJizba instead of TEShannon.","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing DynamicalSystemsBase\nusing StableRNGs; rng = StableRNG(123)\n\n# An example system where `X → Y → Z → W`.\nsys = system(Logistic4Chain(; rng))\nx, y, z, w = columns(first(trajectory(sys, 300, Ttr = 10000)))\n\nprecise = true # precise bin edges\ndiscretization = CodifyVariables(TransferOperator(RectangularBinning(2, precise))) #\nest_disc_to = EntropyDecomposition(TERenyiJizba(), PlugIn(Renyi()), discretization);\nassociation(est_disc_to, x, y), association(est_disc_to, y, x)","category":"page"},{"location":"examples/examples_associations/#[ConvergentCrossMapping](@ref)","page":"Associations","title":"ConvergentCrossMapping","text":"","category":"section"},{"location":"examples/examples_associations/#example_ConvergentCrossMapping_RandomVectors","page":"Associations","title":"RandomVectors estimator","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"When cross-mapping with the RandomVectors estimator, a single random subsample of time indices (i.e. not in any particular order) of length l is drawn for each library size l, and cross mapping is performed using the embedding vectors corresponding to those time indices.","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Random; rng = MersenneTwister(1234)\nx, y = randn(rng, 200), randn(rng, 200)\n\n# We'll draw a single sample at each `l ∈ libsizes`. Sampling with replacement is then\n# necessary, because our 200-pt timeseries will result in embeddings with\n# less than 200 points.\nest = RandomVectors(ConvergentCrossMapping(d = 3); libsizes = 50:25:200, replace = true, rng)\ncrossmap(est, x, y)","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"To generate a distribution of cross-map estimates for each l ∈ libsizes, just call crossmap repeatedly, e.g.","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Random; rng = MersenneTwister(1234)\nusing Statistics\n\nx, y = randn(rng, 300), randn(rng, 300)\ndef = ConvergentCrossMapping(d = 3)\nlibsizes = 25:25:200\n\nρs = [[crossmap(RandomVectors(def; libsizes = L, replace = true, rng), x, y) for i = 1:50] for L in libsizes]\n\nusing CairoMakie\nf = Figure(); ax = Axis(f[1, 1]);\nplot!(ax, libsizes, mean.(ρs))\nerrorbars!(ax, libsizes, mean.(ρs), std.(ρs))\nf","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"Now, the k-th element of ρs contains 80 estimates of the correspondence measure ρ at library size libsizes[k].","category":"page"},{"location":"examples/examples_associations/#example_ConvergentCrossMapping_RandomSegment","page":"Associations","title":"RandomSegment estimator","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"When cross-mapping with the RandomSegment estimator, a single random subsample of continguous, ordered time indices of length l is drawn for each library size l, and cross mapping is performed using the embedding vectors corresponding to those time indices.","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Random; rng = MersenneTwister(1234)\nx, y = randn(rng, 200), randn(rng, 200)\n\n# We'll draw a single sample at each `l ∈ libsizes`. We limit the library size to 100, \n# because drawing segments of the data longer than half the available data doesn't make\n# much sense.\nest = RandomSegment(ConvergentCrossMapping(d = 3); libsizes = 50:25:100, rng)\ncrossmap(est, x, y)","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"As above, to generate a distribution of cross-map estimates for each l ∈ libsizes, just call crossmap repeatedly, e.g.","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Random; rng = MersenneTwister(1234)\nusing Statistics\n\nx, y = randn(rng, 200), randn(rng, 200)\ndef = ConvergentCrossMapping(d = 3)\nlibsizes = 25:25:100\n\nρs = [[crossmap(RandomSegment(def; libsizes = L, rng), x, y) for i = 1:50] for L in libsizes]\n\nf = Figure(); ax = Axis(f[1, 1]);\nplot!(ax, libsizes, mean.(ρs))\nerrorbars!(ax, libsizes, mean.(ρs), std.(ρs))\nf","category":"page"},{"location":"examples/examples_associations/#[PairwiseAsymmetricInference](@ref)","page":"Associations","title":"PairwiseAsymmetricInference","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"We repeat the analyses above, but here use the pairwise asymmetric inference algorithm instead of the convergent cross map algorithm.","category":"page"},{"location":"examples/examples_associations/#example_PairwiseAsymmetricInference_RandomVectors","page":"Associations","title":"RandomVectors estimator","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Random; rng = MersenneTwister(1234)\nx, y = randn(rng, 300), randn(rng, 300)\n\n# We'll draw a single sample at each `l ∈ libsizes`. Sampling with replacement is then\n# necessary, because our 200-pt timeseries will result in embeddings with\n# less than 200 points.\nest = RandomVectors(PairwiseAsymmetricInference(d = 3); libsizes = 50:25:200, replace = true, rng)\ncrossmap(est, x, y)","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"To generate a distribution of cross-map estimates for each l ∈ libsizes, just call crossmap repeatedly, e.g.","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Random; rng = MersenneTwister(1234)\nusing Statistics\n\nx, y = randn(rng, 300), randn(rng,300)\ndef = PairwiseAsymmetricInference(d = 3)\nlibsizes = 25:25:200\n\nρs = [[crossmap(RandomVectors(def; libsizes = L, replace = true, rng), x, y) for i = 1:50] for L in libsizes]\n\nusing CairoMakie\nf = Figure(); ax = Axis(f[1, 1]);\nplot!(ax, libsizes, mean.(ρs))\nerrorbars!(ax, libsizes, mean.(ρs), std.(ρs))\nf","category":"page"},{"location":"examples/examples_associations/#example_PairwiseAsymmetricInference_RandomSegment","page":"Associations","title":"RandomSegment estimator","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Random; rng = MersenneTwister(1234)\nx, y = randn(rng, 200), randn(rng, 200)\n\n# We'll draw a single sample at each `l ∈ libsizes`. We limit the library size to 100, \n# because drawing segments of the data longer than half the available data doesn't make\n# much sense.\nest = RandomSegment(PairwiseAsymmetricInference(d = 3); libsizes = 50:25:100, rng)\ncrossmap(est, x, y)","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"As above, to generate a distribution of cross-map estimates for each l ∈ libsizes, just call crossmap repeatedly, e.g.","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Random; rng = MersenneTwister(1234)\nusing Statistics\n\nx, y = randn(rng, 300), randn(rng, 300)\ndef = PairwiseAsymmetricInference(d = 3)\nlibsizes = 25:25:100\n\nρs = [[crossmap(RandomSegment(def; libsizes = L, rng), x, y) for i = 1:50] for L in libsizes]\n\nusing CairoMakie\nf = Figure(); ax = Axis(f[1, 1]);\nplot!(ax, libsizes, mean.(ρs))\nerrorbars!(ax, libsizes, mean.(ρs), std.(ρs))\nf","category":"page"},{"location":"examples/examples_associations/#example_MCR","page":"Associations","title":"MCR","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"To quantify association by the mean conditional probability of recurrence (MCR), we'll create a chain of variables where X drives Y, which in turn drives Z. We then expect there to be significant detectable association between both X and Y, Y and Z and also X and Z (because Y transfers information from X to Z. We expect the association between X and Z to disappear when conditioning on Y (since we're then \"removing the effect\" of Y).","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Random; rng = Xoshiro(1234);\nx = rand(rng, 300); y = rand(rng, 300) .* sin.(x); z = rand(rng, 300) .* y;\nest = MCR(r = 0.5)\nassociation(est, x, y), association(est, x, z), association(est, y, z), association(est, x, z, y)","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"The interpretation of the MCR measure is that if two variables are symmetrically coupled, then the conditional recurrence in both directions is equal. Two variables that are uncoupled are symmetrically coupled (i.e. no coupling). We therefore expect the difference in conditional recurrence to be around zero.","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Random; rng = Xoshiro(1234)\nx = rand(rng, 300)\ny = rand(rng, 300)\nm = MCR(r = 0.5)\nΔ = association(m, x, y) - association(m, y, x)","category":"page"},{"location":"examples/examples_associations/#example_RMCD","page":"Associations","title":"RMCD","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"To quantify association by the recurrence measure of conditional dependence (RMCD), we'll create a chain of variables where X drives Y, which in turn drives Z. We then expect there to be significant detectable association between both X and Y, Y and Z and also X and Z (because Y transfers information from X to Z. We expect the association between X and Z to disappear when conditioning on Y (since we're then \"removing the effect\" of Y).","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Random; rng = Xoshiro(1234);\nx = rand(rng, 300); y = rand(rng, 300) .* sin.(x); z = rand(rng, 300) .* y;\nest = RMCD(r = 0.5)\nassociation(est, x, y), association(est, x, z), association(est, x, z, y)","category":"page"},{"location":"examples/examples_associations/#example_ChatterjeeCorrelation","page":"Associations","title":"ChatterjeeCorrelation","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Random; rng = Xoshiro(1234);\nx = rand(rng, 120)\ny = rand(rng, 120) .* sin.(x)","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"By construction, there will almust surely be no ties in x, so we can use the fast estimate by setting handle_ties == false. ","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"association(ChatterjeeCorrelation(handle_ties = false), x, y)","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"If we have data where we know there are ties in the data, then we should set handle_ties == true.","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"w = rand(rng, 1:10, 120) # there will be some ties\nz = rand(rng, 1:15, 120) .* sin.(w) # introduce some dependence\nassociation(ChatterjeeCorrelation(handle_ties = true), w, z)","category":"page"},{"location":"examples/examples_associations/#example_AzadkiaChatterjeeCoefficient","page":"Associations","title":"AzadkiaChatterjeeCoefficient","text":"","category":"section"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"using Associations\nusing Random; rng = Xoshiro(1234);\nx = rand(rng, 120)\ny = rand(rng, 120) .* x\nz = rand(rng, 120) .+ y","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"For the variables above, where x → y → z, we expect stronger assocation between x and y than between x and z. We also expect the strength of the association between x and z to drop when conditioning on y, because y is the variable that connects x and z.","category":"page"},{"location":"examples/examples_associations/","page":"Associations","title":"Associations","text":"m = AzadkiaChatterjeeCoefficient(theiler = 0) # only exclude self-neighbors\nassociation(m, x, y), association(m, x, z), association(m, x, z, y)","category":"page"},{"location":"api/information_single_variable_api/","page":"Single-variable information API","title":"Single-variable information API","text":"CollapsedDocStrings = true","category":"page"},{"location":"api/information_single_variable_api/#Single-variable-information-API","page":"Single-variable information API","title":"Single-variable information API","text":"","category":"section"},{"location":"api/information_single_variable_api/","page":"Single-variable information API","title":"Single-variable information API","text":"Below we list some relevant functions types from ComplexityMeasures.jl that are used for the EntropyDecomposition estimator.","category":"page"},{"location":"api/information_single_variable_api/","page":"Single-variable information API","title":"Single-variable information API","text":"information","category":"page"},{"location":"api/information_single_variable_api/#ComplexityMeasures.information","page":"Single-variable information API","title":"ComplexityMeasures.information","text":"information([die::DiscreteInfoEstimator,] [est::ProbabilitiesEstimator,] o::OutcomeSpace, x) → h::Real\ninformation(o::OutcomeSpace, x) → h::Real\n\nEstimate a discrete information measure from input data x using the provided DiscreteInfoEstimator and ProbabilitiesEstimator over the given OutcomeSpace.\n\nAs an alternative, you can provide an InformationMeasure for the first argument (die) which will default to PlugIn estimation) for the information estimation. You may also skip the first argument (die), in which case Shannon() will be used. You may also skip the second argument (est), which will default to the RelativeAmount probabilities estimator. Note that some information measure estimators (e.g., GeneralizedSchuermann) operate directly on counts and hence ignore est.\n\ninformation([e::DiscreteInfoEstimator,] p::Probabilities) → h::Real\ninformation([e::DiscreteInfoEstimator,] c::Counts) → h::Real\n\nLike above, but estimate the information measure from the pre-computed Probabilities p or Counts. Counts are converted into probabilities using RelativeAmount, unless the estimator e uses counts directly.\n\nSee also: information_maximum, information_normalized for a normalized version.\n\nExamples (naive estimation)\n\nThe simplest way to estimate a discrete measure is to provide the InformationMeasure directly in combination with an OutcomeSpace. This will use the \"naive\" PlugIn estimator for the measure, and the \"naive\" RelativeAmount estimator for the probabilities.\n\nx = randn(100) # some input data\no = ValueBinning(RectangularBinning(5)) # a 5-bin histogram outcome space\nh_s = information(Shannon(), o, x)\n\nHere are some more examples:\n\nx = [rand(Bool) for _ in 1:10000] # coin toss\nps = probabilities(x) # gives about [0.5, 0.5] by definition\nh = information(ps) # gives 1, about 1 bit by definition (Shannon entropy by default)\nh = information(Shannon(), ps) # syntactically equivalent to the above\nh = information(Shannon(), UniqueElements(), x) # syntactically equivalent to above\nh = information(Renyi(2.0), ps) # also gives 1, order `q` doesn't matter for coin toss\nh = information(OrdinalPatterns(;m=3), x) # gives about 2, again by definition\n\nExamples (bias-corrected estimation)\n\nIt is known that both PlugIn estimation for information measures and RelativeAmount estimation for probabilities are biased. The scientific literature abounds with estimators that correct for this bias, both on the measure-estimation level and on the probability-estimation level. We thus provide the option to use any DiscreteInfoEstimator in combination with any ProbabilitiesEstimator for improved estimates. Note that custom probabilites estimators will only work with counting-compatible OutcomeSpace.\n\nx = randn(100)\no = ValueBinning(RectangularBinning(5))\n\n# Estimate Shannon entropy estimation using various dedicated estimators\nh_s = information(MillerMadow(Shannon()), RelativeAmount(), o, x)\nh_s = information(HorvitzThompson(Shannon()), Shrinkage(), o, x)\nh_s = information(Schuermann(Shannon()), Shrinkage(), o, x)\n\n# Estimate information measures using the generic `Jackknife` estimator\nh_r = information(Jackknife(Renyi()), Shrinkage(), o, x)\nj_t = information(Jackknife(TsallisExtropy()), BayesianRegularization(), o, x)\nj_r = information(Jackknife(RenyiExtropy()), RelativeAmount(), o, x)\n\n\n\n\n\ninformation(est::DifferentialInfoEstimator, x) → h::Real\n\nEstimate a differential information measure using the provided DifferentialInfoEstimator and input data x.\n\nDescription\n\nThe overwhelming majority of differential estimators estimate the Shannon entropy. If the same estimator can estimate different information measures (e.g. it can estimate both Shannon and Tsallis), then the information measure is provided as an argument to the estimator itself.\n\nSee the table of differential information measure estimators in the docs for all differential information measure estimators.\n\nCurrently, unlike for the discrete information measures, this method doesn't involve explicitly first computing a probability density function and then passing this density to an information measure definition. But in the future, we want to establish a density API similar to the probabilities API.\n\nExamples\n\nTo compute the differential version of a measure, give it as the first argument to a DifferentialInfoEstimator and pass it to information.\n\nx = randn(1000)\nh_sh = information(Kraskov(Shannon()), x)\nh_vc = information(Vasicek(Shannon()), x)\n\nA normal distribution has a base-e Shannon differential entropy of 0.5*log(2π) + 0.5 nats.\n\nest = Kraskov(k = 5, base = ℯ) # Base `ℯ` for nats.\nh = information(est, randn(2_000_000))\nabs(h - 0.5*log(2π) - 0.5) # ≈ 0.0001\n\n\n\n\n\ninformation(est::MultivariateInformationMeasureEstimator, x...)\n\nEstimate some MultivariateInformationMeasure on input data x..., using the given MultivariateInformationMeasureEstimator.\n\nThis is just a convenience wrapper around association(est, x...).\n\n\n\n\n\n","category":"function"},{"location":"api/information_single_variable_api/#Single-variable-information-measures","page":"Single-variable information API","title":"Single-variable information measures","text":"","category":"section"},{"location":"api/information_single_variable_api/","page":"Single-variable information API","title":"Single-variable information API","text":"Shannon\nRenyi\nTsallis\nKaniadakis","category":"page"},{"location":"api/information_single_variable_api/#ComplexityMeasures.Shannon","page":"Single-variable information API","title":"ComplexityMeasures.Shannon","text":"Shannon <: InformationMeasure\nShannon(; base = 2)\n\nThe Shannon (Shannon, 1948) entropy, used with information to compute:\n\nH(p) = - sum_i pi log(pi)\n\nwith the log at the given base.\n\nThe maximum value of the Shannon entropy is log_base(L), which is the entropy of the uniform distribution with L the total_outcomes.\n\n\n\n\n\n","category":"type"},{"location":"api/information_single_variable_api/#ComplexityMeasures.Renyi","page":"Single-variable information API","title":"ComplexityMeasures.Renyi","text":"Renyi <: InformationMeasure\nRenyi(q, base = 2)\nRenyi(; q = 1.0, base = 2)\n\nThe Rényi generalized order-q entropy (Rényi, 1961), used with information to compute an entropy with units given by base (typically 2 or MathConstants.e).\n\nDescription\n\nLet p be an array of probabilities (summing to 1). Then the Rényi generalized entropy is\n\nH_q(p) = frac11-q log left(sum_i pi^qright)\n\nand generalizes other known entropies, like e.g. the information entropy (q = 1, see Shannon (1948)), the maximum entropy (q=0, also known as Hartley entropy), or the correlation entropy (q = 2, also known as collision entropy).\n\nThe maximum value of the Rényi entropy is log_base(L), which is the entropy of the uniform distribution with L the total_outcomes.\n\n\n\n\n\n","category":"type"},{"location":"api/information_single_variable_api/#ComplexityMeasures.Tsallis","page":"Single-variable information API","title":"ComplexityMeasures.Tsallis","text":"Tsallis <: InformationMeasure\nTsallis(q; k = 1.0, base = 2)\nTsallis(; q = 1.0, k = 1.0, base = 2)\n\nThe Tsallis generalized order-q entropy (Tsallis, 1988), used with information to compute an entropy.\n\nbase only applies in the limiting case q == 1, in which the Tsallis entropy reduces to Shannon entropy.\n\nDescription\n\nThe Tsallis entropy is a generalization of the Boltzmann-Gibbs entropy, with k standing for the Boltzmann constant. It is defined as\n\nS_q(p) = frackq - 1left(1 - sum_i pi^qright)\n\nThe maximum value of the Tsallis entropy is k(L^1 - q - 1)(1 - q), with L the total_outcomes.\n\n\n\n\n\n","category":"type"},{"location":"api/information_single_variable_api/#ComplexityMeasures.Kaniadakis","page":"Single-variable information API","title":"ComplexityMeasures.Kaniadakis","text":"Kaniadakis <: InformationMeasure\nKaniadakis(; κ = 1.0, base = 2.0)\n\nThe Kaniadakis entropy (Tsallis, 2009), used with information to compute\n\nH_K(p) = -sum_i=1^N p_i f_kappa(p_i)\n\nf_kappa (x) = dfracx^kappa - x^-kappa2kappa\n\nwhere if kappa = 0, regular logarithm to the given base is used, and 0 probabilities are skipped.\n\n\n\n\n\n","category":"type"},{"location":"api/information_single_variable_api/#Discrete-information-estimators","page":"Single-variable information API","title":"Discrete information estimators","text":"","category":"section"},{"location":"api/information_single_variable_api/","page":"Single-variable information API","title":"Single-variable information API","text":"DiscreteInfoEstimator\nPlugIn\nMillerMadow\nSchuermann\nGeneralizedSchuermann\nJackknife\nHorvitzThompson\nChaoShen","category":"page"},{"location":"api/information_single_variable_api/#ComplexityMeasures.DiscreteInfoEstimator","page":"Single-variable information API","title":"ComplexityMeasures.DiscreteInfoEstimator","text":"DiscreteInfoEstimator\n\nThe supertype of all discrete information measure estimators, which are used in combination with a ProbabilitiesEstimator as input to information or related functions.\n\nThe first argument to a discrete estimator is always an InformationMeasure (defaults to Shannon).\n\nDescription\n\nA discrete InformationMeasure is a functional of a probability mass function. To estimate such a measure from data, we must first estimate a probability mass function using a ProbabilitiesEstimator from the (encoded/discretized) input data, and then apply the estimator to the estimated probabilities. For example, the Shannon entropy is typically computed using the RelativeAmount estimator to compute probabilities, which are then given to the PlugIn estimator. Many other estimators exist, not only for Shannon entropy, but other information measures as well.\n\nWe provide a library of both generic estimators such as PlugIn or Jackknife (which can be applied to any measure), as well as dedicated estimators such as MillerMadow, which computes Shannon entropy using the Miller-Madow bias correction. The list below gives a complete overview.\n\nImplementations\n\nThe following estimators are generic and can compute any InformationMeasure.\n\nPlugIn. The default, generic plug-in estimator of any information measure. It computes the measure exactly as stated in the definition, using the computed probability mass function.\nJackknife. Uses the a combination of the plug-in estimator and the jackknife principle to estimate the information measure.\n\nShannon entropy estimators\n\nThe following estimators are dedicated Shannon entropy estimators, which provide improvements over the naive PlugIn estimator.\n\nMillerMadow.\nHorvitzThompson.\nSchuermann.\nGeneralizedSchuermann.\nChaoShen.\n\ninfo: Info\nAny of the implemented DiscreteInfoEstimators can be used in combination with any ProbabilitiesEstimator as input to information. What this means is that every estimator actually comes in many different variants - one for each ProbabilitiesEstimator. For example, the MillerMadow estimator of Shannon entropy is typically calculated with RelativeAmount probabilities. But here, you can use for example the BayesianRegularization or the Shrinkage probabilities estimators instead, i.e. information(MillerMadow(), RelativeAmount(outcome_space), x) and information(MillerMadow(), BayesianRegularization(outcomes_space), x) are distinct estimators. This holds for all DiscreteInfoEstimators. Many of these estimators haven't been explored in the literature before, so feel free to explore, and please cite this software if you use it to explore some new estimator combination!\n\n\n\n\n\n","category":"type"},{"location":"api/information_single_variable_api/#ComplexityMeasures.PlugIn","page":"Single-variable information API","title":"ComplexityMeasures.PlugIn","text":"PlugIn(e::InformationMeasure) <: DiscreteInfoEstimatorGeneric\n\nThe PlugIn estimator is also called the empirical/naive/\"maximum likelihood\" estimator, and is used with information to any discrete InformationMeasure.\n\nIt computes any quantity exactly as given by its formula. When computing an information measure, which here is defined as a probabilities functional, it computes the quantity directly from a probability mass function, which is derived from maximum-likelihood (RelativeAmount estimates of the probabilities.\n\nBias of plug-in estimates\n\nThe plugin-estimator of Shannon entropy underestimates the true entropy, with a bias that grows with the number of distinct outcomes (Arora et al., 2022)(Arora et al., 2022),\n\nbias(H_S^plugin) = -dfracK-12N + o(N^-1)\n\nwhere K is the number of distinct outcomes, and N is the sample size. Many authors have tried to remedy this by proposing alternative Shannon entropy estimators. For example, the MillerMadow estimator is a simple correction to the plug-in estimator that adds back the bias term above. Many other estimators exist; see DiscreteInfoEstimators for an overview.\n\n\n\n\n\n","category":"type"},{"location":"api/information_single_variable_api/#ComplexityMeasures.MillerMadow","page":"Single-variable information API","title":"ComplexityMeasures.MillerMadow","text":"MillerMadow <: DiscreteInfoEstimatorShannon\nMillerMadow(measure::Shannon = Shannon())\n\nThe MillerMadow estimator is used with information to compute the discrete Shannon entropy according to Miller (1955).\n\nDescription\n\nThe Miller-Madow estimator of Shannon entropy is given by\n\nH_S^MM = H_S^plugin + dfracm - 12N\n\nwhere H_S^plugin is the Shannon entropy estimated using the PlugIn estimator, m is the number of bins with nonzero probability (as defined in Paninski (2003)), and N is the number of observations.\n\n\n\n\n\n","category":"type"},{"location":"api/information_single_variable_api/#ComplexityMeasures.Schuermann","page":"Single-variable information API","title":"ComplexityMeasures.Schuermann","text":"Schuermann <: DiscreteInfoEstimatorShannon\nSchuermann(definition::Shannon; a = 1.0)\n\nThe Schuermann estimator is used with information to compute the discrete Shannon entropy with the bias-corrected estimator given in Schuermann (2004).\n\nSee detailed description for GeneralizedSchuermann for details.\n\n\n\n\n\n","category":"type"},{"location":"api/information_single_variable_api/#ComplexityMeasures.GeneralizedSchuermann","page":"Single-variable information API","title":"ComplexityMeasures.GeneralizedSchuermann","text":"GeneralizedSchuermann <: DiscreteInfoEstimatorShannon\nGeneralizedSchuermann(definition = Shannon(); a = 1.0)\n\nThe GeneralizedSchuermann estimator is used with information to compute the discrete Shannon entropy with the bias-corrected estimator given in Grassberger (2022).\n\nThe \"generalized\" part of the name, as opposed to the Schuermann (2004) estimator (Schuermann), is due to the possibility of picking difference parameters a_i for different outcomes. If different parameters are assigned to the different outcomes, a must be a vector of parameters of length length(outcomes), where the outcomes are obtained using outcomes. See Grassberger (2022) for more information. If a is a real number, then a_i = a forall i, and the estimator reduces to the Schuermann estimator.\n\nDescription\n\nFor a set of N observations over M outcomes, the estimator is given by\n\nH_S^opt = varphi(N) - dfrac1N sum_i=1^M n_i G_n_i(a_i)\n\nwhere n_i is the observed frequency of the i-th outcome,\n\nG_n(a) = varphi(n) + (-1)^n int_0^a dfracx^n - 1x + 1 dx\n\nG_n(1) = G_n and G_n(0) = varphi(n), and\n\nG_n = varphi(n) + (-1)^n int_0^1 dfracx^n - 1x + 1 dx\n\n\n\n\n\n","category":"type"},{"location":"api/information_single_variable_api/#ComplexityMeasures.Jackknife","page":"Single-variable information API","title":"ComplexityMeasures.Jackknife","text":"Jackknife <: DiscreteInfoEstimatorGeneric\nJackknife(definition::InformationMeasure = Shannon())\n\nThe Jackknife estimator is used with information to compute any discrete InformationMeasure.\n\nThe Jackknife estimator uses the generic jackknife principle to reduce bias. Zahl (1977) was the first to apply the jaccknife technique in the context of Shannon entropy estimation. Here, we've generalized his estimator to work with any InformationMeasure.\n\nDescription\n\nAs an example of the jackknife technique, here is the formula for a jackknife estimate of Shannon entropy\n\nH_S^J = N H_S^plugin - dfracN-1N sum_i=1^N H_S^plugin^-i\n\nwhere N is the sample size, H_S^plugin is the plugin estimate of Shannon entropy, and H_S^plugin^-i is the plugin estimate, but computed with the i-th sample left out.\n\n\n\n\n\n","category":"type"},{"location":"api/information_single_variable_api/#ComplexityMeasures.HorvitzThompson","page":"Single-variable information API","title":"ComplexityMeasures.HorvitzThompson","text":"HorvitzThompson <: DiscreteInfoEstimatorShannon\nHorvitzThompson(measure::Shannon = Shannon())\n\nThe HorvitzThompson estimator is used with information to compute the discrete Shannon entropy according to Horvitz and Thompson (1952).\n\nDescription\n\nThe Horvitz-Thompson estimator of Shannon entropy is given by\n\nH_S^HT = -sum_i=1^M dfracp_i log(p_i) 1 - (1 - p_i)^N\n\nwhere N is the sample size and M is the number of outcomes. Given the true probability p_i of the i-th outcome, 1 - (1 - p_i)^N is the probability that the outcome appears at least once in a sample of size N (Arora et al., 2022). Dividing by this inclusion probability is a form of weighting, and compensates for situations where certain outcomes have so low probabilities that they are not often observed in a sample, for example in power-law distributions.\n\n\n\n\n\n","category":"type"},{"location":"api/information_single_variable_api/#ComplexityMeasures.ChaoShen","page":"Single-variable information API","title":"ComplexityMeasures.ChaoShen","text":"ChaoShen <: DiscreteInfoEstimatorShannon\nChaoShen(definition::Shannon = Shannon())\n\nThe ChaoShen estimator is used with information to compute the discrete Shannon entropy according to Chao and Shen (2003).\n\nDescription\n\nThis estimator is a modification of the HorvitzThompson estimator that multiplies each plugin probability estimate by an estimate of sample coverage. If f_1 is the number of singletons (outcomes that occur only once) in a sample of length N, then the sample coverage is C = 1 - dfracf_1N. The Chao-Shen estimator of Shannon entropy is then\n\nH_S^CS = -sum_i=1^M left( dfracC p_i log(C p_i)1 - (1 - C p_i)^N right)\n\nwhere N is the sample size and M is the number of outcomes. If f_1 = N, then f_1 is set to f_1 = N - 1 to ensure positive entropy (Arora et al., 2022).\n\n\n\n\n\n","category":"type"},{"location":"api/information_single_variable_api/#Differential-information-estimators","page":"Single-variable information API","title":"Differential information estimators","text":"","category":"section"},{"location":"api/information_single_variable_api/","page":"Single-variable information API","title":"Single-variable information API","text":"DifferentialInfoEstimator\nKraskov\nKozachenkoLeonenko\nZhu\nZhuSingh\nGao\nGoria\nLord\nLeonenkoProzantoSavani\nVasicek\nAlizadehArghami\nEbrahimi\nCorrea","category":"page"},{"location":"api/information_single_variable_api/#ComplexityMeasures.DifferentialInfoEstimator","page":"Single-variable information API","title":"ComplexityMeasures.DifferentialInfoEstimator","text":"DifferentialInfoEstimator\n\nThe supertype of all differential information measure estimators. These estimators compute an information measure in various ways that do not involve explicitly estimating a probability distribution.\n\nEach DifferentialInfoEstimators uses a specialized technique to approximate relevant densities/integrals, and is often tailored to one or a few types of information measures. For example, Kraskov estimates the Shannon entropy.\n\nSee information for usage.\n\nImplementations\n\nKozachenkoLeonenko.\nKraskov.\nGoria.\nGao.\nZhu\nZhuSingh.\nLord.\nAlizadehArghami.\nCorrea.\nVasicek.\nEbrahimi.\nLeonenkoProzantoSavani.\n\n\n\n\n\n","category":"type"},{"location":"api/information_single_variable_api/#ComplexityMeasures.Kraskov","page":"Single-variable information API","title":"ComplexityMeasures.Kraskov","text":"Kraskov <: DifferentialInfoEstimator\nKraskov(definition = Shannon(); k::Int = 1, w::Int = 0)\n\nThe Kraskov estimator computes the Shannon differential information of a multi-dimensional StateSpaceSet using the k-th nearest neighbor searches method from Kraskov et al. (2004), with logarithms to the base specified in definition.\n\nw is the Theiler window, which determines if temporal neighbors are excluded during neighbor searches (defaults to 0, meaning that only the point itself is excluded when searching for neighbours).\n\nDescription\n\nAssume we have samples bfx_1 bfx_2 ldots bfx_N from a continuous random variable X in mathbbR^d with support mathcalX and density functionf mathbbR^d to mathbbR. Kraskov estimates the Shannon differential entropy\n\nH(X) = int_mathcalX f(x) log f(x) dx = mathbbE-log(f(X))\n\nSee also: information, KozachenkoLeonenko, DifferentialInfoEstimator.\n\n\n\n\n\n","category":"type"},{"location":"api/information_single_variable_api/#ComplexityMeasures.KozachenkoLeonenko","page":"Single-variable information API","title":"ComplexityMeasures.KozachenkoLeonenko","text":"KozachenkoLeonenko <: DifferentialInfoEstimator\nKozachenkoLeonenko(definition = Shannon(); w::Int = 0)\n\nThe KozachenkoLeonenko estimator (Kozachenko and Leonenko, 1987) computes the Shannon differential information of a multi-dimensional StateSpaceSet, with logarithms to the base specified in definition.\n\nDescription\n\nAssume we have samples bfx_1 bfx_2 ldots bfx_N from a continuous random variable X in mathbbR^d with support mathcalX and density functionf mathbbR^d to mathbbR. KozachenkoLeonenko estimates the Shannon differential entropy\n\nH(X) = int_mathcalX f(x) log f(x) dx = mathbbE-log(f(X))\n\nusing the nearest neighbor method from Kozachenko and Leonenko (1987), as described in Charzyńska and Gambin (2016).\n\nw is the Theiler window, which determines if temporal neighbors are excluded during neighbor searches (defaults to 0, meaning that only the point itself is excluded when searching for neighbours).\n\nIn contrast to Kraskov, this estimator uses only the closest neighbor.\n\nSee also: information, Kraskov, DifferentialInfoEstimator.\n\n\n\n\n\n","category":"type"},{"location":"api/information_single_variable_api/#ComplexityMeasures.Zhu","page":"Single-variable information API","title":"ComplexityMeasures.Zhu","text":"Zhu <: DifferentialInfoEstimator\nZhu(; definition = Shannon(), k = 1, w = 0)\n\nThe Zhu estimator (Zhu et al., 2015) is an extension to KozachenkoLeonenko, and computes the Shannon differential information of a multi-dimensional StateSpaceSet, with logarithms to the base specified in definition.\n\nDescription\n\nAssume we have samples bfx_1 bfx_2 ldots bfx_N from a continuous random variable X in mathbbR^d with support mathcalX and density functionf mathbbR^d to mathbbR. Zhu estimates the Shannon differential entropy\n\nH(X) = int_mathcalX f(x) log f(x) dx = mathbbE-log(f(X))\n\nby approximating densities within hyperrectangles surrounding each point xᵢ ∈ x using using k nearest neighbor searches. w is the Theiler window, which determines if temporal neighbors are excluded during neighbor searches (defaults to 0, meaning that only the point itself is excluded when searching for neighbours).\n\nSee also: information, KozachenkoLeonenko, DifferentialInfoEstimator.\n\n\n\n\n\n","category":"type"},{"location":"api/information_single_variable_api/#ComplexityMeasures.ZhuSingh","page":"Single-variable information API","title":"ComplexityMeasures.ZhuSingh","text":"ZhuSingh <: DifferentialInfoEstimator\nZhuSingh(definition = Shannon(); k = 1, w = 0)\n\nThe ZhuSingh estimator (Zhu et al., 2015) computes the Shannon differential information of a multi-dimensional StateSpaceSet, with logarithms to the base specified in definition.\n\nDescription\n\nAssume we have samples bfx_1 bfx_2 ldots bfx_N from a continuous random variable X in mathbbR^d with support mathcalX and density functionf mathbbR^d to mathbbR. ZhuSingh estimates the Shannon differential entropy\n\nH(X) = int_mathcalX f(x) log f(x) dx = mathbbE-log(f(X))\n\nLike Zhu, this estimator approximates probabilities within hyperrectangles surrounding each point xᵢ ∈ x using using k nearest neighbor searches. However, it also considers the number of neighbors falling on the borders of these hyperrectangles. This estimator is an extension to the entropy estimator in Singh et al. (2003).\n\nw is the Theiler window, which determines if temporal neighbors are excluded during neighbor searches (defaults to 0, meaning that only the point itself is excluded when searching for neighbours).\n\nSee also: information, DifferentialInfoEstimator.\n\n\n\n\n\n","category":"type"},{"location":"api/information_single_variable_api/#ComplexityMeasures.Gao","page":"Single-variable information API","title":"ComplexityMeasures.Gao","text":"Gao <: DifferentialInfoEstimator\nGao(definition = Shannon(); k = 1, w = 0, corrected = true)\n\nThe Gao estimator (Gao et al., 09–12 May 2015) computes the Shannon differential information, using a k-th nearest-neighbor approach based on Singh et al. (2003), with logarithms to the base specified in definition.\n\nw is the Theiler window, which determines if temporal neighbors are excluded during neighbor searches (defaults to 0, meaning that only the point itself is excluded when searching for neighbours).\n\nGao et al. (09–12 May 2015) give two variants of this estimator. If corrected == false, then the uncorrected version is used. If corrected == true, then the corrected version is used, which ensures that the estimator is asymptotically unbiased.\n\nDescription\n\nAssume we have samples bfx_1 bfx_2 ldots bfx_N from a continuous random variable X in mathbbR^d with support mathcalX and density functionf mathbbR^d to mathbbR. KozachenkoLeonenko estimates the Shannon differential entropy\n\nH(X) = int_mathcalX f(x) log f(x) dx = mathbbE-log(f(X))\n\n\n\n\n\n","category":"type"},{"location":"api/information_single_variable_api/#ComplexityMeasures.Goria","page":"Single-variable information API","title":"ComplexityMeasures.Goria","text":"Goria <: DifferentialInfoEstimator\nGoria(measure = Shannon(); k = 1, w = 0)\n\nThe Goria estimator (Goria et al., 2005) computes the Shannon differential information of a multi-dimensional StateSpaceSet, with logarithms to the base specified in definition.\n\nDescription\n\nAssume we have samples bfx_1 bfx_2 ldots bfx_N from a continuous random variable X in mathbbR^d with support mathcalX and density functionf mathbbR^d to mathbbR. Goria estimates the Shannon differential entropy\n\nH(X) = int_mathcalX f(x) log f(x) dx = mathbbE-log(f(X))\n\nSpecifically, let bfn_1 bfn_2 ldots bfn_N be the distance of the samples bfx_1 bfx_2 ldots bfx_N to their k-th nearest neighbors. Next, let the geometric mean of the distances be\n\nhatrho_k = left( prod_i=1^N right)^dfrac1N\n\nGoria et al. (2005)'s estimate of Shannon differential entropy is then\n\nhatH = mhatrho_k + log(N - 1) - psi(k) + log c_1(m)\n\nwhere c_1(m) = dfrac2pi^fracm2m Gamma(m2) and psi is the digamma function.\n\n\n\n\n\n","category":"type"},{"location":"api/information_single_variable_api/#ComplexityMeasures.Lord","page":"Single-variable information API","title":"ComplexityMeasures.Lord","text":"Lord <: DifferentialInfoEstimator\nLord(measure = Shannon(); k = 10, w = 0)\n\nThe Lord estimator (Lord et al., 2018) estimates the Shannon differential information using a nearest neighbor approach with a local nonuniformity correction (LNC), with logarithms to the base specified in definition.\n\nw is the Theiler window, which determines if temporal neighbors are excluded during neighbor searches (defaults to 0, meaning that only the point itself is excluded when searching for neighbours).\n\nDescription\n\nAssume we have samples barX = bfx_1 bfx_2 ldots bfx_N from a continuous random variable X in mathbbR^d with support mathcalX and density function f mathbbR^d to mathbbR. Lord estimates the Shannon differential entropy\n\nH(X) = int_mathcalX f(x) log f(x) dx = mathbbE-log(f(X))\n\nby using the resubstitution formula\n\nhatbarX k = -mathbbElog(f(X))\napprox sum_i = 1^N log(hatf(bfx_i))\n\nwhere hatf(bfx_i) is an estimate of the density at bfx_i constructed in a manner such that hatf(bfx_i) propto dfrack(x_i) NV_i, where k(x_i) is the number of points in the neighborhood of bfx_i, and V_i is the volume of that neighborhood.\n\nWhile most nearest-neighbor based differential entropy estimators uses regular volume elements (e.g. hypercubes, hyperrectangles, hyperspheres) for approximating the local densities hatf(bfx_i), the Lord estimator uses hyperellopsoid volume elements. These hyperellipsoids are, for each query point xᵢ, estimated using singular value decomposition (SVD) on the k-th nearest neighbors of xᵢ. Thus, the hyperellipsoids stretch/compress in response to the local geometry around each sample point. This makes Lord a well-suited entropy estimator for a wide range of systems.\n\n\n\n\n\n","category":"type"},{"location":"api/information_single_variable_api/#ComplexityMeasures.LeonenkoProzantoSavani","page":"Single-variable information API","title":"ComplexityMeasures.LeonenkoProzantoSavani","text":"LeonenkoProzantoSavani <: DifferentialInfoEstimator\nLeonenkoProzantoSavani(definition = Shannon(); k = 1, w = 0)\n\nThe LeonenkoProzantoSavani estimator (Leonenko et al., 2008) computes the Shannon, Renyi, or Tsallis differential information of a multi-dimensional StateSpaceSet, with logarithms to the base specified in definition.\n\nDescription\n\nThe estimator uses k-th nearest-neighbor searches. w is the Theiler window, which determines if temporal neighbors are excluded during neighbor searches (defaults to 0, meaning that only the point itself is excluded when searching for neighbours).\n\nFor details, see Leonenko et al. (2008).\n\n\n\n\n\n","category":"type"},{"location":"api/information_single_variable_api/#ComplexityMeasures.Vasicek","page":"Single-variable information API","title":"ComplexityMeasures.Vasicek","text":"Vasicek <: DifferentialInfoEstimator\nVasicek(definition = Shannon(); m::Int = 1)\n\nThe Vasicek estimator computes the Shannon differential information of a timeseries using the method from Vasicek (1976), with logarithms to the base specified in definition.\n\nThe Vasicek estimator belongs to a class of differential entropy estimators based on order statistics, of which Vasicek (1976) was the first. It only works for timeseries input.\n\nDescription\n\nAssume we have samples barX = x_1 x_2 ldots x_N from a continuous random variable X in mathbbR with support mathcalX and density functionf mathbbR to mathbbR. Vasicek estimates the Shannon differential entropy\n\nH(X) = int_mathcalX f(x) log f(x) dx = mathbbE-log(f(X))\n\nHowever, instead of estimating the above integral directly, it makes use of the equivalent integral, where F is the distribution function for X,\n\nH(X) = int_0^1 log left(dfracddpF^-1(p) right) dp\n\nThis integral is approximated by first computing the order statistics of barX (the input timeseries), i.e. x_(1) leq x_(2) leq cdots leq x_(n). The Vasicek Shannon differential entropy estimate is then\n\nhatH_V(barX m) =\ndfrac1n\nsum_i = 1^n log left dfracn2m (barX_(i+m) - barX_(i-m)) right\n\nUsage\n\nIn practice, choice of m influences how fast the entropy converges to the true value. For small value of m, convergence is slow, so we recommend to scale m according to the time series length n and use m >= n/100 (this is just a heuristic based on the tests written for this package).\n\nSee also: information, Correa, AlizadehArghami, Ebrahimi, DifferentialInfoEstimator.\n\n\n\n\n\n","category":"type"},{"location":"api/information_single_variable_api/#ComplexityMeasures.AlizadehArghami","page":"Single-variable information API","title":"ComplexityMeasures.AlizadehArghami","text":"AlizadehArghami <: DifferentialInfoEstimator\nAlizadehArghami(definition = Shannon(); m::Int = 1)\n\nThe AlizadehArghami estimator computes the Shannon differential information of a timeseries using the method from Alizadeh and Arghami (2010), with logarithms to the base specified in definition.\n\nThe AlizadehArghami estimator belongs to a class of differential entropy estimators based on order statistics. It only works for timeseries input.\n\nDescription\n\nAssume we have samples barX = x_1 x_2 ldots x_N from a continuous random variable X in mathbbR with support mathcalX and density functionf mathbbR to mathbbR. AlizadehArghami estimates the Shannon differential entropy\n\nH(X) = int_mathcalX f(x) log f(x) dx = mathbbE-log(f(X))\n\nHowever, instead of estimating the above integral directly, it makes use of the equivalent integral, where F is the distribution function for X:\n\nH(X) = int_0^1 log left(dfracddpF^-1(p) right) dp\n\nThis integral is approximated by first computing the order statistics of barX (the input timeseries), i.e. x_(1) leq x_(2) leq cdots leq x_(n). The AlizadehArghami Shannon differential entropy estimate is then the the Vasicek estimate hatH_V(barX m n), plus a correction factor\n\nhatH_A(barX m n) = hatH_V(barX m n) +\ndfrac2nleft(m log(2) right)\n\nSee also: information, Correa, Ebrahimi, Vasicek, DifferentialInfoEstimator.\n\n\n\n\n\n","category":"type"},{"location":"api/information_single_variable_api/#ComplexityMeasures.Ebrahimi","page":"Single-variable information API","title":"ComplexityMeasures.Ebrahimi","text":"Ebrahimi <: DifferentialInfoEstimator\nEbrahimi(definition = Shannon(); m::Int = 1)\n\nThe Ebrahimi estimator computes the Shannon information of a timeseries using the method from Ebrahimi et al. (1994), with logarithms to the base specified in definition.\n\nThe Ebrahimi estimator belongs to a class of differential entropy estimators based on order statistics. It only works for timeseries input.\n\nDescription\n\nAssume we have samples barX = x_1 x_2 ldots x_N from a continuous random variable X in mathbbR with support mathcalX and density functionf mathbbR to mathbbR. Ebrahimi estimates the Shannon differential entropy\n\nH(X) = int_mathcalX f(x) log f(x) dx = mathbbE-log(f(X))\n\nHowever, instead of estimating the above integral directly, it makes use of the equivalent integral, where F is the distribution function for X,\n\nH(X) = int_0^1 log left(dfracddpF^-1(p) right) dp\n\nThis integral is approximated by first computing the order statistics of barX (the input timeseries), i.e. x_(1) leq x_(2) leq cdots leq x_(n). The Ebrahimi Shannon differential entropy estimate is then\n\nhatH_E(barX m) =\ndfrac1n sum_i = 1^n log\nleft dfracnc_i m (barX_(i+m) - barX_(i-m)) right\n\nwhere\n\nc_i =\nbegincases\n 1 + fraci - 1m 1 geq i geq m \n 2 m + 1 geq i geq n - m \n 1 + fracn - im n - m + 1 geq i geq n\nendcases\n\nSee also: information, Correa, AlizadehArghami, Vasicek, DifferentialInfoEstimator.\n\n\n\n\n\n","category":"type"},{"location":"api/information_single_variable_api/#ComplexityMeasures.Correa","page":"Single-variable information API","title":"ComplexityMeasures.Correa","text":"Correa <: DifferentialInfoEstimator\nCorrea(definition = Shannon(); m::Int = 1)\n\nThe Correa estimator computes the Shannon differential information of a timeseries using the method from Correa (1995), with logarithms to the base specified in definition.\n\nThe Correa estimator belongs to a class of differential entropy estimators based on order statistics. It only works for timeseries input.\n\nDescription\n\nAssume we have samples barX = x_1 x_2 ldots x_N from a continuous random variable X in mathbbR with support mathcalX and density functionf mathbbR to mathbbR. Correa estimates the Shannon differential entropy\n\nH(X) = int_mathcalX f(x) log f(x) dx = mathbbE-log(f(X))\n\nHowever, instead of estimating the above integral directly, Correa makes use of the equivalent integral, where F is the distribution function for X,\n\nH(X) = int_0^1 log left(dfracddpF^-1(p) right) dp\n\nThis integral is approximated by first computing the order statistics of barX (the input timeseries), i.e. x_(1) leq x_(2) leq cdots leq x_(n), ensuring that end points are included. The Correa estimate of Shannon differential entropy is then\n\nH_C(barX m n) =\ndfrac1n sum_i = 1^n log\nleft dfrac sum_j=i-m^i+m(barX_(j) -\ntildeX_(i))(j - i)n sum_j=i-m^i+m (barX_(j) - tildeX_(i))^2\nright\n\nwhere\n\ntildeX_(i) = dfrac12m + 1 sum_j = i - m^i + m X_(j)\n\nSee also: information, AlizadehArghami, Ebrahimi, Vasicek, DifferentialInfoEstimator.\n\n\n\n\n\n","category":"type"},{"location":"independence/","page":"Independence","title":"Independence","text":"CollapsedDocStrings = true","category":"page"},{"location":"independence/#independence_testing","page":"Independence","title":"Independence testing","text":"","category":"section"},{"location":"independence/","page":"Independence","title":"Independence","text":"For practical applications, it is often useful to determine whether variables are independent, possible conditioned upon another set of variables. One way of doing so is to utilize an association measure, and perform some sort of randomization-based independence testing.","category":"page"},{"location":"independence/","page":"Independence","title":"Independence","text":"For example, to test the dependence between time series, time series surrogates testing is used. Many other frameworks for independence exist too. Here, we've collected some independence testing frameworks, and made sure that they are compatible with as many of the implemented association measures as possible.","category":"page"},{"location":"independence/#Independence-testing-API","page":"Independence","title":"Independence testing API","text":"","category":"section"},{"location":"independence/","page":"Independence","title":"Independence","text":"The independence test API is defined by","category":"page"},{"location":"independence/","page":"Independence","title":"Independence","text":"independence\nIndependenceTest","category":"page"},{"location":"independence/","page":"Independence","title":"Independence","text":"independence\nIndependenceTest","category":"page"},{"location":"independence/#Associations.independence","page":"Independence","title":"Associations.independence","text":"independence(test::IndependenceTest, x, y, [z]) → summary\n\nPerform the given IndependenceTest test on data x, y and z. If only x and y are given, test must provide a bivariate association measure. If z is given too, then test must provide a conditional association measure.\n\nReturns a test summary, whose type depends on test.\n\nSee IndependenceTest for a list of compatible tests.\n\n\n\n\n\n","category":"function"},{"location":"independence/#Associations.IndependenceTest","page":"Independence","title":"Associations.IndependenceTest","text":"IndependenceTest <: IndependenceTest\n\nThe supertype for all independence tests.\n\nConcrete implementations\n\nSurrogateAssociationTest\nLocalPermutationTest\nJointDistanceDistributionTest\nCorrTest\nSECMITest\n\n\n\n\n\n","category":"type"},{"location":"independence/#[SurrogateAssociationTest](@ref)","page":"Independence","title":"SurrogateAssociationTest","text":"","category":"section"},{"location":"independence/","page":"Independence","title":"Independence","text":"SurrogateAssociationTest\nSurrogateAssociationTestResult","category":"page"},{"location":"independence/#Associations.SurrogateAssociationTest","page":"Independence","title":"Associations.SurrogateAssociationTest","text":"SurrogateAssociationTest <: IndependenceTest\nSurrogateAssociationTest(est_or_measure;\n nshuffles::Int = 100,\n surrogate = RandomShuffle(),\n rng = Random.default_rng(),\n show_progress = false,\n)\n\nA surrogate-data based generic (conditional) independence test for assessing whether the association between variables X and Y are independent, potentially conditioned on a third variable Z.\n\nCompatible estimators and measures\n\nCompatible with AssociationMeasures that measure some sort of pairwise or conditional association.\n\nnote: Note\nYou must yourself determine whether using a particular measure is meaningful, and what it means.\n\nnote: Note\nIf used with a TransferEntropy measure such as TEShannon, then the source variable is always shuffled, and the target and conditional variable are left unshuffled.\n\nUsage\n\nUse with independence to perform a surrogate test with input data. This will return a SurrogateAssociationTestResult.\n\nDescription\n\nThis is a generic one-sided hypothesis test that checks whether x and y are independent (given z, if provided) based on resampling from a null distribution assumed to represent independence between the variables. The null distribution is generated by repeatedly shuffling the input data in some way that is intended to break any dependence between the input variables.\n\nThe test first estimates the desired statistic using est_or_measure on the input data. Then, the first input variable is shuffled nshuffled times according to the given surrogate method (each type of surrogate represents a distinct null hypothesis). For each shuffle, est_or_measure is recomputed and the results are stored. \n\nExamples\n\nExample 1: SMeasure test for pairwise independence.\nExample 2: DistanceCorrelation test for pairwise independence.\nExample 3: PartialCorrelation test for conditional independence.\nExample 4: MIShannon test for pairwise independence on categorical data.\nExample 5: CMIShannon test for conditional independence on categorical data. \nExample 6: MCR test for pairwise and conditional independence. \nExample 7. ChatterjeeCorrelation test for pairwise independence.\nExample 8. AzadkiaChatterjeeCoefficient test for pairwise and conditional independence.\n\n\n\n\n\n","category":"type"},{"location":"independence/#Associations.SurrogateAssociationTestResult","page":"Independence","title":"Associations.SurrogateAssociationTestResult","text":"SurrogateAssociationTestResult(m, m_surr, pvalue)\n\nHolds the result of a SurrogateAssociationTest. m is the measure computed on the original data. m_surr is a vector of the measure computed on permuted data, where m_surr[i] is the measure compute on the i-th permutation. pvalue is the one-sided p-value for the test.\n\n\n\n\n\n","category":"type"},{"location":"independence/#[LocalPermutationTest](@ref)","page":"Independence","title":"LocalPermutationTest","text":"","category":"section"},{"location":"independence/","page":"Independence","title":"Independence","text":"LocalPermutationTest\nLocalPermutationTestResult","category":"page"},{"location":"independence/#Associations.LocalPermutationTest","page":"Independence","title":"Associations.LocalPermutationTest","text":"LocalPermutationTest <: IndependenceTest\nLocalPermutationTest(measure, [est];\n kperm::Int = 5,\n nshuffles::Int = 100,\n rng = Random.default_rng(),\n replace = true,\n w::Int = 0,\n show_progress = false)\n\nLocalPermutationTest is a generic conditional independence test (Runge, 09–11 Apr 2018) for assessing whether two variables X and Y are conditionally independendent given a third variable Z (all of which may be multivariate).\n\nWhen used with independence, a LocalPermutationTestResult is returned.\n\nDescription\n\nThis is a generic one-sided hypothesis test that checks whether X and Y are independent (given Z, if provided) based on resampling from a null distribution assumed to represent independence between the variables. The null distribution is generated by repeatedly shuffling the input data in some way that is intended to break any dependence between x and y, but preserve dependencies between x and z.\n\nThe algorithm is as follows:\n\nCompute the original conditional independence statistic I(X; Y | Z).\nAllocate a scalar valued vector Î with space for nshuffles elements.\nFor k ∈ [1, 2, …, nshuffles], repeat\nFor each zᵢ ∈ Y, let nᵢ be time indices of the kperm nearest neighbors of zᵢ, excluding the w nearest neighbors of zᵢ from the neighbor query (i.e w is the Theiler window).\nLet xᵢ⋆ = X[j], where j is randomly sampled from nᵢ with replacement. This way, xᵢ is replaced with xⱼ only if zᵢ ≈ zⱼ (zᵢ and zⱼ are close). Repeat for i = 1, 2, …, n and obtain the shuffled X̂ = [x̂₁, x̂₂, …, x̂ₙ].\nCompute the conditional independence statistic Iₖ(X̂; Y | Z).\nLet Î[k] = Iₖ(X̂; Y | Z).\nCompute the p-value as count(Î[k] .<= I) / nshuffles).\n\nIn additional to the conditional variant from Runge (2018), we also provide a pairwise version, where the shuffling procedure is identical, except neighbors in Y are used instead of Z and we I(X; Y) and Iₖ(X̂; Y) instead of I(X; Y | Z) and Iₖ(X̂; Y | Z).\n\nCompatible measures\n\nMeasure Pairwise Conditional Requires est Note\nPartialCorrelation ✖ ✓ No \nDistanceCorrelation ✖ ✓ No \nCMIShannon ✖ ✓ Yes \nTEShannon ✓ ✓ Yes Pairwise tests not possible with TransferEntropyEstimators, only lower-level estimators, e.g. FPVP, GaussianMI or Kraskov\nPartialMutualInformation ✖ ✓ Yes \nAzadkiaChatterjeeCoefficient ✖ ✓ No \n\nThe LocalPermutationTest is only defined for conditional independence testing. Exceptions are for measures like TEShannon, which use conditional measures under the hood even for their pairwise variants, and are therefore compatible with LocalPermutationTest.\n\nThe nearest-neighbor approach in Runge (2018) can be reproduced by using the CMIShannon measure with the FPVP estimator.\n\nExamples\n\nExample 1: Conditional independence test using CMIShannon\nExample 2): Conditional independence test using TEShannon\nExample 3: Conditional independence test using AzadkiaChatterjeeCoefficient\n\n\n\n\n\n","category":"type"},{"location":"independence/#Associations.LocalPermutationTestResult","page":"Independence","title":"Associations.LocalPermutationTestResult","text":"LocalPermutationTestResult(m, m_surr, pvalue)\n\nHolds the result of a LocalPermutationTest. m is the measure computed on the original data. m_surr is a vector of the measure computed on permuted data, where m_surr[i] is the measure compute on the i-th permutation. pvalue is the one-sided p-value for the test.\n\n\n\n\n\n","category":"type"},{"location":"independence/#[JointDistanceDistributionTest](@ref)","page":"Independence","title":"JointDistanceDistributionTest","text":"","category":"section"},{"location":"independence/","page":"Independence","title":"Independence","text":"JointDistanceDistributionTest\nJDDTestResult","category":"page"},{"location":"independence/#Associations.JointDistanceDistributionTest","page":"Independence","title":"Associations.JointDistanceDistributionTest","text":"JointDistanceDistributionTest <: IndependenceTest\nJointDistanceDistributionTest(measure::JointDistanceDistribution; rng = Random.default_rng())\n\nAn independence test for two variables based on the JointDistanceDistribution (Amigó and Hirata, 2018).\n\nWhen used with independence, a JDDTestResult is returned.\n\nDescription\n\nThe joint distance distribution (labelled Δ in their paper) is used by Amigó & Hirata (2018) to detect directional couplings of the form X to Y or Y to X. JointDistanceDistributionTest formulates their method as an independence test.\n\nFormally, we test the hypothesis H_0 (the variables are independent) against H_1 (there is directional coupling between the variables). To do so, we use a right-sided/upper-tailed t-test to check mean of Δ is skewed towards positive value, i.e.\n\nH_0 = mu(Delta) = 0\nH_1 = mu(Delta) 0.\n\nWhen used with independence, a JDDTestResult is returned, which contains the joint distance distribution and a p-value. If you only need Δ, use association with a JointDistanceDistribution instance directly.\n\nExamples\n\nExample 1. Detecting (in)dependence in bidirectionally coupled logistic maps.\n\n\n\n\n\n","category":"type"},{"location":"independence/#Associations.JDDTestResult","page":"Independence","title":"Associations.JDDTestResult","text":"JDDTestResult(Δjdd, hypothetical_μ, pvalue)\n\nHolds the results of JointDistanceDistributionTest. Δjdd is the Δ-distribution, hypothetical_μ is the hypothetical mean of the Δ-distribution under the null, and pvalue is the p-value for the one-sided t-test.\n\n\n\n\n\n","category":"type"},{"location":"independence/#[CorrTest](@ref)","page":"Independence","title":"CorrTest","text":"","category":"section"},{"location":"independence/","page":"Independence","title":"Independence","text":"CorrTest\nCorrTestResult","category":"page"},{"location":"independence/#Associations.CorrTest","page":"Independence","title":"Associations.CorrTest","text":"CorrTest <: IndependenceTest\nCorrTest()\n\nAn independence test based correlation (for two variables) and partial correlation (for three variables) (Levy and Narula, 1978); as described in Schmidt et al. (2018).\n\nUses PearsonCorrelation and PartialCorrelation internally.\n\nAssumes that the input data are (multivariate) normally distributed. Then ρ(X, Y) = 0 implies X ⫫ Y and ρ(X, Y | 𝐙) = 0 implies X ⫫ Y | 𝐙.\n\nDescription\n\nThe null hypothesis is H₀ := ρ(X, Y | 𝐙) = 0. We use the approach in Levy & Narula (1978)(Levy and Narula, 1978) and compute the Z-transformation of the observed (partial) correlation coefficient hatrho_XYbfZ:\n\nZ(hatrho_XYbfZ) =\nlogdfrac1 + hatrho_XYbfZ1 - hatrho_XYbfZ\n\nTo test the null hypothesis against the alternative hypothesis H₁ := ρ(X, Y | 𝐙) > 0, calculate\n\nhatZ = dfrac12dfracZ(hatrho_XYbfZ) - Z(0)sqrt1(n - d - 3)\n\nand compute the two-sided p-value (Schmidt et al., 2018)\n\np(X Y bfZ) = 2(1 - phi(sqrtn - d - 3Z(hatrho_XYbfZ)))\n\nwhere d is the dimension of bfZ and n is the number of samples. For the pairwise case, the procedure is identical, but set bfZ = emptyset.\n\nExamples\n\nExample 1. Pairwise and conditional tests for independence on coupled noise processes.\n\n\n\n\n\n","category":"type"},{"location":"independence/#Associations.CorrTestResult","page":"Independence","title":"Associations.CorrTestResult","text":"CorrTestResult(pvalue, ρ, z)\n\nA simple struct that holds the results of a CorrTest test: the (partial) correlation coefficient ρ, Fisher's z, and pvalue - the two-sided p-value for the test.\n\n\n\n\n\n","category":"type"},{"location":"independence/#[SECMITest](@ref)","page":"Independence","title":"SECMITest","text":"","category":"section"},{"location":"independence/","page":"Independence","title":"Independence","text":"SECMITest\nSECMITestResult","category":"page"},{"location":"independence/#Associations.SECMITest","page":"Independence","title":"Associations.SECMITest","text":"SECMITest <: IndependenceTest\nSECMITest(est; nshuffles = 19, surrogate = RandomShuffle(), rng = Random.default_rng())\n\nA test for conditional independence based on the ShortExpansionConditionalMutualInformation measure (Kubkowski et al., 2021).\n\nThe first argument est must be a InformationMeasureEstimator that provides the ShortExpansionConditionalMutualInformation instance. See examples below.\n\nExamples\n\nExample 1: Independence test for small sample sizes using CodifyVariables with ValueBinning discretization.\nExample 2: Independence test for small sample sizes with categorical data (using CodifyVariables with UniqueElements discretization).\n\n\n\n\n\n","category":"type"},{"location":"independence/#Associations.SECMITestResult","page":"Independence","title":"Associations.SECMITestResult","text":"SECMITestResult <: IndependenceTestResult\nSECMITestResult(secmi₀, secmiₖ, p, μ̂, σ̂, emp_cdf, D𝒩, D𝒳², nshuffles::Int)\n\nA simple struct that holds the computed parameters of a SECMITest when called with independence, as described in (Kubkowski et al., 2021).\n\nParameters\n\np: The p-value for the test.\nsecmi₀: The value of the ShortExpansionConditionalMutualInformation measure estimated on the original data.\nsecmiₖ: An ensemble of values for the ShortExpansionConditionalMutualInformation measure estimated on triples SECMI(X̂, Y, Z), where X̂ indicates a shuffled version of the first variable X and length(secmiₖ) == nshuffles.\nμ̂: The estimated mean of the secmiₖ.\nσ̂: The estimated standard deviation of the secmiₖ.\nemp_cdf: The empirical cumulative distribution function (CDF) of the secmiₖs.\nD𝒩: The D_N(hatmu hatsigma) statistic.\nD𝒳²: The D_chi^2 statistic.\n\n\n\n\n\n","category":"type"},{"location":"examples/examples_independence/#examples_independence","page":"Independence testing","title":"Examples of independence testing","text":"","category":"section"},{"location":"examples/examples_independence/#example_CorrTest","page":"Independence testing","title":"CorrTest","text":"","category":"section"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"using Associations\nusing Random; rng = Xoshiro(1234)\n\n# Some normally distributed data\nX = randn(rng, 1000) \nY = 0.5*randn(rng, 1000) .+ X\nZ = 0.5*randn(rng, 1000) .+ Y\nW = randn(rng, 1000);","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"Let's test a few independence relationships. For example, we expect that X ⫫ W. We also expect dependence X !⫫ Z, but this dependence should vanish when conditioning on the intermediate variable, so we expect X ⫫ Z | Y.","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"independence(CorrTest(), X, W)","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"As expected, the outcome is that we can't reject the null hypothesis that X ⫫ W.","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"independence(CorrTest(), X, Z)","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"However, we can reject the null hypothesis that X ⫫ Z, so the evidence favors the alternative hypothesis X !⫫ Z.","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"independence(CorrTest(), X, Z, Y)","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"As expected, the correlation between X and Z significantly vanishes when conditioning on Y, because Y is solely responsible for the observed correlation between X and Y.","category":"page"},{"location":"examples/examples_independence/#examples_independence_JointDistanceDistributionTest","page":"Independence testing","title":"JointDistanceDistributionTest","text":"","category":"section"},{"location":"examples/examples_independence/#Bidirectionally-coupled-logistic-maps","page":"Independence testing","title":"Bidirectionally coupled logistic maps","text":"","category":"section"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"Let's use the built-in logistic2_bidir discrete dynamical system to create a pair of bidirectionally coupled time series and use the JointDistanceDistributionTest to see if we can confirm from observed time series that these variables are bidirectionally coupled. We'll use a significance level of 1 - α = 0.99, i.e. α = 0.01.","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"using Associations\nusing DynamicalSystemsBase\nusing Random; rng = Xoshiro(1234)\nBase.@kwdef struct Logistic2Bidir{V, C1, C2, R1, R2, Σx, Σy, R}\n xi::V = [0.5, 0.5]\n c_xy::C1 = 0.1\n c_yx::C2 = 0.1\n r₁::R1 = 3.78\n r₂::R2 = 3.66\n σ_xy::Σx = 0.05\n σ_yx::Σy = 0.05\n rng::R = Random.default_rng()\nend\n\nfunction system(definition::Logistic2Bidir)\n return DiscreteDynamicalSystem(eom_logistic2bidir, definition.xi, definition)\nend\n\nfunction eom_logistic2bidir(u, p::Logistic2Bidir, t)\n (; xi, c_xy, c_yx, r₁, r₂, σ_xy, σ_yx, rng) = p\n x, y = u\n f_xy = (y + c_xy*(x + σ_xy * rand(rng)) ) / (1 + c_xy*(1+σ_xy))\n f_yx = (x + c_yx*(y + σ_yx * rand(rng)) ) / (1 + c_yx*(1+σ_yx))\n dx = r₁ * (f_yx) * (1 - f_yx)\n dy = r₂ * (f_xy) * (1 - f_xy)\n return SVector{2}(dx, dy)\nend","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"We start by generating some time series and configuring the test.","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"using Associations\nsys = system(Logistic2Bidir(c_xy = 0.5, c_yx = 0.4))\nx, y = columns(first(trajectory(sys, 2000, Ttr = 10000)))\nmeasure = JointDistanceDistribution(D = 5, B = 5)\ntest = JointDistanceDistributionTest(measure)","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"Now, we test for independence in both directions.","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"independence(test, x, y)","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"independence(test, y, x)","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"As expected, the null hypothesis is rejected in both directions at the pre-determined significance level, and hence we detect directional coupling in both directions.","category":"page"},{"location":"examples/examples_independence/#Non-coupled-logistic-maps","page":"Independence testing","title":"Non-coupled logistic maps","text":"","category":"section"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"What happens in the example above if there is no coupling?","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"sys = system(Logistic2Bidir(c_xy = 0.00, c_yx = 0.0))\nx, y = columns(first(trajectory(sys, 1000, Ttr = 10000)));\nrxy = independence(test, x, y)\nryx = independence(test, y, x)\npvalue(rxy), pvalue(ryx)","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"At significance level 0.99, we can't reject the null in either direction, hence there's not enough evidence in the data to suggest directional coupling.","category":"page"},{"location":"examples/examples_independence/#examples_surrogatetest","page":"Independence testing","title":"SurrogateAssociationTest","text":"","category":"section"},{"location":"examples/examples_independence/#example_SurrogateAssociationTest_ChatterjeeCorrelation","page":"Independence testing","title":"Chatterjee correlation","text":"","category":"section"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"using Associations\nusing Random; rng = Xoshiro(1234)\nn = 1000\nx, y = rand(1:50, n), rand(1:50, n)\ntest = SurrogateAssociationTest(ChatterjeeCorrelation(), nshuffles = 19)\nindependence(test, x, y)","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"As expected, the test indicates that we can't reject independence. What happens if we introduce a third variable that depends on y?","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"z = rand(1:20, n) .* y\nindependence(test, y, z)","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"The test clearly picks up on the functional dependence.","category":"page"},{"location":"examples/examples_independence/#example_SurrogateAssociationTest_AzadkiaChatterjeeCoefficient","page":"Independence testing","title":"Azadkia-Chatterjee coefficient","text":"","category":"section"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"using Associations\nusing Random; rng = Xoshiro(1234)\nn = 1000\n# Some categorical variables (we add a small amount of noise to avoid duplicate points \n# during neighbor searches)\nx = rand(rng, 1.0:50.0, n) .+ rand(n) .* 1e-8\ny = rand(rng, 1.0:50.0, n) .+ rand(n) .* 1e-8\ntest = SurrogateAssociationTest(AzadkiaChatterjeeCoefficient(), nshuffles = 19)\nindependence(test, x, y)","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"As expected, the test indicates that we can't reject independence. What happens if we introduce a third variable that depends on y?","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"z = rand(rng, 1.0:20.0, n) .* y\nindependence(test, y, z)","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"The test clearly picks up on the functional dependence. But what about conditioning? Let's define three variables where x → y → z. When then expect significant association between x and y, possibly between x and z (depending on how strong the intermediate connection is), and non-significant association between x and z if conditioning on y (since y is the variable connecting x and z.) The Azadkia-Chatterjee coefficient also should be able to verify these claims.","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"x = rand(rng, 120)\ny = rand(rng, 120) .* x\nz = rand(rng, 120) .+ y\nindependence(test, x, y)","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"The direct association between x and y is detected.","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"independence(test, x, z)","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"The indirect association between x and z is also detected.","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"independence(test, x, z, y)","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"We can't reject independence between x and z when taking into consideration y, as expected.","category":"page"},{"location":"examples/examples_independence/#example_SurrogateAssociationTest_DistanceCorrelation","page":"Independence testing","title":"Distance correlation","text":"","category":"section"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"using Associations\nx = randn(1000)\ny = randn(1000) .+ 0.5x\nindependence(SurrogateAssociationTest(DistanceCorrelation()), x, y)","category":"page"},{"location":"examples/examples_independence/#example_SurrogateAssociationTest_PartialCorrelation","page":"Independence testing","title":"Partial correlation","text":"","category":"section"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"using Associations\nx = randn(1000)\ny = randn(1000) .+ 0.5x\nz = randn(1000) .+ 0.8y\nindependence(SurrogateAssociationTest(PartialCorrelation()), x, z, y)","category":"page"},{"location":"examples/examples_independence/#example_SurrogateAssociationTest_SMeasure","page":"Independence testing","title":"SMeasure","text":"","category":"section"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"using Associations\nx, y = randn(1000), randn(1000)\nmeasure = SMeasure(dx = 4, dy = 3)\ns = association(measure, x, y)","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"The s statistic is larger when there is stronger coupling and smaller when there is weaker coupling. To check whether s is significant (i.e. large enough to claim directional dependence), we can use a SurrogateAssociationTest.","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"test = SurrogateAssociationTest(measure)\nindependence(test, x, y)","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"The p-value is high, and we can't reject the null at any reasonable significance level. Hence, there isn't evidence in the data to support directional coupling from x to y.","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"What happens if we use coupled variables?","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"z = x .+ 0.1y\nindependence(test, x, z)","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"Now we can confidently reject the null (independence), and conclude that there is evidence in the data to support directional dependence from x to z.","category":"page"},{"location":"examples/examples_independence/#example_SurrogateAssociationTest_MIShannon_categorical","page":"Independence testing","title":"MIShannon, categorical","text":"","category":"section"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"In this example, we expect the preference and the food variables to be independent.","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"using Associations\nusing Random; rng = Xoshiro(1234)\n# Simulate \nn = 1000\npreference = rand(rng, [\"yes\", \"no\"], n)\nfood = rand(rng, [\"veggies\", \"meat\", \"fish\"], n)\nest = JointProbabilities(MIShannon(), CodifyVariables(UniqueElements()))\ntest = SurrogateAssociationTest(est)\nindependence(test, preference, food)","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"As expected, there's not enough evidence to reject the null hypothesis that the variables are independent.","category":"page"},{"location":"examples/examples_independence/#example_SurrogateAssociationTest_CMIShannon_categorical","page":"Independence testing","title":"CMIShannon, categorical","text":"","category":"section"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"Here, we simulate a survey at a ski resort. The data are such that the place a person grew up is associated with how many times they fell while going skiing. The control happens through an intermediate variable preferred_equipment, which indicates what type of physical activity the person has engaged with in the past. Some activities like skateboarding leads to better overall balance, so people that are good on a skateboard also don't fall, and people that to less challenging activities fall more often.","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"We should be able to reject places ⫫ experience, but not reject places ⫫ experience | preferred_equipment. Let's see if we can detect these relationships using (conditional) mutual information.","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"using Associations\nusing Random; rng = Xoshiro(1234)\nn = 1000\n\nplaces = rand(rng, [\"city\", \"countryside\", \"under a rock\"], n);\npreferred_equipment = map(places) do place\n if cmp(place, \"city\") == 1\n return rand(rng, [\"skateboard\", \"bmx bike\"])\n elseif cmp(place, \"countryside\") == 1\n return rand(rng, [\"sled\", \"snowcarpet\"])\n else\n return rand(rng, [\"private jet\", \"ferris wheel\"])\n end\nend;\nexperience = map(preferred_equipment) do equipment\n if equipment ∈ [\"skateboard\", \"bmx bike\"]\n return \"didn't fall\"\n elseif equipment ∈ [\"sled\", \"snowcarpet\"]\n return \"fell 3 times or less\"\n else\n return \"fell uncontably many times\"\n end\nend;\nest_mi = JointProbabilities(MIShannon(), CodifyVariables(UniqueElements()))\ntest = SurrogateAssociationTest(est_mi)\nindependence(test, places, experience)","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"As expected, the evidence favors the alternative hypothesis that places and experience are dependent.","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"est_cmi = JointProbabilities(CMIShannon(), CodifyVariables(UniqueElements()))\ntest = SurrogateAssociationTest(est_cmi)\nindependence(test, places, experience, preferred_equipment)","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"Again, as expected, when conditioning on the mediating variable, the dependence disappears, and we can't reject the null hypothesis of independence.","category":"page"},{"location":"examples/examples_independence/#example_independence_MCR","page":"Independence testing","title":"MCR","text":"","category":"section"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"using Associations\nusing Random; rng = Xoshiro(1234)\n\nx = rand(rng, 300)\ny = rand(rng, 300)\ntest = SurrogateAssociationTest(MCR(r = 0.5); rng, nshuffles = 100, surrogate = RandomShuffle())\nindependence(test, x, y)","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"As expected, we can't reject independence. What happens if two variables are coupled?","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"using Associations\nusing Random; rng = Xoshiro(1234)\nx = rand(rng, 300)\nz = x .+ rand(rng, 300)\ntest = SurrogateAssociationTest(MCR(r = 0.5); rng, nshuffles = 100, surrogate = RandomShuffle())\nindependence(test, x, z)","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"Now, because the variables are coupled, the evidence in the data support dependence.","category":"page"},{"location":"examples/examples_independence/#example_LocalPermutationTest","page":"Independence testing","title":"LocalPermutationTest","text":"","category":"section"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"To demonstrate the local permutation test for independence, we'll again use the chain of unidirectionally coupled logistic maps.","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"We'll implement a set of chained logistic maps with unidirectional coupling.","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"using DynamicalSystemsBase\nBase.@kwdef struct Logistic4Chain{V, RX, RY, RZ, RW, C1, C2, C3, Σ1, Σ2, Σ3, RNG}\n xi::V = [0.1, 0.2, 0.3, 0.4]\n rx::RX = 3.9\n ry::RY = 3.6\n rz::RZ = 3.6\n rw::RW = 3.8\n c_xy::C1 = 0.4\n c_yz::C2 = 0.4\n c_zw::C3 = 0.35\n σ_xy::Σ1 = 0.05\n σ_yz::Σ2 = 0.05\n σ_zw::Σ3 = 0.05\n rng::RNG = Random.default_rng()\nend\n\nfunction eom_logistic4_chain(u, p::Logistic4Chain, t)\n (; xi, rx, ry, rz, rw, c_xy, c_yz, c_zw, σ_xy, σ_yz, σ_zw, rng) = p\n x, y, z, w = u\n f_xy = (y + c_xy*(x + σ_xy * rand(rng)) ) / (1 + c_xy*(1+σ_xy))\n f_yz = (z + c_yz*(y + σ_yz * rand(rng)) ) / (1 + c_yz*(1+σ_yz))\n f_zw = (w + c_zw*(z + σ_zw * rand(rng)) ) / (1 + c_zw*(1+σ_zw))\n dx = rx * x * (1 - x)\n dy = ry * (f_xy) * (1 - f_xy)\n dz = rz * (f_yz) * (1 - f_yz)\n dw = rw * (f_zw) * (1 - f_zw)\n return SVector{4}(dx, dy, dz, dw)\nend\n\n\nfunction system(definition::Logistic4Chain)\n return DiscreteDynamicalSystem(eom_logistic4_chain, definition.xi, definition)\nend","category":"page"},{"location":"examples/examples_independence/#example_LocalPermutationTest_CMIShannon","page":"Independence testing","title":"CMIShannon","text":"","category":"section"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"To estimate CMI, we'll use the Kraskov differential entropy estimator, which naively computes CMI as a sum of entropy terms without guaranteed bias cancellation.","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"using Associations\nusing Random; rng = Xoshiro(1234)\nn = 100\nX = randn(rng, n)\nY = X .+ randn(rng, n) .* 0.4\nZ = randn(rng, n) .+ Y\nx, y, z = StateSpaceSet.((X, Y, Z))\ntest = LocalPermutationTest(FPVP(CMIShannon()), nshuffles = 19)\nindependence(test, x, y, z)","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"We expect there to be a detectable influence from X to Y, if we condition on Z or not, because Z doesn't influence neither X nor Y. The null hypothesis is that the first two variables are conditionally independent given the third, which we reject with a very low p-value. Hence, we accept the alternative hypothesis that the first two variables X and Y. are conditionally dependent given Z.","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"independence(test, x, z, y)","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"As expected, we cannot reject the null hypothesis that X and Z are conditionally independent given Y, because Y is the variable that transmits information from X to Z.","category":"page"},{"location":"examples/examples_independence/#example_LocalPermutationTest_TEShannon","page":"Independence testing","title":"TEShannon","text":"","category":"section"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"Here, we demonstrate LocalPermutationTest with the TEShannon measure with default parameters and the FPVP estimator. We'll use the system of four coupled logistic maps that are linked X → Y → Z → W defined above.","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"We should expect the transfer entropy X → Z to be non-significant when conditioning on Y, because all information from X to Z is transferred through Y.","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"using Associations\nusing Random; rng = Random.default_rng()\nn = 300\nsys = system(Logistic4Chain(; xi = rand(rng, 4), rng))\nx, y, z, w = columns(trajectory(sys, n) |> first)\nest = CMIDecomposition(TEShannon(), FPVP(k = 10))\ntest = LocalPermutationTest(est, nshuffles = 19)\nindependence(test, x, z, y)","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"As expected, we cannot reject the null hypothesis that X and Z are conditionally independent given Y.","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"The same goes for variables one step up the chain:","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"independence(test, y, w, z)","category":"page"},{"location":"examples/examples_independence/#example_LocalPermutationTest_AzadkiaChatterjeeCoefficient","page":"Independence testing","title":"AzadkiaChatterjeeCoefficient","text":"","category":"section"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"using Associations\nusing Random; rng = Xoshiro(1234)\nn = 300\n# Some categorical variables (we add a small amount of noise to avoid duplicate points \n# during neighbor searches)\ntest = LocalPermutationTest(AzadkiaChatterjeeCoefficient(), nshuffles = 19)\nx = rand(rng, n)\ny = rand(rng, n) .* x\nz = rand(rng, n) .+ y","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"Let's define three variables where x → y → z. We expect a non-significant association between x and z if conditioning on y (since y is the variable connecting x and z.) ","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"independence(test, x, z, y)","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"The test verifies our expectation.","category":"page"},{"location":"examples/examples_independence/#example_SECMITEST","page":"Independence testing","title":"SECMITest","text":"","category":"section"},{"location":"examples/examples_independence/#example_SECMITEST_JointProbabilities_CodifyVariables_ValueBinning","page":"Independence testing","title":"JointProbabilities estimation on numeric data","text":"","category":"section"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"using Associations\nusing Test\nusing Random; rng = Xoshiro(1234)\nn = 25\nx = rand(rng, n)\ny = randn(rng, n) .+ x .^ 2\nz = randn(rng, n) .* y\n\n# An estimator for estimating the SECMI measure\nest = JointProbabilities(SECMI(base = 2), CodifyVariables(ValueBinning(3)))\ntest = SECMITest(est; nshuffles = 19)","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"When analyzing SECMI(x y z), the expectation is to reject the null hypothesis (independence), since x and y are connected, regardless of the effect of z.","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"independence(test, x, y, z)","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"We can detect this association, even for n = 25! When analyzing SECMI(x z y), we expect that we can't reject the null (indepdendence), precisely since x and z are not connected when \"conditioning away\" y.","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"independence(test, x, z, y)","category":"page"},{"location":"examples/examples_independence/#example_SECMITEST_JointProbabilities_CodifyVariables_UniqueElements","page":"Independence testing","title":"JointProbabilities estimation on categorical data","text":"","category":"section"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"Note that this also works for categorical variables. Just use UniqueElements to discretize!","category":"page"},{"location":"examples/examples_independence/","page":"Independence testing","title":"Independence testing","text":"using Associations\nusing Test\nusing Random; rng = Xoshiro(1234)\nn = 24\nx = rand(rng, [\"vegetables\", \"candy\"], n)\ny = [xᵢ == \"candy\" && rand(rng) > 0.3 ? \"yummy\" : \"yuck\" for xᵢ in x]\nz = [yᵢ == \"yummy\" && rand(rng) > 0.6 ? \"grown-up\" : \"child\" for yᵢ in y]\nd = CodifyVariables(UniqueElements())\nest = JointProbabilities(SECMI(base = 2), d)\n\nindependence(SECMITest(est; nshuffles = 19), x, z, y)","category":"page"},{"location":"causal_graphs/","page":"Network/graph inference","title":"Network/graph inference","text":"CollapsedDocStrings = true","category":"page"},{"location":"causal_graphs/#causal_graphs","page":"Network/graph inference","title":"Inferring causal graphs","text":"","category":"section"},{"location":"causal_graphs/","page":"Network/graph inference","title":"Network/graph inference","text":"Directed causal graphical models, estimated on observed data, is an incredibly useful framework for causal inference. There exists a plethora of methods for estimating such models.","category":"page"},{"location":"causal_graphs/","page":"Network/graph inference","title":"Network/graph inference","text":"Useful reading:","category":"page"},{"location":"causal_graphs/","page":"Network/graph inference","title":"Network/graph inference","text":"Pearl, J. Glymour, M., & Jewell, N. P. (2016). Causal inference in statistics: A primer. John Wiley & Sons. An excellent introductory book, suitable for anyone interested, from a beginners to experts.\nGlymour, C., Zhang, K., & Spirtes, P. (2019). Review of causal discovery methods based on graphical models. Frontiers in genetics, 10, 524. The authoritative overview of causal discovery from graphical models. Many more methods have also emerged since this paper.","category":"page"},{"location":"causal_graphs/#Causal-graph-API","page":"Network/graph inference","title":"Causal graph API","text":"","category":"section"},{"location":"causal_graphs/","page":"Network/graph inference","title":"Network/graph inference","text":"The API for inferring causal graphs is defined by:","category":"page"},{"location":"causal_graphs/","page":"Network/graph inference","title":"Network/graph inference","text":"infer_graph\nGraphAlgorithm, and its subtypes","category":"page"},{"location":"causal_graphs/","page":"Network/graph inference","title":"Network/graph inference","text":"infer_graph\nGraphAlgorithm","category":"page"},{"location":"causal_graphs/#Associations.infer_graph","page":"Network/graph inference","title":"Associations.infer_graph","text":"infer_graph(algorithm::GraphAlgorithm, x) → g\n\nInfer graph from input data x using the given algorithm.\n\nReturns g, whose type depends on algorithm.\n\n\n\n\n\n","category":"function"},{"location":"causal_graphs/#Associations.GraphAlgorithm","page":"Network/graph inference","title":"Associations.GraphAlgorithm","text":"GraphAlgorithm\n\nThe supertype of all causal graph inference algorithms.\n\nConcrete implementations\n\nOCE. The optimal causation entropy algorithm for time series graphs.\nPC.\n\n\n\n\n\n","category":"type"},{"location":"causal_graphs/#docs_OCE","page":"Network/graph inference","title":"Optimal causation entropy","text":"","category":"section"},{"location":"causal_graphs/","page":"Network/graph inference","title":"Network/graph inference","text":"OCE\nOCESelectedParents","category":"page"},{"location":"causal_graphs/#Associations.OCE","page":"Network/graph inference","title":"Associations.OCE","text":"OCE <: GraphAlgorithm\nOCE(; utest::IndependenceTest = SurrogateAssociationTest(MIShannon(), KSG2(k = 3, w = 3)),\n ctest::C = LocalPermutationTest(CMIShannon(), MesnerShalizi(k = 3, w = 3)),\n τmax::T = 1, α = 0.05)\n\nThe optimal causation entropy (OCE) algorithm for causal discovery Sun et al. (2015).\n\nDescription\n\nThe OCE algorithm has three steps to determine the parents of a variable xᵢ.\n\nPerform pairwise independence tests using utest and select the variable xⱼ(-τ) that has the highest significant (i.e. with associated p-value below α) association with xᵢ(0). Assign it to the set of selected parents P.\nPerform conditional independence tests using ctest, finding the parent Pₖ that has the highest association with xᵢ given the already selected parents, and add it to P. Repeat until no more variables with significant association are found.\nBackwards elimination of parents Pₖ of xᵢ(0) for which xᵢ(0) ⫫ Pₖ | P - {Pₖ}, where P is the set of parent nodes found in the previous steps.\n\nτmax indicates the maximum lag τ between the target variable xᵢ(0) and its potential parents xⱼ(-τ). Sun et al. 2015's method is based on τmax = 1.\n\nReturns\n\nWhen used with infer_graph, it returns a vector p, where p[i] are the parents for each input variable. This result can be converted to a SimpleDiGraph from Graphs.jl (see example).\n\nUsage\n\nOCE is used with infer_graph to infer the parents of the input data. Input data must either be a Vector{Vector{<:Real}}, or a StateSpaceSet.\n\nExamples\n\nInferring time series graph from a chain of logistic maps\n\n\n\n\n\n","category":"type"},{"location":"causal_graphs/#Associations.OCESelectedParents","page":"Network/graph inference","title":"Associations.OCESelectedParents","text":"OCESelectedParents\n\nA simple struct for storing the parents of a single variable xᵢ inferred by the OCE algorithm. When using OCE with infer_graph, a Vector{OCESelectedParents} is returned - one per variable in the input data.\n\nAssumptions and notation\n\nAssumes the input x is a Vector{Vector{<:Real}} or a StateSpaceSet (for which each column is treated as a variable). It contains the following fields, where we use the notation xₖ(τ) to indicate the k-th variable lagged by time-lag τ. For example, x₂(-3) is the variable x[2] lagged by 3 time steps.\n\nFields\n\ni: The index of the target variable (i.e. xᵢ(0) is the target).\nall_idxs: The possible variable indices of parent variables (i.e. 1:M, where M is the number of input variables).\nparents_js: The variable indices of the selected parent variables –- one per selected parent.\nparents_τs: The lags for the selected parent variables –- one per selected parent.\nparents: A vector containing the raw, time-lagged data for each selected parent variables. Let τ = parents_τs[k] and j = parents_js[k]. Then parents[k] is the raw data for the variable xⱼ(-τ).\n\n\n\n\n\n","category":"type"},{"location":"causal_graphs/#[PC](@ref)","page":"Network/graph inference","title":"PC","text":"","category":"section"},{"location":"causal_graphs/","page":"Network/graph inference","title":"Network/graph inference","text":"PC","category":"page"},{"location":"causal_graphs/#Associations.PC","page":"Network/graph inference","title":"Associations.PC","text":"PC <: GraphAlgorithm\nPC(pairwise_test, conditional_test;\n α = 0.05, max_depth = Inf, maxiters_orient = Inf)\n\nThe PC algorithm (Spirtes et al., 2000), which is named named after the first names of the authors, Peter Spirtes and Clark Glymour, which is implemented as described in Kalisch and Bühlmann (2008).\n\nArguments\n\npairwise_test: An IndependenceTest that uses a pairwise, nondirectional AssociationMeasure measure (e.g. a parametric CorrTest, or SurrogateAssociationTest with the MIShannon measure).\nconditional_test: An IndependenceTest that uses a conditional, nondirectional AssociationMeasure (e.g. CorrTest, or SurrogateAssociationTest with the CMIShannon measure).\n\nKeyword arguments\n\nα::Real. The significance level of the test.\nmax_depth. The maximum level of conditional indendence tests to be performed. By default, there is no limit (i.e. max_depth = Inf), meaning that maximum depth is N - 2, where N is the number of input variables.\nmaxiters_orient::Real. The maximum number of times to apply the orientation rules. By default, there is not limit (i.e. maxiters_orient = Inf).\n\ninfo: Directional measures will not give meaningful answers\nDuring the skeleton search phase, if a significance association between two nodes are is found, then a bidirectional edge is drawn between them. The generic implementation of PC therefore doesn't currently handle directional measures such as TEShannon. The reason is that if a directional relationship X → Y exists between two nodes X and Y, then the algorithm would first draw a bidirectional arrow between X and Y when analysing the direction X → Y, and then removing it again when analysing in the direction Y → X (a similar situation would also occur for the conditional stage). This will be fixed in a future release. For now, use nondirectional measures, e.g. MIShannon and CMIShannon!\n\nDescription\n\nWhen used with infer_graph on some input data x, the PC algorithm performs the following steps:\n\nInitialize an empty fully connected graph g with N nodes, where N is the number of variables and x[i] is the data for the i-th node.\nReduce the fully connected g to a skeleton graph by performing pairwise independence tests between all vertices using pairwise_test. Remove any edges where adjacent vertices are found to be independent according to the test (i.e. the null hypothesis of independence cannot be rejected at significance level 1 - α).\nThin the skeleton g by conditional independence testing. If x[i] ⫫ x[j] | x[Z] for some set of variables Z (not including i and j) according to conditional_test (i.e. the null hypothesis of conditional independence cannot be rejected at significance level 1 - α), then the edge between i and j is removed, and we record the separating set S(i, j) = Z. Independence tests are first performed for conditioning sets of size 1, and repeated for conditioning sets of increasing size, which in most cases limits the number of tests needed. The separating sets S(i, j), which records which variables were in the conditioning set that rendered variables i and j independent, are recorded. If max_depth is an integer, then this procedure is performed on conditioning sets of sizes 1:max_depth, and if max_depth == nothing, then all possible conditioning set sizes are potentially used.\nCreate a directed graph dg from g by replacing every undirected edge X - Y in g by the bidirectional edge X ↔ Y (i.e. construct two directional edges X → Y and Y → X). Orientiation rules 0-3 are then repeatedly applied to dg until no more edges can be oriented:\nRule 0 (orients v-structures): X ↔ Y ↔ Z becomes X → Y ← Z if Y is not in the separating set S(X, Z).\nRule 1 (prevents new v-structures): X → Y ↔ Z becomes X → Y → Z if X and Z are not adjacent.\nRule 2 (avoids cycles): X → Y → Z ↔ X becomes X → Y → Z ← X.\nRule 3: To avoid creating cycles or new v-structures, whenever X - Y → Z, X - W → Z, and X - Z but there is no edge between Y and W, turn the undirected X - Z edge into the directed edge X → Z.\n\nThe resulting directed graph (a SimpleDiGraph from Graphs.jl) is then returned.\n\nExamples\n\nPC algorithm with parametric independence tests\nPC algorithm with nonparametric independence tests\n\n\n\n\n\n","category":"type"},{"location":"#Associations.jl","page":"Associations.jl","title":"Associations.jl","text":"","category":"section"},{"location":"","page":"Associations.jl","title":"Associations.jl","text":"Associations","category":"page"},{"location":"#Associations","page":"Associations.jl","title":"Associations","text":"Associations\n\n(Image: CI (main)) (Image: ) (Image: ) (Image: codecov) (Image: DOI)\n\nAssociations.jl is a package for quantifying associations, independence testing and causal inference.\n\nAll further information is provided in the documentation, which you can either find online or build locally by running the docs/make.jl file.\n\nKey features\n\nAssociation API: includes measures and their estimators for pairwise, conditional and other forms of association from conventional statistics, from dynamical systems theory, and from information theory: partial correlation, distance correlation, (conditional) mutual information, transfer entropy, convergent cross mapping and a lot more!\nIndependence testing API, which is automatically compatible with every association measure estimator implemented in the package. \nCausal (network) inference API integrating the association measures and independence testing framework.\n\nAddititional features\n\nExtending on features from ComplexityMeasures.jl, we also offer \n\nDiscretization API for multiple (multivariate) input datasets.\nMultivariate counting and probability estimation API.\nMultivariate information measure API\n\nInstallation\n\nTo install the package, run import Pkg; Pkg.add(\"Associations\").\n\nPreviously, this package was called CausalityTools.jl.\n\n\n\n\n\n","category":"module"},{"location":"#Latest-news","page":"Associations.jl","title":"Latest news","text":"","category":"section"},{"location":"","page":"Associations.jl","title":"Associations.jl","text":"info: Package rename\nThe package has been renamed from CausalityTools.jl to Associations.jl.","category":"page"},{"location":"","page":"Associations.jl","title":"Associations.jl","text":"Associations.jl has been updated to v4! ","category":"page"},{"location":"","page":"Associations.jl","title":"Associations.jl","text":"This update includes a number of breaking changes, several of which are not backwards compatible. These are done to ensure compatibility with ComplexityMeasures.jl v3, which provides discretization functionality that we use here.","category":"page"},{"location":"","page":"Associations.jl","title":"Associations.jl","text":"Important changes are:","category":"page"},{"location":"","page":"Associations.jl","title":"Associations.jl","text":"Convenience methods have been removed completely. Use association instead.\nExample systems have been removed.\nThe syntax for computing an association has changed. Estimators now always contain the definition it estimates. For example, association(MIShannon(), KSG1(), x, y) is now association(KSG1(MIShannon()), x, y).\nSurrogateTest has been renamed to SurrogateAssociationTest. \nSee the CHANGELOG.md for a complete list of changes.","category":"page"},{"location":"#Getting-started","page":"Associations.jl","title":"Getting started","text":"","category":"section"},{"location":"","page":"Associations.jl","title":"Associations.jl","text":"The quickest way to get going with the package is to check out the examples in the left-hand menu.","category":"page"},{"location":"","page":"Associations.jl","title":"Associations.jl","text":"info: Info\nTo make it easier to navigate the extensive documentation, all documentation strings are collapsed by default. Click the arrow icon in the top toolbar to expand/collapse the docstrings in a page.","category":"page"},{"location":"#Documentation-content","page":"Associations.jl","title":"Documentation content","text":"","category":"section"},{"location":"","page":"Associations.jl","title":"Associations.jl","text":"Association measures lists all implemented association measures and their estimators.\nIndependence testing lists all implemented ways of determining if an association between datasets is \"significant\".\nCausal inference lists all methods of inferring association networks (also called \"network graphs\" and \"causal graphs\") between multiple variables.\nNumerous examples for association measure estimation, independence testing, and network inference.","category":"page"},{"location":"#Input-data-for-Associations.jl","page":"Associations.jl","title":"Input data for Associations.jl","text":"","category":"section"},{"location":"","page":"Associations.jl","title":"Associations.jl","text":"Input data for Associations.jl are given as:","category":"page"},{"location":"","page":"Associations.jl","title":"Associations.jl","text":"Univariate timeseries, which are given as standard Julia Vectors.\nMultivariate timeseries, StateSpaceSets, or state space sets, which are given as StateSpaceSets. Many methods convert timeseries inputs to StateSpaceSet for faster internal computations.\nCategorical data can be used with JointProbabilities to compute various information theoretic measures and is represented using any iterable whose elements can be any arbitrarily complex data type (as long as it's hashable), for example Vector{String}, {Vector{Int}}, or Vector{Tuple{Int, String}}.","category":"page"},{"location":"","page":"Associations.jl","title":"Associations.jl","text":"StateSpaceSets.StateSpaceSet","category":"page"},{"location":"#StateSpaceSets.StateSpaceSet","page":"Associations.jl","title":"StateSpaceSets.StateSpaceSet","text":"StateSpaceSet{D, T, V} <: AbstractVector{V}\n\nA dedicated interface for sets in a state space. It is an ordered container of equally-sized points of length D, with element type T, represented by a vector of type V. Typically V is SVector{D,T} or Vector{T} and the data are always stored internally as Vector{V}. SSSet is an alias for StateSpaceSet.\n\nThe underlying Vector{V} can be obtained by vec(ssset), although this is almost never necessary because StateSpaceSet subtypes AbstractVector and extends its interface. StateSpaceSet also supports almost all sensible vector operations like append!, push!, hcat, eachrow, among others. When iterated over, it iterates over its contained points.\n\nConstruction\n\nConstructing a StateSpaceSet is done in three ways:\n\nBy giving in each individual columns of the state space set as Vector{<:Real}: StateSpaceSet(x, y, z, ...).\nBy giving in a matrix whose rows are the state space points: StateSpaceSet(m).\nBy giving in directly a vector of vectors (state space points): StateSpaceSet(v_of_v).\n\nAll constructors allow for the keyword container which sets the type of V (the type of inner vectors). At the moment options are only SVector, MVector, or Vector, and by default SVector is used.\n\nDescription of indexing\n\nWhen indexed with 1 index, StateSpaceSet behaves exactly like its encapsulated vector. i.e., a vector of vectors (state space points). When indexed with 2 indices it behaves like a matrix where each row is a point.\n\nIn the following let i, j be integers, typeof(X) <: AbstractStateSpaceSet and v1, v2 be <: AbstractVector{Int} (v1, v2 could also be ranges, and for performance benefits make v2 an SVector{Int}).\n\nX[i] == X[i, :] gives the ith point (returns an SVector)\nX[v1] == X[v1, :], returns a StateSpaceSet with the points in those indices.\nX[:, j] gives the jth variable timeseries (or collection), as Vector\nX[v1, v2], X[:, v2] returns a StateSpaceSet with the appropriate entries (first indices being \"time\"/point index, while second being variables)\nX[i, j] value of the jth variable, at the ith timepoint\n\nUse Matrix(ssset) or StateSpaceSet(matrix) to convert. It is assumed that each column of the matrix is one variable. If you have various timeseries vectors x, y, z, ... pass them like StateSpaceSet(x, y, z, ...). You can use columns(dataset) to obtain the reverse, i.e. all columns of the dataset in a tuple.\n\n\n\n\n\n","category":"type"},{"location":"#Maintainers-and-contributors","page":"Associations.jl","title":"Maintainers and contributors","text":"","category":"section"},{"location":"","page":"Associations.jl","title":"Associations.jl","text":"The Associations.jl software is maintained by Kristian Agasøster Haaga, who also curates and writes this documentation. Significant contributions to the API and documentation design has been made by George Datseris, which also co-authors ComplexityMeasures.jl, which we develop in tandem with this package.","category":"page"},{"location":"","page":"Associations.jl","title":"Associations.jl","text":"A complete list of contributors to this repo are listed on the main Github page. Some important contributions are:","category":"page"},{"location":"","page":"Associations.jl","title":"Associations.jl","text":"Norbert Genera contributed bug reports and investigations that led to subsequent improvements for the pairwise asymmetric inference algorithm and an improved cross mapping API.\nDavid Diego's contributions were invaluable in the initial stages of development. His MATLAB code provided the basis for several transfer entropy methods and binning-related code.\nGeorge Datseris also ported KSG1 and KSG2 mutual information estimators to Neighborhood.jl.\nBjarte Hannisdal provided tutorials for mutual information.\nTor Einar Møller contributed to cross-mapping methods in initial stages of development.","category":"page"},{"location":"","page":"Associations.jl","title":"Associations.jl","text":"Many individuals has contributed code to other packages in the JuliaDynamics ecosystem which we use here. Contributors are listed in the respective GitHub repos and webpages.","category":"page"},{"location":"api/cross_map_api/","page":"Cross-map API","title":"Cross-map API","text":"CollapsedDocStrings = true","category":"page"},{"location":"api/cross_map_api/#Cross-map-API","page":"Cross-map API","title":"Cross-map API","text":"","category":"section"},{"location":"api/cross_map_api/#Estimators","page":"Cross-map API","title":"Estimators","text":"","category":"section"},{"location":"api/cross_map_api/","page":"Cross-map API","title":"Cross-map API","text":"CrossmapEstimator\nRandomVectors\nRandomSegment\nExpandingSegment\nEnsemble","category":"page"},{"location":"api/cross_map_api/#Associations.CrossmapEstimator","page":"Cross-map API","title":"Associations.CrossmapEstimator","text":"CrossmapEstimator{M<:CrossmapMeasure, LIBSIZES, RNG}\n\nThe abstract supertype for all cross-map estimators.\n\nConcrete subtypes\n\nRandomVectors\nRandomSegment\nExpandingSegment\n\nDescription\n\nBecause the type of the library may differ between estimators, and because RNGs from different packages may be used, subtypes must implement the LIBSIZES and RNG type parameters.\n\nFor efficiency purposes, subtypes may contain mutable containers that can be re-used for ensemble analysis (see Ensemble).\n\ninfo: Libraries\nA cross-map estimator uses the concept of \"libraries\". A library is essentially just a reference to a set of points, and usually, a library refers to indices of points, not the actual points themselves.For example, for timeseries, RandomVectors(libsizes = 50:25:100) produces three separate libraries, where the first contains 50 randomly selected time indices, the second contains 75 randomly selected time indices, and the third contains 100 randomly selected time indices. This of course assumes that all quantities involved can be indexed using the same time indices, meaning that the concept of \"library\" only makes sense after relevant quantities have been jointly embedded, so that they can be jointly indexed. For non-instantaneous prediction, the maximum possible library size shrinks with the magnitude of the index/time-offset for the prediction.For spatial analyses (not yet implemented), indices could be more complex and involve multi-indices.\n\n\n\n\n\n","category":"type"},{"location":"api/cross_map_api/#Associations.RandomVectors","page":"Cross-map API","title":"Associations.RandomVectors","text":"RandomVectors <: CrossmapEstimator\nRandomVectors(definition::CrossmapMeasure; libsizes, replace = false, \n rng = Random.default_rng())\n\nCross map once over N = length(libsizes) different \"point libraries\", where point indices are selected randomly (not considering time ordering). \n\nThis is method 3 from Luo et al. (2015). See CrossmapEstimator for an in-depth explanation of what \"library\" means in this context.\n\nDescription\n\nThe cardinality of the point libraries are given by libsizes. One set of random point indices is selected per L ∈ libsizes, and the i-th library has cardinality k = libsizes[i]. \n\nPoint indices within each library are randomly selected, independently of other libraries. A user-specified rng may be specified for reproducibility. The replace argument controls whether sampling is done with or without replacement. If the time series you're cross mapping between have length M, and Lᵢ < M for any Lᵢ ∈ libsizes, then you must set replace = true.\n\nReturns\n\nThe return type when used with association depends on the type of libsizes.\n\nIf libsizes is an Int (a single library), then a single cross-map estimate is returned.\nIf libsizes is an AbstractVector{Int} (multiple libraries), then a vector of cross-map estimates is returned –- one per library.\n\nSee also: CrossmapEstimator.\n\n\n\n\n\n","category":"type"},{"location":"api/cross_map_api/#Associations.RandomSegment","page":"Cross-map API","title":"Associations.RandomSegment","text":"RandomSegment <: CrossmapEstimator\nRandomSegment(definition::CrossmapMeasure; libsizes::Int, rng = Random.default_rng())\n\nCross map once over N = length(libsizes) different \"point libraries\", where point indices are selected as time-contiguous segments with random starting points.\n\nThis is method 2 from Luo et al. (2015). See CrossmapEstimator for an in-depth explanation of what \"library\" means in this context.\n\nDescription\n\nThe cardinality of the point index segments are given by libsizes. One segment with a randomly selected starting point is picked per L ∈ libsizes, and the i-th point index segment has cardinality k = libsizes[i]. \n\nThe starting point for each library is selected independently of other libraries. A user-specified rng may be specified for reproducibility. If the time series you're cross mapping between have length M, and Lᵢ < M for any Lᵢ ∈ libsizes, then an error will be thrown.\n\nA user-specified rng may be specified for reproducibility.\n\nReturns\n\nThe return type when used with association depends on the type of libsizes.\n\nIf libsizes is an Int (a single library), then a single cross-map estimate is returned.\nIf libsizes is an AbstractVector{Int} (multiple libraries), then a vector of cross-map estimates is returned –- one per library.\n\nSee also: CrossmapEstimator.\n\n\n\n\n\n","category":"type"},{"location":"api/cross_map_api/#Associations.ExpandingSegment","page":"Cross-map API","title":"Associations.ExpandingSegment","text":"ExpandingSegment <: CrossmapEstimator\nExpandingSegment(definition::CrossmapMeasure; libsizes, rng = Random.default_rng())\n\nCross map once over N = length(libsizes) different \"point libraries\", where point indices are selected as time-contiguous segments/windows.\n\nThis is the method from (Sugihara et al., 2012). See CrossmapEstimator for an in-depth explanation of what \"library\" means in this context.\n\nDescription\n\nPoint index segments are selected as first available data point index, up to the Lth data point index. This results in one library of contiguous time indices per L ∈ libsizes.\n\nIf used in an ensemble setting, the estimator is applied to time indices Lmin:step:Lmax of the joint embedding.\n\nReturns\n\nThe return type when used with association depends on the type of libsizes.\n\nIf libsizes is an Int (a single library), then a single cross-map estimate is returned.\nIf libsizes is an AbstractVector{Int} (multiple libraries), then a vector of cross-map estimates is returned –- one per library.\n\n\n\n\n\n","category":"type"},{"location":"api/cross_map_api/#Associations.Ensemble","page":"Cross-map API","title":"Associations.Ensemble","text":"Ensemble(est::CrossmapEstimator{<:CrossmapMeasure}, nreps::Int = 100)\n\nA directive to compute an ensemble analysis, where measure (e.g. ConvergentCrossMapping) is computed using the given estimator est (e.g. RandomVectors)\n\nExamples\n\nExample 1: Reproducing Figure 3A from Sugihara et al. (2012).\n\n\n\n\n\n","category":"type"},{"location":"api/cross_map_api/#Advanced-utility-methods","page":"Cross-map API","title":"Advanced utility methods","text":"","category":"section"},{"location":"api/cross_map_api/","page":"Cross-map API","title":"Cross-map API","text":"For most use cases, it is sufficient to provide a CrossmapEstimator to association to compute a cross map measure. However, in some cases it can be useful to have more fine-grained controls. We offer a few utility functions for this purpose.","category":"page"},{"location":"api/cross_map_api/","page":"Cross-map API","title":"Cross-map API","text":"These functions are used in the examples below, where we reproduce Figures 3C and 3D of Sugihara et al. (2012) and reproduce figures from McCracken and Weigel (2014).","category":"page"},{"location":"api/cross_map_api/","page":"Cross-map API","title":"Cross-map API","text":"predict\ncrossmap","category":"page"},{"location":"api/cross_map_api/#Associations.predict","page":"Cross-map API","title":"Associations.predict","text":"predict(measure::CrossmapEstimator, t::AbstractVector, s::AbstractVector) → t̂ₛ, t̄, ρ\npredict(measure::CrossmapEstimator, t̄::AbstractVector, S̄::AbstractStateSpaceSet) → t̂ₛ\n\nPerform point-wise cross mappings between source embeddings and target time series according to the algorithm specified by the given cross-map measure (e.g. ConvergentCrossMapping or PairwiseAsymmetricInference).\n\nFirst method: Jointly embeds the target t and source s time series (according to measure) to obtain time-index aligned target timeseries t̄ and source embedding S̄ (which is now a StateSpaceSet). Then calls predict(measure, t̄, S̄) (the first method), and returns both the predictions t̂ₛ, observations t̄ and their correspondence ρ according to measure.\nSecond method: Returns a vector of predictions t̂ₛ (t̂ₛ := \"predictions of t̄ based on source embedding S̄\"), where t̂ₛ[i] is the prediction for t̄[i]. It assumes pre-embedded data which have been correctly time-aligned using a joint embedding, i.e. such that t̄[i] and S̄[i] correspond to the same time index.\n\nDescription\n\nFor each i ∈ {1, 2, …, N} where N = length(t) == length(s), we make the prediction t̂[i] (an estimate of t[i]) based on a linear combination of D + 1 other points in t, where the selection of points and weights for the linear combination are determined by the D+1 nearest neighbors of the point S̄[i]. The details of point selection and weights depend on measure.\n\nNote: Some CrossmapMeasures may define more general mapping procedures. If so, the algorithm is described in their docstring.\n\n\n\n\n\n","category":"function"},{"location":"api/cross_map_api/#Associations.crossmap","page":"Cross-map API","title":"Associations.crossmap","text":"crossmap(measure::CrossmapEstimator, t::AbstractVector, s::AbstractVector) → ρ::Real\ncrossmap(measure::CrossmapEstimator, est, t::AbstractVector, s::AbstractVector) → ρ::Vector\ncrossmap(measure::CrossmapEstimator, t̄::AbstractVector, S̄::AbstractStateSpaceSet) → ρ\n\nCompute the cross map estimates between between raw time series t and s (and return the real-valued cross-map statistic ρ). If a CrossmapEstimator est is provided, cross mapping is done on random subsamples of the data, where subsampling is dictated by est (a vector of values for ρ is returned).\n\nAlternatively, cross-map between time-aligned time series t̄ and source embedding S̄ that have been constructed by jointly (pre-embedding) some input data.\n\nThis is just a wrapper around predict that simply returns the correspondence measure between the source and the target.\n\n\n\n\n\n","category":"function"},{"location":"api/cross_map_api/#example_ConvergentCrossMapping_reproducing_sugihara","page":"Cross-map API","title":"Example: reproducing Sugihara et al. (2012)","text":"","category":"section"},{"location":"api/cross_map_api/","page":"Cross-map API","title":"Cross-map API","text":"note: Run blocks consecutively\nIf copying these examples and running them locally, make sure the relevant packages (given in the first block) are loaded first.","category":"page"},{"location":"api/cross_map_api/#Figure-3A","page":"Cross-map API","title":"Figure 3A","text":"","category":"section"},{"location":"api/cross_map_api/","page":"Cross-map API","title":"Cross-map API","text":"Let's reproduce figure 3A too, focusing only on ConvergentCrossMapping this time. In this figure, they compute the cross mapping for libraries of increasing size, always starting at time index 1. This approach - which we here call the ExpandingSegment estimator - is one of many ways of estimating the correspondence between observed and predicted value.","category":"page"},{"location":"api/cross_map_api/","page":"Cross-map API","title":"Cross-map API","text":"For this example, they use a bidirectional system with asymmetrical coupling strength.","category":"page"},{"location":"api/cross_map_api/","page":"Cross-map API","title":"Cross-map API","text":"using Associations\nusing Statistics\nusing LabelledArrays\nusing StaticArrays\nusing DynamicalSystemsBase\nusing StateSpaceSets\nusing CairoMakie, Printf\n\nfunction eom_logistic_sugi(u, p, t)\n (; rx, ry, βxy, βyx) = p\n (; x, y) = u\n\n dx = x*(rx - rx*x - βxy*y)\n dy = y*(ry - ry*y - βyx*x)\n return SVector{2}(dx, dy)\nend\n\n# βxy := effect on x of y\n# βyx := effect on y of x\nfunction logistic_sugi(; u0 = rand(2), rx, ry, βxy, βyx)\n p = @LArray [rx, ry, βxy, βyx] (:rx, :ry, :βxy, :βyx)\n DiscreteDynamicalSystem(eom_logistic_sugi, u0, p)\nend\n\n# Used in `reproduce_figure_3A_naive`, and `reproduce_figure_3A_ensemble` below.\nfunction add_to_fig!(fig_pos, libsizes, ρs_x̂y, ρs_ŷx; title = \"\", quantiles = false)\n ax = Axis(fig_pos; title, aspect = 1,\n xlabel = \"Library size\", ylabel = \"Correlation (ρ)\")\n ylims!(ax, (-1, 1))\n hlines!([0], linestyle = :dash, alpha = 0.5, color = :grey)\n scatterlines!(libsizes, median.(ρs_x̂y), label = \"x̂|y\", color = :blue)\n scatterlines!(libsizes, median.(ρs_ŷx), label = \"ŷ|x\", color = :red)\n if quantiles\n band!(libsizes, quantile.(ρs_x̂y, 0.05), quantile.(ρs_x̂y, 0.95), color = (:blue, 0.5))\n band!(libsizes, quantile.(ρs_ŷx, 0.05), quantile.(ρs_ŷx, 0.95), color = (:red, 0.5))\n end\n axislegend(ax, position = :rb)\nend\n\nfunction reproduce_figure_3A_naive(definition::CrossmapMeasure)\n sys_bidir = logistic_sugi(; u0 = [0.2, 0.4], rx = 3.7, ry = 3.700001, βxy = 0.02, βyx = 0.32);\n x, y = columns(first(trajectory(sys_bidir, 3100, Ttr = 10000)));\n libsizes = [20:2:50; 55:5:200; 300:50:500; 600:100:900; 1000:500:3000]\n est = ExpandingSegment(definition; libsizes);\n ρs_x̂y = crossmap(est, x, y)\n ρs_ŷx = crossmap(est, y, x)\n\n with_theme(theme_minimal(),\n markersize = 5) do\n fig = Figure(resolution = (800, 300))\n add_to_fig!(fig[1, 1], libsizes, ρs_x̂y, ρs_ŷx; title = \"`ExpandingSegment`\")\n fig\n end\nend\n\nreproduce_figure_3A_naive(ConvergentCrossMapping(d = 3))","category":"page"},{"location":"api/cross_map_api/","page":"Cross-map API","title":"Cross-map API","text":"Hm. This looks a bit like the paper, but the curve is not smooth. We can do better!","category":"page"},{"location":"api/cross_map_api/","page":"Cross-map API","title":"Cross-map API","text":"It is not clear from the paper exactly what they plot in their Figure 3A, if they plot an average of some kind, or precisely what parameters and initial conditions they use. However, we can get a smoother plot by using a Ensemble. Combined with a CrossmapEstimator, it uses Monte Carlo resampling on subsets of the input data to compute an ensemble of ρs that we here use to compute the median and 90-th percentile range for each library size.","category":"page"},{"location":"api/cross_map_api/","page":"Cross-map API","title":"Cross-map API","text":"function reproduce_figure_3A_ensemble(definition::CrossmapMeasure)\n sys_bidir = logistic_sugi(; u0 = [0.4, 0.2], rx = 3.8, ry = 3.5, βxy = 0.02, βyx = 0.1);\n x, y = columns(first(trajectory(sys_bidir, 5000, Ttr = 10000)));\n # Note: our time series are 1000 points long. When embedding, some points are\n # lost, so we must use slightly less points for the segments than \n # there are points in the original time series.\n libsizes = [20:5:50; 55:5:200; 300:50:500; 600:100:900; 1000:500:2000]\n # No point in doing more than one rep, because there data are always the same\n # for `ExpandingSegment.`\n ensemble_ev = Ensemble(ExpandingSegment(definition; libsizes); nreps = 1)\n ensemble_rs = Ensemble(RandomSegment(definition; libsizes); nreps = 30)\n ensemble_rv = Ensemble(RandomVectors(definition; libsizes); nreps = 30)\n ρs_x̂y_es = crossmap(ensemble_ev, x, y)\n ρs_ŷx_es = crossmap(ensemble_ev, y, x)\n ρs_x̂y_rs = crossmap(ensemble_rs, x, y)\n ρs_ŷx_rs = crossmap(ensemble_rs, y, x)\n ρs_x̂y_rv = crossmap(ensemble_rv, x, y)\n ρs_ŷx_rv = crossmap(ensemble_rv, y, x)\n\n with_theme(theme_minimal(),\n markersize = 5) do\n fig = Figure(resolution = (800, 300))\n add_to_fig!(fig[1, 1], libsizes, ρs_x̂y_es, ρs_ŷx_es; title = \"`ExpandingSegment`\", quantiles = false) # quantiles make no sense for `ExpandingSegment`\n add_to_fig!(fig[1, 2], libsizes, ρs_x̂y_rs, ρs_ŷx_rs; title = \"`RandomSegment`\", quantiles = true)\n add_to_fig!(fig[1, 3], libsizes, ρs_x̂y_rv, ρs_ŷx_rv; title = \"`RandomVector`\", quantiles = true)\n fig\n end\nend\n\nreproduce_figure_3A_ensemble(ConvergentCrossMapping(d = 3, τ = -1))","category":"page"},{"location":"api/cross_map_api/","page":"Cross-map API","title":"Cross-map API","text":"With the RandomVectors estimator, the mean of our ensemble ρs seem to look pretty much identical to Figure 3A in Sugihara et al. The RandomSegment estimator also performs pretty well, but since subsampled segments are contiguous, there are probably some autocorrelation effects at play.","category":"page"},{"location":"api/cross_map_api/","page":"Cross-map API","title":"Cross-map API","text":"We can avoid the autocorrelation issue by tuning the w parameter of the ConvergentCrossMapping measure, which is the Theiler window. Setting the Theiler window to w > 0, we can exclude neighbors of a query point p that are close to p in time, and thus deal with autocorrelation issues that way (the default w = 0 excludes only the point itself). Let's re-do the analysis with w = 5, just for fun.","category":"page"},{"location":"api/cross_map_api/","page":"Cross-map API","title":"Cross-map API","text":"reproduce_figure_3A_ensemble(ConvergentCrossMapping(d = 3, τ = -1, w = 5))","category":"page"},{"location":"api/cross_map_api/","page":"Cross-map API","title":"Cross-map API","text":"There wasn't really that much of a difference, since for the logistic map, the autocorrelation function flips sign for every lag increase. However, for examples from other systems, tuning w may be important.","category":"page"},{"location":"api/cross_map_api/#Figure-3B","page":"Cross-map API","title":"Figure 3B","text":"","category":"section"},{"location":"api/cross_map_api/","page":"Cross-map API","title":"Cross-map API","text":"What about figure 3B? Here they generate time series of length 400 for a range of values for both coupling parameters, and plot the dominant direction Delta = rho(hatx y) - rho(haty x).","category":"page"},{"location":"api/cross_map_api/","page":"Cross-map API","title":"Cross-map API","text":"In the paper, they use a 1000 different parameterizations for the logistic map parameters, but don't state what is summarized in the plot. For simplicity, we'll therefore just stick to rx = ry = 3.7, as in the examples above, and just loop over the coupling strengths in either direction.","category":"page"},{"location":"api/cross_map_api/","page":"Cross-map API","title":"Cross-map API","text":"function reproduce_figure_3B()\n βxys = 0.0:0.02:0.4\n βyxs = 0.0:0.02:0.4\n ρx̂ys = zeros(length(βxys), length(βyxs))\n ρŷxs = zeros(length(βxys), length(βyxs))\n\n for (i, βxy) in enumerate(βxys)\n for (j, βyx) in enumerate(βyxs)\n sys_bidir = logistic_sugi(; u0 = [0.2, 0.4], rx = 3.7, ry = 3.7, βxy, βyx);\n # Generate 1000 points. Randomly select a 400-pt long segment.\n x, y = columns(first(trajectory(sys_bidir, 400, Ttr = 10000)));\n definition = CCM(d = 3, w = 5, τ = -1)\n ensemble = Ensemble(RandomVectors(definition; libsizes = 100), nreps = 50)\n ρx̂ys[i, j] = mean(crossmap(ensemble, x, y))\n ρŷxs[i, j] = mean(crossmap(ensemble, y, x))\n end\n end\n Δ = ρŷxs .- ρx̂ys\n\n with_theme(theme_minimal(),\n markersize = 5) do\n fig = Figure();\n ax = Axis(fig[1, 1], xlabel = \"βxy\", ylabel = \"βyx\")\n cont = contourf!(ax, Δ, levels = range(-1, 1, length = 10),\n colormap = :curl)\n ax.xticks = 1:length(βxys), string.([i % 2 == 0 ? βxys[i] : \"\" for i in 1:length(βxys)])\n ax.yticks = 1:length(βyxs), string.([i % 2 == 0 ? βyxs[i] : \"\" for i in 1:length(βyxs)])\n Colorbar(fig[1 ,2], cont, label = \"Δ (ρ(ŷ|x) - ρ(x̂|y))\")\n tightlimits!(ax)\n fig\n end\nend\n\nreproduce_figure_3B()","category":"page"},{"location":"api/cross_map_api/#example_sugihara_figs3Cand3D","page":"Cross-map API","title":"Figures 3C and 3D","text":"","category":"section"},{"location":"api/cross_map_api/","page":"Cross-map API","title":"Cross-map API","text":"Let's reproduce figures 3C and 3D in Sugihara et al. (2012), which introduced the ConvergentCrossMapping measure. Equations and parameters can be found in their supplementary material. Simulatenously, we also compute the PairwiseAsymmetricInference measure from McCracken and Weigel (2014), which is a related method, but uses a slightly different embedding.","category":"page"},{"location":"api/cross_map_api/","page":"Cross-map API","title":"Cross-map API","text":"using Associations\nusing Statistics\nusing LabelledArrays\nusing StaticArrays\nusing DynamicalSystemsBase\nusing StateSpaceSets\nusing CairoMakie, Printf\n\n# -----------------------------------------------------------------------------------------\n# Create 500-point long time series for Sugihara et al. (2012)'s example for figure 3.\n# -----------------------------------------------------------------------------------------\nsys_unidir = logistic_sugi(; u0 = [0.2, 0.4], rx = 3.7, ry = 3.700001, βxy = 0.00, βyx = 0.32);\nx, y = columns(first(trajectory(sys_unidir, 500, Ttr = 10000)));\n\n# -----------------------------------------------------------------------------------------\n# Cross map.\n# -----------------------------------------------------------------------------------------\nm_ccm = ConvergentCrossMapping(d = 2)\nm_pai = PairwiseAsymmetricInference(d = 2)\n# Make predictions x̂y, i.e. predictions `x̂` made from embedding of y (AND x, if PAI)\nt̂ccm_x̂y, tccm_x̂y, ρccm_x̂y = predict(m_ccm, x, y)\nt̂pai_x̂y, tpai_x̂y, ρpai_x̂y = predict(m_pai, x, y);\n# Make predictions ŷx, i.e. predictions `ŷ` made from embedding of x (AND y, if PAI)\nt̂ccm_ŷx, tccm_ŷx, ρccm_ŷx = predict(m_ccm, y, x)\nt̂pai_ŷx, tpai_ŷx, ρpai_ŷx = predict(m_pai, y, x);\n\n# -----------------------------------------------------------------------------------------\n# Plot results\n# -----------------------------------------------------------------------------------------\nρs = (ρccm_x̂y, ρpai_x̂y, ρccm_ŷx, ρpai_ŷx)\nsccm_x̂y, spai_x̂y, sccm_ŷx, spai_ŷx = (map(ρ -> (@sprintf \"%.3f\" ρ), ρs)...,)\n\nρs = (ρccm_x̂y, ρpai_x̂y, ρccm_ŷx, ρpai_ŷx)\nsccm_x̂y, spai_x̂y, sccm_ŷx, spai_ŷx = (map(ρ -> (@sprintf \"%.3f\" ρ), ρs)...,)\n\nwith_theme(theme_minimal(),\n markersize = 5) do\n fig = Figure();\n ax_ŷx = Axis(fig[2,1], aspect = 1, xlabel = \"y(t) (observed)\", ylabel = \"ŷ(t) | x (predicted)\")\n ax_x̂y = Axis(fig[2,2], aspect = 1, xlabel = \"x(t) (observed)\", ylabel = \"x̂(t) | y (predicted)\")\n xlims!(ax_ŷx, (0, 1)), ylims!(ax_ŷx, (0, 1))\n xlims!(ax_x̂y, (0, 1)), ylims!(ax_x̂y, (0, 1))\n ax_ts = Axis(fig[1, 1:2], xlabel = \"Time (t)\", ylabel = \"Value\")\n scatterlines!(ax_ts, x[1:300], label = \"x\")\n scatterlines!(ax_ts, y[1:300], label = \"y\")\n axislegend()\n scatter!(ax_ŷx, tccm_ŷx, t̂ccm_ŷx, label = \"CCM (ρ = $sccm_ŷx)\", color = :black)\n scatter!(ax_ŷx, tpai_ŷx, t̂pai_ŷx, label = \"PAI (ρ = $spai_ŷx)\", color = :red)\n axislegend(ax_ŷx, position = :lt)\n scatter!(ax_x̂y, tccm_x̂y, t̂ccm_x̂y, label = \"CCM (ρ = $sccm_x̂y)\", color = :black)\n scatter!(ax_x̂y, tpai_x̂y, t̂pai_x̂y, label = \"PAI (ρ = $spai_x̂y)\", color = :red)\n axislegend(ax_x̂y, position = :lt)\n fig\nend","category":"page"},{"location":"api/cross_map_api/#example_PairwiseAsymmetricInference_reproduce_mccracken","page":"Cross-map API","title":"Example: reproducing McCracken & Weigel (2014)","text":"","category":"section"},{"location":"api/cross_map_api/","page":"Cross-map API","title":"Cross-map API","text":"Let's try to reproduce figure 8 from McCracken and Weigel (2014)'s paper on PairwiseAsymmetricInference (PAI). We'll start by defining the their example B (equations 6-7). This system consists of two variables X and Y, where X drives Y.","category":"page"},{"location":"api/cross_map_api/","page":"Cross-map API","title":"Cross-map API","text":"After we have computed the PAI in both directions, we define a measure of directionality as the difference between PAI in the X to Y direction and in the Y to X direction, so that if X drives Y, then Delta 0.","category":"page"},{"location":"api/cross_map_api/","page":"Cross-map API","title":"Cross-map API","text":"using Associations\nusing LabelledArrays\nusing StaticArrays\nusing DynamicalSystemsBase\nusing StateSpaceSets\nusing CairoMakie, Printf\nusing Distributions: Normal\nusing Statistics: mean, std\n\nfunction eom_nonlinear_sindriver(dx, x, p, n)\n a, b, c, t, Δt = (p...,)\n x, y = x[1], x[2]\n 𝒩 = Normal(0, 1)\n \n dx[1] = sin(t)\n dx[2] = a*x * (1 - b*x) + c* rand(𝒩)\n p[end-1] += 1 # update t\n\n return\nend\n\nfunction nonlinear_sindriver(;u₀ = rand(2), a = 1.0, b = 1.0, c = 2.0, Δt = 1)\n DiscreteDynamicalSystem(eom_nonlinear_sindriver, u₀, [a, b, c, 0, Δt])\nend\n\nfunction reproduce_figure_8_mccraken(; \n c = 2.0, Δt = 0.2,\n as = 0.5:0.5:5.0,\n bs = 0.5:0.5:5.0)\n # -----------------------------------------------------------------------------------------\n # Generate many time series for many different values of the parameters `a` and `b`,\n # and compute PAI. This will replicate the upper right panel of \n # figure 8 in McCracken & Weigel (2014).\n # -----------------------------------------------------------------------------------------\n \n measure = PairwiseAsymmetricInference(d = 3)\n\n # Manually resample `nreps` length-`L` time series and use mean ρ(x̂|X̄y) - ρ(ŷ|Ȳx)\n # for each parameter combination.\n nreps = 50\n L = 200 # length of timeseries\n Δ = zeros(length(as), length(bs))\n for (i, a) in enumerate(as)\n for (j, b) in enumerate(bs)\n s = nonlinear_sindriver(; a, b, c, Δt)\n x, y = columns(first(trajectory(s, 1000, Ttr = 10000)))\n Δreps = zeros(nreps)\n for i = 1:nreps\n # Ensure we're subsampling at the same time indices. \n ind_start = rand(1:(1000-L))\n r = ind_start:(ind_start + L)\n Δreps[i] = @views crossmap(measure, y[r], x[r]) - \n crossmap(measure, x[r], y[r])\n end\n Δ[i, j] = mean(Δreps)\n end\n end\n\n # -----------------------------------------------------------------------------------------\n # An example time series for plotting.\n # -----------------------------------------------------------------------------------------\n sys = nonlinear_sindriver(; a = 1.0, b = 1.0, c, Δt)\n npts = 500\n orbit = first(trajectory(sys, npts, Ttr = 10000))\n x, y = columns(orbit)\n with_theme(theme_minimal(),\n markersize = 5) do\n \n X = x[1:300]\n Y = y[1:300]\n fig = Figure();\n ax_ts = Axis(fig[1, 1:2], xlabel = \"Time (t)\", ylabel = \"Value\")\n scatterlines!(ax_ts, (X .- mean(X)) ./ std(X), label = \"x\")\n scatterlines!(ax_ts, (Y .- mean(Y)) ./ std(Y), label = \"y\")\n axislegend()\n\n ax_hm = Axis(fig[2, 1:2], xlabel = \"a\", ylabel = \"b\")\n ax_hm.yticks = (1:length(as), string.([i % 2 == 0 ? as[i] : \"\" for i = 1:length(as)]))\n ax_hm.xticks = (1:length(bs), string.([i % 2 == 0 ? bs[i] : \"\" for i = 1:length(bs)]))\n hm = heatmap!(ax_hm, Δ, colormap = :viridis)\n Colorbar(fig[2, 3], hm; label = \"Δ' = ρ(ŷ | yx) - ρ(x̂ | xy)\")\n fig\n end\nend\n\nreproduce_figure_8_mccraken()","category":"page"},{"location":"api/cross_map_api/","page":"Cross-map API","title":"Cross-map API","text":"We haven't used as many parameter combinations as McCracken and Weigel (2014) did, but we get a figure that looks roughly similar to theirs.","category":"page"},{"location":"api/cross_map_api/","page":"Cross-map API","title":"Cross-map API","text":"As expected, Delta 0 for all parameter combinations, implying that X \"PAI drives\" Y.","category":"page"}] }