Causal Inference

Credal Network Transformation

Any object of class StructuralCausalModel can be converted into an equivalent credal network using the methods toVCredal and toHCredal for a vertex and a constraints specification. The input is a collection of BayesianFactors` which are the empirical distributions.

// convert the causal models into credal networks
SparseModel vcredal = causalModel.toVCredal(bnet.getFactors());
SparseModel hcredal = causalModel.toHCredal(bnet.getFactors());

Inference engine

First the exact and approximate inferences engines should be set up. For this create instances of classes CredalCausalVE and CredalCausalAproxLP as shown in the following code snippet.

// set up the exact inference engine
CredalCausalVE infExact = new CredalCausalVE(causalModel, bnet.getFactors());
// set up the approximate inference engine
CredalCausalApproxLP infApprox = new CredalCausalApproxLP(causalModel, bnet.getFactors());

Alternatively, engines can be instantiated from a credal network.

// set up the exact inference engine
CredalCausalVE infExact = new CredalCausalVE(vcredal);
// set up the approximate inference engine
CredalCausalAproxLP infApprox = new CredalCausalAproxLP(hcredal);

Causal Effects

Let us consider the causal effect of on a variable \(X_3\) of a variable \(X_1 = 1\), that is, \(P(X_3|do(X_1=1))\). This can be calculated with the exact inference engine as follows.

// set up and run a causal query
VertexFactor resExact = (VertexFactor) infExact
        .causalQuery()
        .setTarget(x[3])
        .setIntervention(x[1],1)
        .run();

Alternatively, for an approximate solution:

// set up and run a causal query
IntervalFactor resApprox = (IntervalFactor) infApprox
        .causalQuery()
        .setTarget(x[3])
        .setIntervention(x[1],1)
        .run();

Conuterfactuals

Credici also allows counterfactual queries (in a twin graph) such as \(P(X_3'|do(X'_1=1), X'_1=0)\). The exact computation of this query can be done as follows.

// exact inference
resExact = (VertexFactor) infExact
        .counterfactualQuery()
        .setTarget(x[3])
        .setIntervention(x[1],1)
        .setEvidence(x[1], 0)
        .run();

On the other hand, using the approximate engine:

// set up and run a counterfactual query
resApprox = (IntervalFactor) infApprox
        .counterfactualQuery()
        .setTarget(x[3])
        .setIntervention(x[1],1)
        .setEvidence(x[1], 0)
        .run();