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) + m = γ(Xyo-X0 0) ,i = 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 , 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 clickppp
funció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)
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)
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)
Es posible obtener pesos negativos.
Espero que esto te dé una idea de cómo funcionan los pesos.