Note
Go to the end to download the full example code.
Use the Box-Cox transformationΒΆ
The objective of this Use Case is to estimate a Box Cox transformation from a field which all values are positive (eventually after a shift to satisfy the positiveness) and to apply it on the field. The object BoxCoxFactory enables to create a factory of Box Cox transformation. Then, we estimate the Box Cox transformation from the initial field values thanks to the method build of the object BoxCoxFactory, which produces an object of type BoxCoxTransform. If the field values have some negative values, it is possible to translate the values with respect a given shift which has to be mentioned either at the creation of the object BoxCoxFactory or when using the method build. Then the Box Cox transformation is the composition of and this translation.
The object BoxCoxTransform enables to:
transform the field values of dimension into the values with stabilized variance, such that for each vertex we have:
or
thanks to the operand (). The field based on the values shares the same mesh than the initial field.
create the inverse Box Cox transformation such that :
or
thanks to the method getInverse() which produces an object of type InverseBoxCoxTransform that can be evaluated on a field. The new field based shares the same mesh than the initial field.
import openturns as ot
import openturns.viewer as viewer
from matplotlib import pylab as plt
ot.Log.Show(ot.Log.NONE)
Define a process
myIndices = [10, 5]
myMesher = ot.IntervalMesher(myIndices)
myInterval = ot.Interval([0.0, 0.0], [2.0, 1.0])
myMesh = myMesher.build(myInterval)
amplitude = [1.0]
scale = [0.2, 0.2]
myCovModel = ot.ExponentialModel(scale, amplitude)
myXproc = ot.GaussianProcess(myCovModel, myMesh)
g = ot.SymbolicFunction(["x1"], ["exp(x1)"])
myDynTransform = ot.ValueFunction(g, myMesh)
myXtProcess = ot.CompositeProcess(myDynTransform, myXproc)
Draw a field
field = myXtProcess.getRealization()
graph = field.drawMarginal(0)
view = viewer.View(graph)
Draw values
marginal = ot.HistogramFactory().build(field.getValues())
graph = marginal.drawPDF()
view = viewer.View(graph)
Build the transformed field through Box-Cox
myModelTransform = ot.BoxCoxFactory().build(field)
myStabilizedField = myModelTransform(field)
Draw values
marginal = ot.HistogramFactory().build(myStabilizedField.getValues())
graph = marginal.drawPDF()
view = viewer.View(graph)
plt.show()