[SOLVED] Krigeage simple par voisinage unique

Any question regarding the Interpolation method using Kriging

[SOLVED] Krigeage simple par voisinage unique

Postby ngop » Fri Apr 12, 2019 1:02 pm

Bonjour,

Je souhaite faire un Krigeage simple limité à la France métropolitaine par voisinage unique mais je rencontre des difficultés.

Mes données représentent des entrepôts répartis sur toute la France avec des capacités de stockage.

Voici mon code :

Code: Select all
#Création de la base de données :
data.db = db.create(data[, c("LB_LONG", "LB_LAT", "CAP_TOTALE")], flag.grid = F, ndim = 2, autoname = F)


Code: Select all
#Création de la grille -
#je voudrais une grille qui maille la France avec des carrés de 10*10km - je ne sais pas trop comment déclarer ma grille :
grid.db=db.grid.init(data.db,nodes=20)


Code: Select all
#Calcul du variogramme expérimental
v_exp=vario.calc(data.db, lag = 0.1, nlag = 20)
plot(v_exp)


Code: Select all
#Ajustement du variogramme expérimental
v_fit=model.auto(v_exp)


Code: Select all
#Krigeage par Voisinage unique
data.u.neigh = neigh.create(ndim = 2, type = 0)
grid.db = kriging(data.db, grid.db, v_fit, data.u.neigh, uc = "", mean = mean(data.db[, "CAP_TOTALE"], na.rm = T), radix = "KS")



Par ailleurs si je voulais faire un Krigeage prenant en compte non une grille, mais un périmètre autour de mes points, que devrais-je faire ?

J'ai vu dans la doc qu'on pouvait choisir le type de voisinage dans le neigh.create
0 : Unique Neighborhood
1 : Bench Neighborhood
2 : Moving Neighborhood
3 : Image Neighborhood
mais je ne comprends pas l'articulation avec la grille (si on fait un voisinage mouvant, on n'a plus besoin de grille je suppose ??)

Merci de votre aide
ngop
 
Posts: 4
Joined: Thu Mar 28, 2019 4:02 pm

Re: Krigeage simple par voisinage unique

Postby Didier Renard » Tue Apr 16, 2019 9:46 am

Bonjour

Beaucoup de questions dans votre post. Je vais essayer de repondre a chacune d'entre elles. J'ai repris votre code pour y inserer mes reponses.

Code: Select all
#Création de la base de données :
data.db = db.create(data[, c("LB_LONG", "LB_LAT", "CAP_TOTALE")], flag.grid = F, ndim = 2, autoname = F)


Code: Select all
#Création de la grille -
#je voudrais une grille qui maille la France avec des carrés de 10*10km - je ne sais pas trop comment déclarer ma grille :
grid.db=db.grid.init(data.db,nodes=20)


Si le but est de determiner une grille avec un pas de 10 x 10km, il est preferable d'utiliser la formule suivante:
Code: Select all
grid.db = db.grid.init(data.db,dcell=10)


Code: Select all
#Calcul du variogramme expérimental
v_exp=vario.calc(data.db, lag = 0.1, nlag = 20)
plot(v_exp)


Code: Select all
#Ajustement du variogramme expérimental
v_fit=model.auto(v_exp)


Code: Select all
#Krigeage par Voisinage unique
data.u.neigh = neigh.create(ndim = 2, type = 0)
grid.db = kriging(data.db, grid.db, v_fit, data.u.neigh, uc = "", mean = mean(data.db[, "CAP_TOTALE"], na.rm = T), radix = "KS")


La formule precedente a pour but d'estimer par krigeage simple, en partant des donnees (de toutes les donnees puisqu'en voisinage unique)
aux noeuds d'une grille reguliere couvrant (largement) toutes les donnees. Je remarque que cette technique va permettre d'estimer la valeur de la variable
a des noeuds de grille se situant tres loin des donnees (en plein ocean atlantique par exemple).

Par ailleurs si je voulais faire un Krigeage prenant en compte non une grille, mais un périmètre autour de mes points, que devrais-je faire ?

J'ai vu dans la doc qu'on pouvait choisir le type de voisinage dans le neigh.create
0 : Unique Neighborhood
1 : Bench Neighborhood
2 : Moving Neighborhood
3 : Image Neighborhood
mais je ne comprends pas l'articulation avec la grille (si on fait un voisinage mouvant, on n'a plus besoin de grille je suppose ??)


Je pense qu' il y a une incomprehension ici.
Le krigeage permet d'estimer une variable:
- a partir de valeurs de la variable definie sur les donnees
- en des points quelconques de l'espace: par exemple aux noeuds d'une grille reguliere (mais on pourrait vouloir estimer la variable en un ensemble de points de l'espace definis dans une autre Db[points]).

La grille (dans votre cas) sert donc de support de sortie.

Ensuite vous voulez faire une estimation qui, pour tout point cible (potentiellement situe au noeud d'une grille), ne se concentre que sur les donnees voisines.
Il suffit alors de definir un voisinage glissant ... en fixant en particulier le rayon maximum de recherche (et en mettant un nombre de donnees immense par recherche... dans ce cas, le programme utilisera TOUTES les donnees possibles sans jamais deborder du cercle centré sur le noeud cible et de rayon fixe) pour effectuer le krigeage.
Je pense que c'est ce que vous souhaitez.

J'espere avoir eclairci ce point.
Didier Renard
 
Posts: 337
Joined: Thu Sep 20, 2012 4:22 pm

Re: Krigeage simple par voisinage unique

Postby ngop » Fri Apr 19, 2019 5:06 pm

Je vous remercie pour ces précisions.

Deux petites questions :
Je vais sans doute partir sur un krigeage à voisinage glissant.

1/ Est-il préférable de mettre la même valeur de voisins (admettons 10 voisins) :
- dans la matrice de distance du critère de voisinage knn2nb(,k=10)
- le variogramme : nlag=10
- dans le krigeage glissant : neigh.create(,nmaxi=10)

2/ Comment filtrer la carte de France pour n'afficher au final que les interpolations à l'intérieur des frontières terrestres françaises en partant du code que vous m'aviez indiquée ?

Merci d'avance
ngop
 
Posts: 4
Joined: Thu Mar 28, 2019 4:02 pm

Re: Krigeage simple par voisinage unique

Postby Didier Renard » Wed Jul 31, 2019 10:24 pm

Desole pour cette reponse tardive.

Je dois dire que je ne comprends pas votre premier point. Le nombre '10' que vous souhaitez utiliser n'a pas le meme sens:
- je ne sais ce que vous appelez la matrice de distance du critere de voisinage
- dans le voisinage (neigh.create), vous limitez le nombre de donnees au 10 points les plus proches (nmaxi). Le voisinage est une ruse afin d'eviter de constituer des matrices de krigeage trop importantes. De maniere generale, il vaut mieux utiliser les plus grands voisinages possibles. Donc le nombre '10' peut etre plutot considere comme trop restreint.
- enfin le nombre de pas du variogramme (mis a 10) est un choix. Le principe est de calculer un variogramme pour un certain nombre de pas (nlag) de taille (lag). Le seul critere est de dire que le produit de nlag * lag ne doit pas depasser la motie de la taille du champ (pour eviter les artefacts lies a la taille du champ). Ensuite le choix du nombre de pas depend de la densite de l'echantillonnage. Plus le nombre de donnees est grand plus on peut prendre une petite valeur pour le pas (lag).

Pour la deuxieme question, la reponse est plus simple.
Il suffit de limiter la grille a representer a l'aide d'une selection. On peut realiser la selection a partir du polygon en utilisant la fonction db.polygon().
Remarque: il est meme plus astucieux de definir cette selection avant d'effectuer le krigeage: en effet, dans ce cas, seuls les noeuds de grille situes a l'interieur de cette selection seront calcules. Ca permettra d'accelerer les calculs.

Cordialement
Didier Renard
 
Posts: 337
Joined: Thu Sep 20, 2012 4:22 pm


Return to Kriging

Who is online

Users browsing this forum: No registered users and 3 guests

cron