Testing for causality from uncertain time series
Note
The use the causality tests with uncertain data, first load the UncertainData package by running using UncertainData in the Julia console.
Syntax
Uncertainties only in values
#
CausalityToolsBase.causality — Method.
causality(x, y, test::CausalityTest)
Test for a causal influence from source to target using the provided causality test.
Both x and y can be a real-valued vector, Vector{<:AbstractUncertainValue} or a AbstractUncertainValueDataset. If either x, y or both are uncertain, then the test is applied to a single draw from the uncertain data.
Examples
Generate some example data series x and y, where x influences y:
n_pts = 300
a₁, a₂, b₁, b₂, ξ₁, ξ₂, C₁₂ = 0.7, 0.1, 0.75, 0.2, 0.3, 0.3, 0.5
D = rand(n_pts, 2)
for t in 5:n_pts
D[t,1] = a₁*D[t-1,1] - a₂*D[t-3,1] + ξ₁*rand(Normal(0, 1))
D[t,2] = b₁*D[t-1,2] - b₂*D[t-2,2] + C₁₂*D[t-1,1] + ξ₂*rand(Normal(0, 1))
end
Gather time series and add some uncertainties to them:
x, y = D[:, 1], D[:, 2]
uvalx = UncertainValue.(Normal.(x, rand()))
uvaly = UncertainValue.(Normal.(y, rand()))
xd = UncertainValueDataset(uvalx)
yd = UncertainValueDataset(uvaly)
Any combination of certain and uncertain values will work:
causality(x, y, pa_test)
causality(x, yd, pa_test)
causality(xd, yd, pa_test)
causality(x, uvaly, pa_test)
causality(uvalx, uvaly, pa_test)
On multiple realisations of the uncertain yd, but fixing x:
[causality(x, yd, pa_test) for i = 1:100]
Uncertainties in both indices and values
#
CausalityToolsBase.causality — Method.
causality(source::AbstractUncertainIndexValueDataset,
target::AbstractUncertainIndexValueDataset,
test::CausalityTest)
Test for a causal influence from source to target using the provided causality test.
The test is performed on a single draw of the values of source and target, disregarding the ordering resulting from resampling, but respecting the order of the points in the dataset.
Note: if the uncertain values furnishing the indices have overlapping supports, you might mess up the index-ordering (e.g. time-ordering) of the data points.
Note
This method uses UncertainData.jl for uncertainty handling. To use it, first run using UncertainData in the Julia console.
Example
Generate some example data series x and y, where x influences y:
using UncertainData, CausalityTools, Distributions
n_pts = 300
a₁, a₂, b₁, b₂, ξ₁, ξ₂, C₁₂ = 0.7, 0.1, 0.75, 0.2, 0.3, 0.3, 0.5
D = rand(n_pts, 2)
for t in 5:n_pts
D[t,1] = a₁*D[t-1,1] - a₂*D[t-4,1] + ξ₁*rand(Normal(0, 1))
D[t,2] = b₁*D[t-1,2] - b₂*D[t-4,2] + C₁₂*D[t-1,1] + ξ₂*rand(Normal(0, 1))
end
x, y = D[:, 1], D[:, 2]
Add some uncertainties and gather in an UncertainIndexValueDataset
t = 1:n_pts
tu = UncertainValue.(Normal.(t, rand()))
xu = UncertainValue.(Normal.(x, rand()))
yu = UncertainValue.(Normal.(y, rand()))
X = UncertainIndexValueDataset(tu, xu)
Y = UncertainIndexValueDataset(tu, yu)
Define a causality test, for example the predictive asymmetry test:
# Define causality test
k, l, m = 1, 1, 1
ηs = -8:8
n_subdivs = floor(Int, n_pts^(1/(k+l+m+1)))
bin = RectangularBinning(n_subdivs)
te_test = VisitationFrequencyTest(k = k, l = l, m = m, binning = bin, ηs = ηs)
pa_test = PredictiveAsymmetryTest(predictive_test = te_test)
Run the causality test on a single draw of X and a single draw of Y:
pa_XY = causality(X, Y, pa_test)
pa_YX = causality(Y, X, pa_test)
Repeat the test on multiple draws:
pa_XY = [causality(X, Y, pa_test) for i = 1:100]
pa_YX = [causality(Y, X, pa_test) for i = 1:100]