Sunteți pe pagina 1din 10

ESTADISTICA ESPACIAL EN EPIDEMIOLOGIA Y MEDIO AMBIENTE

Practica 1: GEOESTADISTICA

En esta practica trabajaremos los elementos necesarios para realizar un estudio geoestadsti-
co de un banco de datos: estimacion del variograma, determinacion de superficies de tendencia
y prediccion espacial mediante kriging. Realizaremos la prediccion espacial mediante kriging,
empleando tres metodos diferentes: kriging ordinario, kriging universal y kriging pulido por la
mediana.

1. Estimacion del variograma


Comenzaremos leyendo el fichero de datos de la altura del acufero de Texas mediante el
mandato source(). Posteriormente exploramos los datos incorporados a la sesion de trabajo,
y los representamos espacialmente en 2 y 3 dimensiones.

Cuadro 1: Exploracion de datos geoestadsticos


> source(aquifer.r)
> attach(aquifer)
> plot(easting,northing,pch=20,xlab=longitud,ylab=latitud)
> plot(easting,northing,type=n,xlab=longitud,ylab=latitud)
> text(easting,northing,head,cex=0.6)
> source(scatterplot3d.r)
> scatterplot3d(easting,northing,head,xlab=longitud,
ylab=latitud,zlab=altura)
> detach(aquifer)
ESTADISTICA ESPACIAL EN EPIDEMIOLOGIA Y MEDIO AMBIENTE Practica 1

La estimacion del variograma emprico se realiza en la librera geoR con el comando variog().

Cuadro 2: Estimacion del variograma


> library(geoR)
> aq.geo<-as.geodata(aquifer)
> plot.geodata(aq.geo)

# estimador clasico
> aq.cl1<-variog(aq.geo,option=cloud)
> plot(aq.cl1,pch=20)
> aq.v1<-variog(aq.geo,uvec=seq(0,260,20))
> plot(aq.v1,pch=20)
> aq.vc1<-variog(aq.geo,uvec=seq(0,260,20),bin.cloud=T)
> plot(aq.vc1,bin.cloud=T)

# estimador robusto
> aq.cl2<-variog(aq.geo,option=cloud,estimator.type=modulus)
> plot(aq.cl2,pch=20)
> aq.v2<-variog(aq.geo,uvec=seq(0,260,20),estimator.type=modulus)
> plot(aq.v2,pch=20)
> aq.vc2<-variog(aq.geo,uvec=seq(0,260,20),estimator.type=modulus,
bin.cloud=T)
> plot(aq.vc2,bin.cloud=T)

Es necesario probar con diferentes amplitudes de los intervalos del variograma.

Cuadro 3: Pruebas con varios intervalos


> plot(variog(aq.geo,uvec=seq(0,260,10)))
> plot(variog(aq.geo,uvec=seq(0,260,5)))
> plot(variog(aq.geo,uvec=seq(0,260,2)))
> plot(variog(aq.geo,uvec=seq(0,260,1)))
> plot(variog(aq.geo,uvec=seq(0,280,40)))
> plot(variog(aq.geo,uvec=seq(0,300,50)))
> plot(variog(aq.geo,uvec=seq(0,320,80)))

2
ESTADISTICA ESPACIAL EN EPIDEMIOLOGIA Y MEDIO AMBIENTE Practica 1

La busqueda de un modelo de variograma valido se realiza estimando los variogramas de


diferentes familias (por ejemplo los del Cuadro 4).

Cuadro 4: Variograma emprico y modelo de variograma


> aq.exp.ml<-likfit(geodata = aq.geo, ini = c(500000,150))
> aq.sph.ml<-likfit(geodata = aq.geo, ini = c(500000,150),
cov.model=sph)
> aq.mat.ml<-likfit(geodata = aq.geo, ini =c(500000, 150),
cov.model=mat,kappa=1.5)
> aq.mat2.ml<-likfit(geodata = aq.geo, ini = c(500000,150),
cov.model=mat,kappa=1,fix.nugget=T)
> aq.cir.ml<-likfit(geodata = aq.geo, ini = c(500000,150),
cov.model=cir)
> aq.gau.ml<-likfit(geodata = aq.geo, ini =c(500000, 50),
cov.model=gau)
> aq.cub.ml<-likfit(geodata =aq.geo, ini = c(500000, 150),
cov.model=cub)
> aq.pow.ml<-likfit(geodata = aq.geo, ini = c(500000,150),
cov.model=powered.exponential,kappa=1.75)
> aq.pow2.ml<-likfit(geodata =aq.geo, ini = c(500000,150),
cov.model=powered.exponential,kappa=1.75,fix.nugget=T)
> plot(aq.v1)
> lines(aq.pow2.ml,max.dist=250,lwd=3,col=red)
> lines(aq.mat2.ml,max.dist=250,lwd=3,col=blue)
> lines(aq.pow.ml,max.dist=250,lwd=3,col=green)
> lines(aq.mat.ml,max.dist=250,lwd=3,col=yellow)
> lines(aq.cub.ml,max.dist=250,lwd=3,col=orange)
> lines(aq.gau.ml,max.dist=250,lwd=3,col=cyan)
> lines(aq.cir.ml,max.dist=250,lwd=3,col=grey)
> lines(aq.exp.ml,max.dist=250,lwd=3,col=magenta)
> lines(aq.sph.ml,max.dist=250,lwd=3,col=pink)

3
ESTADISTICA ESPACIAL EN EPIDEMIOLOGIA Y MEDIO AMBIENTE Practica 1

Ademas, pueden ajustarse con cuatro metodos distintos (Cuadro 5).

Cuadro 5: Metodos de ajuste del variograma


> aq.mat.ml<-likfit(geodata = aq.geo, ini = c(500000,150),
cov.model=mat,kappa=1.5)
> aq.mat.rml<-likfit(geodata =aq.geo, ini = c(500000,150),
cov.model=mat,kappa=1.5,method=RML)
> aq.mat.ols<-variofit(vario = aq.v1, ini = c(300000,100),
cov.model=mat,kappa=1.5,weights=equal,
minimisation.function=optim)
> aq.mat.wls<-variofit(vario = aq.v1,ini = c(500000, 100),
cov.model=mat,kappa=1.5,weights=npairs)
> aq.pow.ml<-likfit(geodata = aq.geo, ini = c(500000,150),
cov.model=powered.exponential,kappa=1.75)
> aq.pow.rml<-likfit(geodata =aq.geo, ini = c(500000,150),
cov.model=powered.exponential,kappa=1.75,method=RML)
> aq.pow.ols<-variofit(vario = aq.v1, ini = c(500000,150),
cov.model=powered.exponential,kappa=1.75,weights=equal,
minimisation.function=optim)
> aq.pow.wls<-variofit(vario =aq.v1, ini = c(500000, 150),
cov.model=powered.exponential,kappa=1.75,weights=npairs)
> plot(aq.v1)
> lines(aq.mat.ml,max.dist=250,lwd=3)
> lines(aq.mat.rml,max.dist=250,lwd=3,lty=2)
> lines(aq.mat.ols,max.dist=250,lwd=3,lty=3)
> lines(aq.mat.wls,max.dist=250,lwd=3,lty=4)
> legend(20,2000000,legend=c(ML,RML,OLS,WLS),
lty=c(1,2,3,4))
> plot(aq.v1)
> lines(aq.pow.ml,max.dist=250,lwd=3)
> lines(aq.pow.rml,max.dist=250,lwd=3,lty=2)
> lines(aq.pow.ols,max.dist=250,lwd=3,lty=3)
> lines(aq.pow.wls,max.dist=250,lwd=3,lty=4)
> legend(20,2000000,legend=c(ML,RML,OLS,WLS),
lty=c(1,2,3,4))

2. Superficies de tendencia
La determinacion de superficies de tendencia puede realizarse con varias funciones de la
librera spatial. Las superficies de tendencia polinomiales se ajustan mediante el comando
surf.ls(), y puede evaluarse en un grid sobre una region con trmat().

4
ESTADISTICA ESPACIAL EN EPIDEMIOLOGIA Y MEDIO AMBIENTE Practica 1

Cuadro 6: Calculo de superficies de tendencia


> library(spatial)
> attach(aquifer)
> aq.ls<-surf.ls(3,easting,northing,head)
> aq.trsurf<-trmat(aq.ls, -150, 120, 0, 190, 100)

Es conveniente realizar su representacion grafica con alguna de las opciones presentadas en


el Cuadro 7.

Cuadro 7: Representacion de superficies de tendencia


> par(pty=s,mar=c(2,2,2,2))
> contour(aq.trsurf)
> points(easting,northing,pch=20)
> par(mar=c(0,0,0,0))
> image(aq.trsurf)
> points(easting,northing,pch=20)
> par(mfrow=c(1,1))
> persp(aq.trsurf)
> persp(aq.trsurf,theta=60,phi=30,col=2,ltheta=-20,shade=0.25,
xlab=longitud,ylab=latitud)
> detach(aquifer)

Tras eliminar la tendencia observada, hay que analizar de nuevo la variabilidad residual y
estimar el variograma, como en los Cuadros 8 y 9.

Cuadro 8: Eliminacion de tendencias


> aq.sin<-aquifer[,3]-predict(aq.ls,aquifer[,1],aquifer[,2])
> aqs.geo<-aq.geo
> aqs.geo$data<-aq.sin
> plot.geodata(aqs.geo)
> plot(variog(aqs.geo),pch=20)
> aqs.v1<-variog(aqs.geo,uvec=seq(0,100,10),max.dist=120)
> plot(aqs.v1)

5
ESTADISTICA ESPACIAL EN EPIDEMIOLOGIA Y MEDIO AMBIENTE Practica 1

Cuadro 9: Estimacion del variograma sin tendencia


> aqs.exp.ml<-likfit(geodata = aqs.geo, ini =c(30000,50))
> aqs.sph.ml<-likfit(geodata = aqs.geo, ini =c(30000,50),
cov.model=sph)
> aqs.mat.ml<-likfit(geodata =aqs.geo, ini = c(30000,50),
cov.model=mat,kappa=1.5)
> aqs.mat2.ml<-likfit(geodata = aqs.geo, ini = c(30000,50),
cov.model=mat,kappa=1,fix.nugget=T)
> aqs.cir.ml<-likfit(geodata = aqs.geo, ini = c(30000,50),
cov.model=cir)
> aqs.gau.ml<-likfit(geodata = aqs.geo, ini =c(30000,50),
cov.model=gau)
> aqs.cub.ml<-likfit(geodata =aqs.geo, ini = c(30000,50),
cov.model=cub)
> aqs.pow.ml<-likfit(geodata = aqs.geo, ini = c(30000,50),
cov.model=powered.exponential,kappa=1.75)
> aqs.pow2.ml<-likfit(geodata =aqs.geo, ini = c(30000,50),
cov.model=powered.exponential,kappa=1.75,fix.nugget=T)

> aqs.exp.ml<-likfit(geodata=aqs.geo,ini=c(30000,50))
> aqs.exp.rml<-likfit(geodata=aqs.geo,ini=c(30000,50),method=RML)
> aqs.exp.ols<-variofit(vario=aqs.v1,ini=c(30000,50),weights=equal,
minimisation.function=optim)
> aqs.exp.wls<-variofit(vario=aqs.v1,ini=c(30000,50),weights=npairs)

3. Kriging ordinario
Continuaremos el estudio de los datos de la altura del acufero de Texas. La prediccion
mediante kriging ordinario esta basada en la variograma ajustado previamente. El ajuste em-
pleado es el de la familia de Matern, con = 1,5. Predeciremos el proceso sobre una red regular
de puntos que cubren toda la region.

6
ESTADISTICA ESPACIAL EN EPIDEMIOLOGIA Y MEDIO AMBIENTE Practica 1

Cuadro 10: Kriging ordinario


> loci <- expand.grid(seq(-140,110,l=31), seq(10,180,l=31))
> plot(aq.geo$coords)
> points(loci,cex=0.3)
> kc1<-krige.conv(aq.geo,locations=loci,krige=krige.control(
cov.pars=aq.mat.ml$cov.pars,nugget=aq.mat.ml$nugget))
> par(mfrow=c(2,2))
> image.kriging(kc1,loc=loci,main=estimacion kriging)
> image.kriging(kc1,loc=loci,val=sqrt(kc1$krige.var),
main=error estandar)
> persp.kriging(kc1,loc=loci,main=estimacion kriging,phi=30,theta=45)
> persp.kriging(kc1,loc=loci,val=sqrt(kc1$krige.var),
main=error estandar)

Otra alternativa, consiste en determinar una superficie de tendencia, eliminar dicha ten-
dencia observada, y analizar los residuos mediante kriging ordinario. La superficie aq.ls es el
ajuste de una superficie polinomial de grado 3. Los residuos fueron guardados en aqs.geo y el
variograma estimado fue uno de la familia exponencial.

Cuadro 11: Kriging ordinario de los residuos


> evaltend<-function(superf,puntos){
predict(superf,puntos[,1],puntos[,2])}
> kc2<-krige.conv(aqs.geo,locations=loci,krige=krige.control(
cov.pars=aqs.exp.ols$cov.pars,nugget=aqs.exp.ols$nugget))
> par(mfrow=c(2,2))
> image.kriging(kc2,loc=loci,val=kc2$predict+evaltend(aq.ls,loci),
main=estimacion kriging)
> image.kriging(kc2,loc=loci,val=sqrt(kc2$krige.var),
main=error estandar)
> persp.kriging(kc2,loc=loci,val=kc2$predict+evaltend(aq.ls,loci),
main=estimacion kriging,phi=30,theta=45)
> persp.kriging(kc2,loc=loci,val=sqrt(kc2$krige.var),
main=error estandar)

4. Kriging universal
El kriging universal incorpora directamente la superficie de tendencia u otras funciones
ligadas a las localizaciones, evaluadas en los puntos de observacion y en los de prediccion.

7
ESTADISTICA ESPACIAL EN EPIDEMIOLOGIA Y MEDIO AMBIENTE Practica 1

Cuadro 12: Kriging universal


> kc3<-krige.conv(aq.geo,locations=loci,krige=krige.control(trend.d=
evaltend(aq.ls,aq.geo$coords),trend.l=evaltend(aq.ls,loci),
cov.pars=aqs.exp.ols$cov.pars,nugget=aqs.exp.ols$nugget))
> par(mfrow=c(2,2))
> image.kriging(kc3,loc=loci,main=estimacion kriging)
> image.kriging(kc3,loc=loci,val=sqrt(kc3$krige.var),
main=error estandar)
> persp.kriging(kc3,loc=loci,main=estimacion kriging,phi=30,theta=45)
> persp.kriging(kc3,loc=loci,val=sqrt(kc3$krige.var),
main=error estandar)

5. Kriging pulido por la mediana


El kriging efectuado a partir de datos regularmente distribuidos puede realizarse mediante
el algoritmo de pulido por la mediana. Como ejemplo analizaremos los datos de porcentaje
de ceniza de carbon observados en 208 puntos siguiendo un muestreo regular de una mina en
Pennsylvania.

Cuadro 13: Datos de porcentaje de ceniza de carbon


> source(carbon.r)
> ca.geo<-as.geodata(carbon)
> plot.geodata(ca.geo)
> plot(carbon$x,carbon$y,type=n,lab=c(16,23,71),xlab=x,ylab=y)
> text(carbon$x,carbon$y,format(round(carbon$carbon,1)),cex=0.5)
> scatterplot3d(carbon$x,carbon$y,carbon$carbon,type=h,pch=16,
xlab=x,ylab=y,zlab=carbon)

El algoritmo de pulido por la mediana esta implementado en el R en el comando medpolish().


Una variacion es la funcion mpulido(), que permite que los datos no ocupen toda la matriz
rectangular. El algoritmo es una tecnica robusta similar al analisis de la varianza de dos factores
cruzados.

Cuadro 14: Algoritmo de pulido por la mediana


> source(mpulido.r)
> matca<-matrix(nrow=16,ncol=23)
> for (i in 1:208)
> matca[carbon[i,1],carbon[i,2]]<- carbon[i,3]
> ca.mp<-mpulido(matca)

El resultado del procedimiento facilita la construccion de una superficie de tendencia de las


medianas, que podemos evaluar en los puntos de la red regular empleada, tal y como se ilustra
en el Cuadro 15.

8
ESTADISTICA ESPACIAL EN EPIDEMIOLOGIA Y MEDIO AMBIENTE Practica 1

Cuadro 15: Superficie de tendencia de las medianas


> sup.mp<-matrix(nrow=16,ncol=23) for (i in 1:16)
> for (j in 1:23)
> sup.mp[i,j]<- ca.mp$overall+ca.mp$row[i]+ca.mp$col[j]
> persp(sup.mp,theta=45)
> image(sup.mp)

Tras eliminar la tendencia observada, hay que analizar la variabilidad residual y estimar el
variograma, como en los Cuadros 16 y 17. Puede apreciarse que el variograma resultante es
constante, ajustando un modelo de pepita puro.

Cuadro 16: Eliminacion de tendencias


> casmp.geo<-ca.geo
> for (i in 1:208)
> casmp.geo$data[i]<-ca.geo$data[i]-
sup.mp[ca.geo$coords[i,1],ca.geo$coords[i,2]]
> plot.geodata(casmp.geo)

Cuadro 17: Estimacion del variograma sin tendencia


> casmp.v<-variog(casmp.geo,uvec=seq(0,26,1),max.dist=20)
> plot(casmp.v)
> casmp.nug.ml<-likfit(geodata=casmp.geo,ini=c(1,0,0),
cov.model=pure.nugget)
> lines(casmp.nug.ml,max.dist=20,lwd=2)

La prediccion mediante kriging ordinario sobre los residuos, unida a la evaluacion de la


superficie de tendencia de las medianas, proporciona la prediccion final del proceso. Para un
punto concreto (8.2,10.6), sera necesario interpolar las medianas de las filas y columnas proxi-
mas, como se realiza en el Cuadro 18. El resultado final es el intervalo de prediccion al 95 %
en ese punto.

9
ESTADISTICA ESPACIAL EN EPIDEMIOLOGIA Y MEDIO AMBIENTE Practica 1

Cuadro 18: Prediccion en un punto


> kca<-krige.conv(casmp.geo,locations=c(8.2,10.6),krige=krige.control(
cov.pars=casmp.nug.ml$cov.pars,nugget=casmp.nug.ml$nugget))
> pred.ca<-kca$predict+ca.mp$overall+ca.mp$row[8]+ca.mp$col[10]+
0.2*(ca.mp$row[9]-ca.mp$row[8])+0.6*(ca.mp$col[11]-ca.mp$col[10])
> c(pred.ca-1.96*sqrt(kca$krige.var),pred.ca+1.96*sqrt(kca$krige.var))

6. Ejercicio: Altitud del terreno


Analizad los datos de la elevacion del terreno observada en 52 puntos del mismo. Determinad
si existe algun tipo de tendencia, y estudiad la estructura del variograma. Emplead el analisis
de la tendencia y del variograma efectuado previamente para realizar una prediccion de la
altitud del terreno en el punto de coordenadas (3,3). Comparad la prediccion aportada por los
distintos tipos de kriging aplicables al problema.

Cuadro 19: Ejercicio: Altitud del terreno


> source(altitud.r)
> attach(altitud)
> plot(x,y,type=n)
> text(x,y,alt)
> scatterplot3d(x,y,alt)
> detach(altitud)
> alt.geo<-as.geodata(altitud)
> plot(alt.geo)

10

S-ar putea să vă placă și