(Conditional) Independence

# Conditional Independence

Note

TLDR: Use `ciid` to convert a function `f(ω::) = ...` into a `RandVar`. If the function calls other random variables

```

Previously we saw that we could use `ciid` to turn a function rng into a `RandVar`. Here we cover the meaning of ciid. Use `ciid(x)` to create a random variable that is identical in distribution to `x` but conditionally independent given its parents.

``````μ = uniform(0.0, 1.0)
y1 = normal(μ, 1.0)
y2 =~ y1
rand((y1, y2))``````

`ciid(f)`

`RandVar` that is conditionally independent given its parents, but identically distributed to `f`

`ciid` is the primary mechanism to construct a `RandVar` from a function.

``````function x_(ω)
x = normal(ω, 0, 1)
end
x = ciid(x_)
rand(x)``````

Important: any parents of `f` are shared. That is, if `X` is a `RandVar`, then `X(ω)` will return the same value from whatever context it is called.

Example:

``````numflips = poisson(2)

flips_(ω) = [bernoulli(ω, 0.5, Bool) for i = 1:numflips(ω)]
flips = ciid(flips_)

"At least one of numflips is true"

"All flips are true"

source

ciid(x::RandVar)

`RandVar` identically distributed to `x` but conditionally independent given parents`

source
``````ciid(f, args)
``````

ciid with arguments

If arguments are random variables they are resolved to values.

Equivalent to:

`ciid(ω -> f(ω, (arg isa RandVar ? arg(ω) : arg for arg in args)...))`

Example:

``````function f_(ω, n)
x = 0.0
for i = 1:n
x += uniform(ω, 0, 1)
end
x
end

f = ciid(f_, poisson(3))``````
source