Arithmetic

Most of the fundamental binary operations can be performed between uncertain numbers of all types:

julia> a = normal(10,1); 
julia> b = uniform(1,2);
julia> a + b
 Pbox: 	  ~  ( range=[7.9098, 15.09], mean=11.5, var=[0.38392, 2.1086])

julia> a - b
 Pbox: 	  ~  ( range=[4.9098, 12.09], mean=8.5, var=[0.38392, 2.1086])

julia> a * b
 Pbox: 	  ~  ( range=[6.9098, 26.18], mean=[12.194, 18.069], var=[0.6576, 32.544])

julia> a / b
 Pbox: 	  ~  ( range=[3.4549, 13.09], mean=[5.6205, 8.3861], var=[0.13574, 7.6644])

By default all arithmetic operations in ProbabilityBoundsAnalysis.jl are Frechet operations, operations which consider all possible dependencies (copulas). Therefore we naturally get p-boxes even if we began with precise distributions. For independence:

julia> convIndep(a, b, op = +)
 Pbox: 	  ~  ( range=[7.9098, 15.09], mean=11.5, var=1.0833)

julia> convIndep(a, b, op = -)
 Pbox: 	  ~  ( range=[4.9098, 12.09], mean=8.5, var=1.0833)

julia> convIndep(a, b, op = *)
 Pbox: 	  ~  ( range=[6.9098, 26.18], mean=15.0, var=[10.052, 11.538])

julia> convIndep(a, b, op = /)
 Pbox: 	  ~  ( range=[3.4549, 13.09], mean=[6.919, 6.944], var=[2.3032, 2.6815])

The resulting p-boxes are precise.

Perfect and opposite convolutions can also be performed:

julia> convPerfect(a, b, op = +)
 Pbox: 	  ~  ( range=[7.9098, 15.09], mean=[11.482, 11.518], var=[1.5807, 1.7096])

julia> convPerfect(a, b, op = *)
 Pbox: 	  ~  ( range=[6.9098, 26.18], mean=[15.234, 15.33], var=[18.661, 19.605])

julia> convOpposite(a, b, op = +)
 Pbox: 	  ~  ( range=[8.9048, 14.095], mean=[11.482, 11.518], var=[0.47843, 0.55648])

julia> convOpposite(a, b, op = *)
 Pbox: 	  ~  ( range=[12.162, 16.638], mean=[14.67, 14.766], var=[2.0885, 2.3469])

Binary operations with a specified correlation coefficient may also be performed:

julia> conv(a, b, op = *, corr = -0.5)
 Pbox: 	  ~  ( range=[6.9098, 26.18], mean=15.0, var=[5.5032, 7.9116])

julia> conv(a, b, op = *, corr = 0.5)
 Pbox: 	  ~  ( range=[6.9098, 26.18], mean=15.0, var=[12.985, 16.804])

This assumes that a and b follow a Gaussian Copula. You may however perform the operation with any copula by using the function

julia> C1 = clayton(5)
julia> convCorr(a, b, op = *, C = C1)
 Pbox: 	  ~  ( range=[6.9098, 26.18], mean=[15.024, 15.473], var=[15.738, 19.714])

julia> C2 = Frank(-2)
julia> convCorr(a, b, op = *, C = C2)
 Pbox: 	  ~  ( range=[6.9098, 26.18], mean=15.0, var=[6.78, 9.5713])

where C is a copula (see section on dependence modelling).

Note that:

conv(a, b, op = op, corr = 0)               == convIndep(a, b, op = op)
conv(a, b, op = op, corr = 1)               == convPerfect(a, b, op = op)
conv(a, b, op = op, corr = -1)              == convOpposite(a, b, op = op)
conv(a, b, op = op, corr = interval(-1,1))  == convFrechet(a, b, op = op)