# 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();
`