- Semivariogramas.
- Covariograma y correlograma.
- Estacionalidad fuerte y débil.
- Isotropía y anisotropía.
El semivariograma (\( \frac{1}{2}variograma \)) entre dos variables aleatorias \( Z(\boldsymbol{s}) \) y \( Z(\boldsymbol{s}+\boldsymbol{h}) \), se define por:
\[ \gamma(\boldsymbol{h})=\frac{1}{2}E[(Z(\boldsymbol{s}),Z(\boldsymbol{s}+\boldsymbol{h}))^2] \]
Propiedades
La existencia de la covarianza implica que la varianza existe, es finita y no depende de \( h \), es decir \( Var(Z(s_i)) =C(0)=\sigma^2 \) . Así mismo la estacionariedad de segundo orden implica la siguiente relación entre la función de semivarianza y la de autocovarianza:
\[ \begin{align*} \gamma(Z(s),Z(s+h))&=\frac{1}{2}E[Z(\boldsymbol{s}+\boldsymbol{h})-m+ Z(\boldsymbol{s})+m )]^2\\ &=\frac{1}{2} [E[Z(\boldsymbol{s}+\boldsymbol{h})+m]^2 + E[Z(\boldsymbol{s})-m]^2-2E[Z(\boldsymbol{s}+\boldsymbol{h})-m][Z(\boldsymbol{s})-m]]\\ &= \frac{1}{2} \sigma^2 +\frac{1}{2} \sigma^2-E[(Z(\boldsymbol{s}+h)-m)(Z(\boldsymbol{s})-m)]\\ &=\sigma^2-C(h) \end{align*} \]
\[ \begin{align*} 2\gamma(h)=&Var[Z(\boldsymbol{s}+h]-Z(\boldsymbol{s})]\\ =&E[(Z(\boldsymbol{s}+h)-Z(\boldsymbol{s}))^2]-(E[Z(\boldsymbol{s}+h)-Z(\boldsymbol{s})])^2\\ =&E[(Z(\boldsymbol{s}+h)-Z(\boldsymbol{s}))^2] \end{align*} \]
\[ \hat{\gamma}(h)=\frac{\sum(Z(s+h)-Z(s))^2}{2n} \]
Definimos el semivariograma empírico \( \hat{\gamma}(h_k) \) como: promedio de incrementos al cuadrado para una clase \( h_k \),
\[ \hat{\gamma}(h_k)=\frac{1}{2N(h_k)}\sum_{(s_i,s_j)\in N(h_K)}[Z(s_i)-Z(s_j)]^2 \]
donde \( N(h_k) \) es el número de rezagos \( h = s_i-s_j \) dentro de la distancia (y el ángulo) en la clase \( h_k \).
Los valores de los variogramas generalmente solo se presentan para las distancias hasta el diámetro de los datos: no mostramos los valores del variograma para las diferencias de los pares más largos.
Variograma (traslación rotación)
Los variogramas se calculan para diferentes distancia(incrementos), y generalmente para diferentes direcciones, de modo que podamos verificar un componente de longitud y de dirección.
Donde
La función de covarianza muestral o el Covariograma entre parejas de observaciones que se encuentran a una distancia \( h \) se calcula, empleando la formula clásica de la covarianza muestral, por:
\[ \begin{align*} C(h)=&Cov[Z(\boldsymbol{s}+h]-Z(\boldsymbol{s})]\\ =&\frac{\sum_{i=1}^n(Z(\boldsymbol{s}+h)-m)(Z(\boldsymbol{s})-m)}{n}\\ =&\frac{\sum_{i=1}^n(Z(\boldsymbol{s}+h)Z(s))}{n} -m^2=C(h) \end{align*} \]
donde \( m \) representa el valor promedio en todo punto de la región de estudio y \( n \) es el número de parejas de puntos que se encuentran a una distancia \( h \).
El correlograma (coeficiente de correlación lineal) entre dos variables aleatorias espaciales \( Z(\boldsymbol{s}) \) y \( Z(\boldsymbol{s}+h) \)
\[ \begin{align*} \rho(\boldsymbol{h})=&Cor[Z(\boldsymbol{s}+h),Z(\boldsymbol{s})]\\ =&\frac{Cov[Z(\boldsymbol{s}+h),Z(\boldsymbol{s})]}{\sqrt{Var[Z(\boldsymbol{s}+h)]Var[Z(\boldsymbol{s})]}}\\ =&\frac{C(h)}{C(0)}\\ \end{align*} \]
Bajo el supuesto de estacionariedad cualquiera de las tres funciones de dependencia espacial mencionadas, es decir semivariograma, covariograma o correlograma, puede ser usada en la determinación de la relación espacial entre los datos.
Observación
Cuando existe superposición de los variogramas direccionales: el variograma es isotrópico; de lo contrario, diremos que el campo es anisotrópico.
El variograma exhibe una anisotropía más compleja: diferentes formas según la dirección.
Análisis de isotropía espacial (en R
): Usar el raster del taller 1, para hacer un análisis isotrópico espacial, de la variable temperatura (\( Z(s) \)) en cada punto del mapa. Gráfique para cada una de las diferentes posibilidades de desplazamiento del rango de ángulo \( [0, \pi] \), con incrementos de \( \pi/4 \).
Cálculo de semivariograma-variograma(manual): Dado los 5 puntos de la variable lluvia, sobre \( D \subset \mathbb{R}^2 \), estime el variograma direccional este-oeste usar una tolerancia de 0 grados.
Punto | Coordenadas | Lluvia |
---|---|---|
1 | (2,4) | 33 |
2 | (-3,0) | 55 |
3 | (1,1) | 41 |
4 | (3,-2) | 36 |
5 | (-1,2) | 35 |
# Leamos los datos de meuse
library(raster)
filename <- system.file("external/test.grd", package="raster")
# Creamos el raster
r <- raster(filename)
# grafica
plot(r)
library(gstat)
library(geoR)
# el raster lo convertimos a dataframe espacial
point_data <- as(r, 'SpatialPointsDataFrame')
# convertimos a clase geodata
geo.df <- as.geodata(point_data)
# creamos el variograma
geor_variogram <- variog(geo.df)
# grafica de los puntos estimados por el variograma
plot(geor_variogram,col=1)
# función teorica del variograma (exp, sph, power,)
lines.variomodel(cov.model="exp", cov.pars=c(32000,1000), nug=10000, max.dist=max(geor_variogram$u), col=2)
lines.variomodel(cov.model="sph", cov.pars=c(32000,1000), nug=10000, max.dist=max(geor_variogram$u), col=3)
legend("bottomright",legend=c('Observado','Exponencial','Esferico'),lty=c(NA,1,1),pch=c(1,NA,NA),
col=1:3,lwd=c(2,2,2),bty="n",cex=.4)
library(gstat)
library(geoR)
# el raster lo convertimos a dataframe espacial
point_data <- as(r, 'SpatialPointsDataFrame')
# convertimos a clase geodata
geo.df <- as.geodata(point_data)
# creamos el variograma
geor_variogram <- variog(geo.df, dir=pi/2, tol=0)
# grafica de los puntos estimados por el variograma
plot(geor_variogram,col=1)
# función teorica del variograma (exp, sph, power,)
lines.variomodel(cov.model="exp", cov.pars=c(38000,1000), nug=10000, max.dist=max(geor_variogram$u), col=2)
lines.variomodel(cov.model="sph", cov.pars=c(38000,1000), nug=10000, max.dist=max(geor_variogram$u), col=3)
legend("topleft",legend=c('Observado','Exponencial','Esferico'),lty=c(NA,1,1),pch=c(1,NA,NA),
col=1:3,lwd=c(2,2,2),bty="n")
A continuación, veremos un ejemplo de autocorrelación temporal, que nos auyuda a entender la autocorrelación espacial.
set.seed(0)
d <- sample(100, 10)
Cálculo de la auto-correlación
a <- d[-length(d)]
b <- d[-1]
plot(a, b, xlab='t', ylab='t-1')
La corrrelación es
cor(a, b)
La autocorrelación calculada arriba es muy pequeña. Aunque esta es una muestra aleatoria, usted (casi) nunca obtiene un valor de cero. Calculamos la autocorrelación de “un retraso”, que es, comparamos cada valor con su vecino inmediato, y no con otros valores cercanos.
Después de los números en la autocorrelación se vuelve muy fuerte (como era de esperar).
d <- sort(d)
a <- d[-length(d)]
b <- d[-1]
plot(a, b, xlab='t', ylab='t-1')
La correlación es
cor(a, b)
La función acf
muestra la autocorrelación calculada de una manera diferente (es 1 para cada punto en sí mismo, cuando se compara con el vecino más cercano, y luego se reduce gradualmente).
acf(d)
Los objetos espaciales tienen (al menos) dos dimensiones y formas complejas, y puede no ser obvio cómo determinar qué está “cerca”.
Las ecuaciones espaciales de autocorrelación espacial describen el grado en que son puntos, áreas o celdas de trama, son similares entre sí. Entonces necesitamos dos cosas: observaciones y ubicaciones.
La autocorrelación espacial en una variable puede ser:
Una estadística comúnmente utilizada que describe la autocorrelación espacial es el estadístico de Moran
Otros índices incluyen C de Geary y, para datos binarios, el índice de recuento de uniones.
El semi-variograma(del que hablamos anteriormente) también expresa la cantidad de autocorrelación espacial en un conjunto de datos.
El siguiente ejemplo se basa en un problema de autocorrelación de regiones.
Digamos que estamos interesados en la autocorrelación espacial en la variable “área”. Si hubiera autocorrelación espacial, las regiones de un tamaño similar estarían agrupadas espacialmente.
Aquí hay un diagrama de los polígonos. Utilizo las coordenadas para obtener los centroides de los polígonos para colocar las etiquetas.
library(raster)
p <- shapefile(system.file("external/lux.shp", package="raster"))
p <- p[p$NAME_1=="Diekirch", ]
p$value <- c(10, 6, 4, 11, 6)
data.frame(p)
Veamos la gráfica
par(mai=c(0,0,0,0))
xy <- coordinates(p)
plot(p, col=2:7)
points(xy, cex=6, pch=20, col='white')
text(p, 'ID_2', cex=1.5)
Ahora necesitamos determinar qué polígonos están “cerca” y cómo cuantificar eso. Aquí usaremos la adyacencia como criterio. Para encontrar polígonos adyacentes, podemos usar la librería spdep
.
library(spdep)
w <- poly2nb(p, row.names=p$Id)
class(w)
summary(w)
summary(w)
nos dice algo sobre el vecindario. Para más detalles, podemos ver la estructura de w
.
str(w)
Pregunta de tarea: ¿Qué el significan las primeras 5 líneas devueltas por str(w)
Veamos los enlaces entre los polígonos para cada centro.
plot(p, col='gray', border='blue', lwd=2)
plot(w, xy, col='red', lwd=2, add=TRUE)
Podemos transformar w
en una matriz de ponderaciones espaciales. Una matriz de ponderaciones espaciales refleja la intensidad de la relación geográfica entre las observaciones.
wm <- nb2mat(w, style='B') #W
Ahora veamos el índice de autocorrelación espacial de Moran.
\[ I = \frac{n}{\sum_{i=1}^n (y_i - \bar{y})^2} \frac{\sum_{i=1}^n \sum_{j=1}^n w_{ij}(y_i - \bar{y})(y_j - \bar{y})}{\sum_{i=1}^n \sum_{j=1}^n w_{ij}} \]
donde \( n \) es el número de unidades espaciales indexados por \( i \) y \( j \); \( y \) es la variable de interés; \( \bar{y} \) es la media de \( y \); y \( w_{ij} \) es un elemento de una matriz de pesos espaciales.
El valor esperado del estadístico de Moran bajo la hipótesis nula de no autocorrelación espacial es
\[ E(I)=\frac{-1}{n-1} \]
Usemos los datos del shapefile
p, que utilizamos antes.
Primero tomemos la longitud de p
n <- length(p)
Ahora \( y \) y su media \( \bar{y} \)
y <- p$value
ybar <- mean(y)
Ahora necesitamos \( (y_i−\bar{y})(y_j−\bar{y}) \)
Método 1:
dy <- y - ybar
g <- expand.grid(dy, dy)
yiyj <- g[,1]*g[,2]
Método 2:
yi <- rep(dy, each=n)
yj <- rep(dy)
yiyj <- yi * yj
Hacer una matriz de los pares multiplicados
pm <- matrix(yiyj, ncol=n)
Y multiplique esta matriz con los pesos para que sea igual al valor para los pares que no son adyacentes.
pmw <- pm * wm
Ahora sumamos los valores, para obtener la parte \( \sum_{i=1}^n \sum_{j=1}^n w_{ij}(y_i - \bar{y})(y_j - \bar{y}) \) del estadístico de Moran:
spmw <- sum(pmw)
El siguiente paso es dividir este valor por la suma de los pesos.
smw <- sum(wm)
sw <- spmw/smw
Y calcule la varianza inversa de \( y \)
vr <- n / sum(dy ^ 2)
El último paso para calcular el estadístico de Moran
MI <- vr * sw
EI <- -1 / (n-1)
spdep
para calcular Moran y hacer una prueba de significación. ww <- nb2listw (w, style = 'B')
moran(y, ww, n, Szero(ww))
. moran(p$value, ww, n=length(ww$neighbours), S0=Szero(ww))
Ahora podemos probar la significancia. Primero analíticamente, usando lógica basada en regresión lineal y suposiciones.
moran.test(p$value, ww, randomisation=FALSE)
#Cual es el numero maximo de simulaciones
moran.mc(p$value, ww, nsim=ns)
Podemos hacer un “diagrama de dispersión de Moran” para visualizar la autocorrelación espacial. Primero obtenemos los valores vecinos para cada valor.
n <- length(p)
ms <- cbind(id=rep(1:n, each=n), y=rep(y, each=n), value=as.vector(wm * y))
Eliminar los ceros
ms <- ms[ms[,3] > 0, ]
Y calcule el valor promedio del vecino
ams <- aggregate(ms[,2:3], list(ms[,1]), FUN=mean)
ams <- ams[,-1]
colnames(ams) <- c('y', 'Retraso de las y')
head(ams)
Y graficamos
plot(ams)
reg <- lm(ams[,2] ~ ams[,1])
abline(reg, lwd=2)
abline(h=mean(ams[,2]), lt=2)
abline(v=ybar, lt=2)
Usar los datos del raster del mapa de Colombia para evaluar el estadístico de Moran (todo lo que se hizo en clase).(recuerde que debe excluir a San Andres y providencia)