Ejemplo de kriging ordinario paso a paso?

8

He seguido tutoriales en línea para kriging espacial con ambos geoRy gstat(y también automap). Puedo realizar kriging espacial y entiendo los conceptos principales detrás de él. Sé cómo construir un semivariograma, cómo ajustarle un modelo y cómo realizar kriging ordinario.

Lo que no entiendo es cómo se determinan los pesos de los valores medidos circundantes. Sé que derivan del semivariograma y dependen de la distancia desde la ubicación de predicción y de la disposición espacial de los puntos medidos. ¿Pero cómo?

¿Alguien podría hacer un modelo ordinario de kriging (no bayesiano) con 3 puntos medidos al azar y 1 lugar de predicción? Sería esclarecedor.

Pigna
fuente
1
solo por curiosidad, ¿por qué no quieres ver la respuesta bayesiana? Hace las cosas mucho más simples cuando se trata de procesos gaussianos.
DeltaIV
@DeltaIV porque primero quiero aprender la forma frecuentista. Las estadísticas bayesianas todavía están nubladas para mí
Pigna
1
" Lo que no entiendo es cómo se determinan los pesos de los valores medidos circundantes ". En caso de que alguien esté interesado, publiqué una respuesta en GIS SE con un ejemplo sobre cómo calcularlos ( gis.stackexchange.com/questions/270274/… ). ¡Pero la respuesta aquí es genial ya!
Andre Silva el

Respuestas:

9

Primero describiré kriging ordinario con tres puntos matemáticamente. Supongamos que tenemos un campo aleatorio intrínsecamente estacionario.

Kriging ordinario

Estamos tratando de predecir el valor. Z(X0 0) utilizando los valores conocidos Z=(Z(X1),Z(X2),Z(X3)) La predicción que queremos es de la forma

Z^(X0 0)=λTZ
dónde λ=(λ1,λ2,λ3)son los pesos de interpolación. Asumimos un valor medio constanteμ. Para obtener un resultado imparcial, arreglamosλ1+λ2+λ3=1. Entonces obtenemos el siguiente problema:
minmi(Z(X0 0)-λTZ)2S tλT1=1)
Usando el método multiplicador de Lagrange, obtenemos las ecuaciones:
j=13λjγ(Xyo-Xj)+metro=γ(Xyo-X0 0),yo=1,2,3,
j=13λj=1,
dónde metro es el multiplicador lagrange y γes el (semi) variograma. De esto, podemos observar un par de cosas:
  • Los pesos no dependen del valor medio. μ.
  • Los pesos no dependen de los valores de Zen absoluto. Solo en las coordenadas (en el caso isotrópico solo en la distancia)
  • Cada peso depende de la ubicación de todos los demás puntos.

El comportamiento preciso de los pesos es difícil de ver solo a partir de la ecuación, pero uno puede decir más o menos :

  • Cuanto más lejos esté el punto de X0 0, cuanto menor sea su peso ("más" con respecto a otros puntos).
  • Sin embargo, estar cerca de otros puntos también reduce el peso.
  • El resultado depende mucho de la forma, el rango y, en particular, el efecto de pepita del variograma. Sería muy esclarecedor considerar el kriging enR con solo dos puntos y vea cómo cambia el resultado con diferentes configuraciones de variograma.

Sin embargo, me enfocaré en la ubicación de los puntos en un plano. Escribí esta pequeña función R que toma puntos de[0 0,1]2 y traza los pesos de kriging (para la función de covarianza exponencial con nugget cero).

library(geoR)

# Plots prediction weights for kriging in the window [0,1]x[0,1] with the prediction point (0.5,0.5)
drawWeights <- function(x,y){
 df <- data.frame(x=x,y=y, values = rep(1,length(x)))
  data <- as.geodata(df, coords.col = 1:2, data.col = 3)

  wls <- variofit(bin1,ini=c(1,0.5),fix.nugget=T)
  weights <- round(as.numeric(krweights(data$coords,c(0.5,0.5),krige.control(obj.mod=wls, type="ok"))),3)

  plot(data$coords, xlim=c(0,1),  ylim=c(0,1))
  segments(rep(0.5,length(x)), rep(0.5,length(x)),x, y, lty=3 )
  text((x+0.5)/2,(y+0.5)/2,labels=weights)
}

Puedes jugar con él utilizando la clickpppfunción de spatstat :

library(spatstat)
points <- clickppp()
drawWeights(points$x,points$y)

Aquí hay un par de ejemplos

Puntos equidistantes de X0 0 y el uno del otro

deg <- seq(0,2*pi,length.out=4)
deg <- head(deg,length(deg)-1)
x <- 0.5*as.numeric(lapply(deg, cos)) + 0.5
y <- 0.5*as.numeric(lapply(deg, sin)) + 0.5
drawWeights(x,y)

ingrese la descripción de la imagen aquí

Los puntos cercanos entre sí compartirán los pesos

deg <- c(0,0.1,pi)
x <- 0.5*as.numeric(lapply(deg, cos)) + 0.5
y <- 0.5*as.numeric(lapply(deg, sin)) + 0.5
drawWeights(x,y)

ingrese la descripción de la imagen aquí

Punto cercano "robando" las pesas

deg <- seq(0,2*pi,length.out=4)
deg <- head(deg,length(deg)-1)
x <- c(0.6,0.5*as.numeric(lapply(deg, cos)) + 0.5)
y <- c(0.6,0.5*as.numeric(lapply(deg, sin)) + 0.5)
drawWeights(x,y)

https://i.imgur.com/MeuPvFT.png

Es posible obtener pesos negativos.

ingrese la descripción de la imagen aquí

Espero que esto te dé una idea de cómo funcionan los pesos.

Dahn
fuente