Variography¶
In this preamble, we load the gstlearn library.
%%javascript
IPython.OutputArea.prototype._should_scroll = function(lines) {
return false;
}
import gstlearn as gl
import gstlearn.plot as gp
import matplotlib.pyplot as plt
import numpy as np
import os
Then the necessary data set is downloaded and named dat: the target variable is January_temp
!wget -q https://soft.minesparis.psl.eu/gstlearn/data/Scotland/Scotland_Temperatures.NF
fileNF = "Scotland_Temperatures.NF"
dat = gl.Db.createFromNF(fileNF)
Experimental variogram¶
Data is a \alert{regionalized} variable
$$z_i = z(x_i)$$
The experimental variogram is a (dicrete) function:
$$\gamma(h)=\frac{1}{2N(h)}\sum_{i=1}^{N(h)}[z(x_i+h)-z(x_i)]^2$$
where $N(h)$ is the number of pairs of points distant by $h$
Variogram Cloud¶
varioParamOmni = gl.VarioParam.createOmniDirection(100)
grid_cloud = gl.db_variogram_cloud(dat, varioParamOmni)
grid_cloud
Data Base Grid Characteristics ============================== Data Base Summary ----------------- File is organized as a regular grid Space dimension = 2 Number of Columns = 4 Maximum Number of UIDs = 4 Total number of samples = 10000 Grid characteristics: --------------------- Origin : 0.000 0.000 Mesh : 7.789 0.068 Number : 100 100 Variables --------- Column = 0 - Name = rank - Locator = NA Column = 1 - Name = x1 - Locator = x1 Column = 2 - Name = x2 - Locator = x2 Column = 3 - Name = Cloud.January_temp - Locator = NA
Experimental Variogram¶
We calculate the omni-directional variogram of the temperatures.
varioParamOmni = gl.VarioParam.createOmniDirection(40, 10)
varioexp = gl.Vario(varioParamOmni, dat)
err = varioexp.compute()
Print the variogram contents
varioexp
Variogram characteristics
=========================
Number of variable(s) = 1
Number of direction(s) = 1
Space dimension = 2
Variance-Covariance Matrix 1.020
Direction #1
------------
Number of lags = 40
Direction coefficients = 1.000 0.000
Direction angles (degrees) = 0.000 0.000
Tolerance on direction = 90.000 (degrees)
Calculation lag = 10.000
Tolerance on distance = 50.000 (Percent of the lag value)
For variable 1
Rank Npairs Distance Value
0 19.000 3.118 0.042
1 89.000 10.690 0.172
2 168.000 20.346 0.280
3 244.000 30.323 0.456
4 316.000 40.429 0.459
5 385.000 50.162 0.660
6 399.000 60.296 0.729
7 463.000 70.062 0.874
8 450.000 79.807 0.800
9 473.000 90.115 0.977
10 549.000 100.141 0.879
11 484.000 109.866 0.970
12 491.000 119.865 1.082
13 458.000 130.001 1.074
14 474.000 139.888 0.983
15 472.000 149.918 1.086
16 390.000 159.896 1.218
17 410.000 169.913 1.303
18 385.000 179.840 1.212
19 425.000 189.849 1.079
20 354.000 200.117 1.168
21 341.000 209.881 1.229
22 325.000 219.710 1.497
23 296.000 229.902 1.597
24 277.000 239.927 1.419
25 236.000 250.111 1.353
26 201.000 259.921 1.449
27 177.000 270.161 1.335
28 166.000 279.560 1.245
29 177.000 289.873 1.089
30 148.000 299.866 0.992
31 116.000 310.335 1.130
32 95.000 319.854 1.161
33 92.000 329.857 1.330
34 64.000 339.936 1.151
35 57.000 350.172 1.551
36 61.000 359.473 1.395
37 51.000 369.274 1.350
38 33.000 380.087 0.847
39 31.000 389.553 1.014
Plot the omni-directional variogram
gp.setDefault(dims=[6,6])
ax = gp.varmod(varioexp)
Represent the variogram with the number of pairs
ax = gp.varmod(varioexp,show_pairs=True)
Automatic Fitting procedure
fitmod = gl.Model()
err = fitmod.fit(varioexp)
ax = gp.varmod(varioexp, fitmod)
Print the Model
fitmod
Model characteristics ===================== Space dimension = 2 Number of variable(s) = 1 Number of basic structure(s) = 1 Number of drift function(s) = 0 Number of drift equation(s) = 0 Covariance Part --------------- Spherical - Sill = 1.155 - Range = 135.117 Total Sill = 1.155
List of Basic structures
gl.ECov.printAll()
-2 - UNKNOWN : Unknown covariance
-1 - FUNCTION : External covariance function
0 - NUGGET : Nugget effect
1 - EXPONENTIAL : Exponential
2 - SPHERICAL : Spherical
3 - GAUSSIAN : Gaussian
4 - CUBIC : Cubic
5 - SINCARD : Sine Cardinal
6 - BESSEL_J : Bessel J
7 - BESSEL_K : Bessel K
8 - GAMMA : Gamma
9 - CAUCHY : Cauchy
10 - STABLE : Stable
11 - LINEAR : Linear
12 - POWER : Power
13 - ORDER1_GC : First Order Generalized covariance
14 - SPLINE_GC : Spline Generalized covariance
15 - ORDER3_GC : Third Order Generalized covariance
16 - ORDER5_GC : Fifth Order Generalized covariance
17 - COSINUS : Cosine
18 - TRIANGLE : Triangle
19 - COSEXP : Cosine Exponential
20 - REG1D : 1-D Regular
21 - PENTA : Pentamodel
22 - SPLINE2_GC : Order-2 Spline
23 - STORKEY : Storkey covariance in 1-D
24 - WENDLAND0 : Wendland covariance (2,0)
25 - WENDLAND1 : Wendland covariance (3,1)
26 - WENDLAND2 : Wendland covariance (4,2)
27 - MARKOV : Markovian covariances
Automatic Fitting (with given basic structures)
types=[gl.ECov.NUGGET, gl.ECov.CUBIC, gl.ECov.SPHERICAL]
err = fitmod.fit(varioexp, types=types)
ax = gp.varmod(varioexp, fitmod)
The resulting Model
fitmod
Model characteristics ===================== Space dimension = 2 Number of variable(s) = 1 Number of basic structure(s) = 2 Number of drift function(s) = 0 Number of drift equation(s) = 0 Covariance Part --------------- Cubic - Sill = 0.413 - Range = 75.995 Spherical - Sill = 0.893 - Range = 240.635 Total Sill = 1.305
Model Fitting with Inequality constraints
constraints = gl.Constraints()
err = constraints.addItemFromParamId(gl.EConsElem.RANGE,1,0,0,gl.EConsType.UPPER,20.)
err = constraints.addItemFromParamId(gl.EConsElem.SILL,1,0,0,gl.EConsType.LOWER,0.03)
err = fitmod.fit(varioexp, types, constraints, gl.Option_VarioFit(True))
ax = gp.varmod(varioexp, fitmod)
The resulting Model
fitmod
Model characteristics ===================== Space dimension = 2 Number of variable(s) = 1 Number of basic structure(s) = 3 Number of drift function(s) = 0 Number of drift equation(s) = 0 Covariance Part --------------- Nugget Effect - Sill = 0.000 Cubic - Sill = 0.109 - Range = 20.000 Spherical - Sill = 1.056 - Range = 155.372 Total Sill = 1.165
Model Fitting with Equality constraints
constraints = gl.Constraints()
err = constraints.addItemFromParamId(gl.EConsElem.RANGE,1,0,0,gl.EConsType.EQUAL,1000.)
err = constraints.addItemFromParamId(gl.EConsElem.SILL,1,0,0,gl.EConsType.EQUAL,0.4)
err = fitmod.fit(varioexp, types, constraints, gl.Option_VarioFit(True))
ax = gp.varmod(varioexp, fitmod)
The resulting Model
fitmod
Model characteristics ===================== Space dimension = 2 Number of variable(s) = 1 Number of basic structure(s) = 3 Number of drift function(s) = 0 Number of drift equation(s) = 0 Covariance Part --------------- Nugget Effect - Sill = 0.053 Cubic - Sill = 0.400 - Range = 1000.000 Spherical - Sill = 1.003 - Range = 130.078 Total Sill = 1.457
Directional Variograms
varioParamMulti = gl.VarioParam.createMultiple(4, 15, 15.)
vario_4dir = gl.Vario(varioParamMulti, dat)
err = vario_4dir.compute()
ax = gp.varmod(vario_4dir)
Fitting a Multi-directional variogram
model_4dir = gl.Model()
err = model_4dir.fit(vario_4dir,types=types)
ax = gp.varmod(vario_4dir, model_4dir)
Calculating Variogram Map
grid_vmap = gl.db_vmap_compute(dat, gl.ECalcVario.VARIOGRAM)
ax = grid_vmap.plot()
Automatic Model Fitting from Variogram Map
modelVM = gl.Model()
err = modelVM.fitFromVMap(grid_vmap, types=types)
modelVM
Model characteristics
=====================
Space dimension = 2
Number of variable(s) = 1
Number of basic structure(s) = 2
Number of drift function(s) = 0
Number of drift equation(s) = 0
Covariance Part
---------------
Nugget Effect
- Sill = 0.257
Cubic
- Sill = 0.943
- Ranges = 158.007 214.374
- Angles = 334.704 0.000
- Rotation Matrix
[, 0] [, 1]
[ 0,] 0.904 0.427
[ 1,] -0.427 0.904
Total Sill = 1.200
Drawing the Fitted Model as a Variogram Map
err = gl.dbgrid_model(grid_vmap, modelVM)
ax = grid_vmap.plot()
Compare Directional Variograms and Variogram Map
ax = gp.varmod(vario_4dir, modelVM)