Análisis descriptivo y exploratorio de datos geoestadı́sticos en R Estadı́stica espacial 2009 – I En cualquier análisis estadı́stico las primeras herramientas y quizá una de las más útiles son las técnicas descriptivas y exploratorias, ya que ellas permiten formarse una idea del comportamiento del fenómeno estudio y en algunos casos evaluar el cumplimiento de una serie de supuestos sobre los cuales están construidas las técnicas inferenciales. En este sentido, las técnicas exploratorias son múltiples y dependiendo el área de estudio en algunos casos son propias. La siguiente es una guı́a con las funciones disponibles en R para implementar algunas de las herramientas propias del análisis de datos exploratorio espacial que son base para la formulación de modelos de predicción vı́a geoestadı́stica. Para el desarrollo de la actividad es necesario la instalación y el cargué de los siguientes paquetes: require(akima) require(gstat) require(geoR) require(sgeostat) require(lattice) Los datos empleados para el desarrollo de la guı́a se llaman coal ash y se encuentran adjuntos en formato de archivo plano. El análisis se dividirá en dos partes, la primera permite identicar el comportamiento general de la variable en el espacio a través de diagramas de datos situados, gráficos de contornos, mapas de sı́mbolos entre otros. La segunda parte consiste en identificar problemas en los datos observados que puedan afectar el modelamiento de la estructura de dependencia espacial, en particular, problemas en la estimación del variograma experimental y en la hipótesis de estacionariedad del proceso. Actividad inicial 1. Realice la lectura del conjunto de datos por medio de la función recuerde que puede usar la función read.table o en el menu Datos de la interface del paquete Rcmdr . 2. Realice una exploración de la variable coal (ceniza de carbón), es decir, genere informes con medidas resumen, histogramas, diagramas de caja y gráficos de probabilidad normal. Para ello se encuentran en R las funciones summary(coal.ash$coal) hist(coal.ash$coal) boxplot(coal.ash$coal) qqnorm(coal.ash$coal) qqline(coal.ash$coal) #Tambien puede usar la función qq.plot si se tiene #cargado el paquete Rcmdr qq.plot(coal.ash$coal) 3. Concluya respecto del comportamiento univariado de variable. El promedio es un buen indicador resumen de la ceniza de carbón? Hay datos atı́picos? La variable es asimétrica? Qué puede decir del supuesto de normalidad? Como se puede observar el análisis realizado hasta el momento no tiene en cuenta la naturaleza espacial del fenómeno, es decir, si el promedio es igual para toda el área de estudio o si por el contrario cambia en algunas zonas o sitios particulares, lo cual puede explicar posibles comportamientos asimétricos, de otra parte, si hay datos atı́picos estos se pueden encontrar distribuidos en toda la zona o por el contrario focalizados en algunas regiones. Es por esto, que dentro del análisis descriptivo es necesario construir gráficos resumen que nos muestren como se comporta la variable en la zona. Segunda Actividad Los primeros gráficos en ser construidos permiten conocer como fueron tomadas las mediciones en el espacio y que valores asumen, entre estas herramientas se cuentan con gráficos de datos situados (data posting), mapas de sı́mbolos, mapas indicadores, etc. Las instrucciones necesarias para generar este tipo de gráficos se muestran acontinuación 1. Data posting. par(mfrow=c(2,2)) plot(coal.ash$x,coal.ash$y) plot(coal.ash$x,coal.ash$y,type="n") text(coal.ash$x,coal.ash$y,labels=coal.ash$coal,cex=.4) Según los resultados obtenidos, hay alguna lozalización extraña? los datos parecen tener alguna tendencia? hay zonas que presenten poco muestreo? 2. Mapas de sı́mbolos. grupos=cut(coal.ash$coal,breaks=c(min(coal.ash$coal),8.3,9.2,9.8,10.7,max(coal.ash$coal)), plot(coal.ash$x,coal.ash$y,type="n") text(coal.ash$x,coal.ash$y,labels=grupos,cex=.5) grupos1=ifelse(coal.ash$coal>=min(coal.ash$coal)&coal.ash$coal<=8.3,1, ifelse(coal.ash$coal> 8.3 &coal.ash$coal<=9.2,2, ifelse(coal.ash$coal> 9.2 &coal.ash$coal<=9.8,3, ifelse(coal.ash$coal> 9.8 &coal.ash$coal<=10.7,4, ifelse(coal.ash$coal> 10.7 &coal.ash$coal<=max(coal.ash$coal) ,5,coal.ash$coal))))) coal.mat=tapply(grupos1,list(factor(coal.ash$x),factor(coal.ash$y)),function(x)x) for(i in 1:dim(coal.mat)[1]){ fil=coal.mat[i,] fil=fil[!is.na(fil)] for(j in 1:dim(coal.mat)[2]){ col=coal.mat[,j] col=col[!is.na(col)] if(is.na(coal.mat[i,j])) coal.mat[i,j]=median(c(col,fil)) } } zmin=min(coal.mat) zmax=max(coal.mat) image(coal.mat,zlim=c(zmin,zmax)) Cúál de los gráficos considera usted presenta mejor los datos?, Qué puede decir del comportamiento de la variable al repecto de posibles tendencias en alguna dirección particular? Pruebe generando ahora 4 clases en la cual hayan el 25 % de los datos en cada una de ellas. 3. Mapas de indicadores. Al ser una sucesión de mapas de sı́mbolos, la generación de ellos se realiza modificando las instrucciones anteriores. z1=ifelse(coal.ash$coal<=8.3,1,0) z2=ifelse(coal.ash$coal<=9.2,1,0) z3=ifelse(coal.ash$coal<=9.8,1,0) z4=ifelse(coal.ash$coal<=10.7,1,0) #Vistos en numeros par(mfrow=c(2,2)) plot(coal.ash$x,coal.ash$y,type="n",main="coal<=8.3") text(coal.ash$x,coal.ash$y,labels=z1,cex=.5) plot(coal.ash$x,coal.ash$y,type="n",main="coal<=9.2") text(coal.ash$x,coal.ash$y,labels=z2,cex=.5) plot(coal.ash$x,coal.ash$y,type="n",main="coal<=9.8") text(coal.ash$x,coal.ash$y,labels=z3,cex=.5) plot(coal.ash$x,coal.ash$y,type="n",main="coal<=10.7") text(coal.ash$x,coal.ash$y,labels=z4,cex=.5) #Vistos en colores x11() par(mfrow=c(2,2)) coal.mat=tapply(z1,list(factor(coal.ash$x),factor(coal.ash$y)),function(x)x) for(i in 1:dim(coal.mat)[1]){ fil=coal.mat[i,] fil=fil[!is.na(fil)] for(j in 1:dim(coal.mat)[2]){ col=coal.mat[,j] col=col[!is.na(col)] if(is.na(coal.mat[i,j])) coal.mat[i,j]=median(c(col,fil)) } } zmin=min(coal.mat) zmax=max(coal.mat) image(coal.mat,zlim=c(zmin,zmax),main="coal<=8.3",col=gray(0:1)) coal.mat=tapply(z2,list(factor(coal.ash$x),factor(coal.ash$y)),function(x)x) for(i in 1:dim(coal.mat)[1]){ fil=coal.mat[i,] fil=fil[!is.na(fil)] for(j in 1:dim(coal.mat)[2]){ col=coal.mat[,j] col=col[!is.na(col)] if(is.na(coal.mat[i,j])) coal.mat[i,j]=median(c(col,fil)) } } zmin=min(coal.mat) zmax=max(coal.mat) image(coal.mat,zlim=c(zmin,zmax),main="coal<=9.2",col=gray(0:1)) coal.mat=tapply(z3,list(factor(coal.ash$x),factor(coal.ash$y)),function(x)x) for(i in 1:dim(coal.mat)[1]){ fil=coal.mat[i,] fil=fil[!is.na(fil)] for(j in 1:dim(coal.mat)[2]){ col=coal.mat[,j] col=col[!is.na(col)] if(is.na(coal.mat[i,j])) coal.mat[i,j]=median(c(col,fil)) } } zmin=min(coal.mat) zmax=max(coal.mat) image(coal.mat,zlim=c(zmin,zmax),main="coal<=9.8",col=gray(0:1)) coal.mat=tapply(z4,list(factor(coal.ash$x),factor(coal.ash$y)),function(x)x) for(i in 1:dim(coal.mat)[1]){ fil=coal.mat[i,] fil=fil[!is.na(fil)] for(j in 1:dim(coal.mat)[2]){ col=coal.mat[,j] col=col[!is.na(col)] if(is.na(coal.mat[i,j])) coal.mat[i,j]=median(c(col,fil)) } } zmin=min(coal.mat) zmax=max(coal.mat) image(coal.mat,zlim=c(zmin,zmax),main="coal<=10.7",col=gray(0:1)) Cuál de las presentaciones considera es más ilustrativa? hay alguna dirección de variación de los datos de ceniza de carbón? Genere los mapas indicadores, dejando en cada mapa el 25 % de la información. 4. Mapas de contornos. La idea de esta parte más que generar una interpolación bastante exacta, es conocer el comportamiento de forma global del fenómeno. Para ello se usará el paquete akima. int.coal=interp(x=coal.ash$x,y=coal.ash$y,z=coal.ash$coal) contour(int.coal) points(coal.ash$x,coal.ash$y) Cómo puede calificar el comportamiento de la variable? Explore las ayudas de la función interp del paquete akima y utilice otro tipo de interpolación. 5. Resúmenes por filas o columnas. Cuando el conjunto de datos es grillado, es posible graficar el comportamiento de las medidas de tendencia central por filas y/o columnas de tal manera que se pueda identificar si hay cambios en la tendencia. par(mfrow=c(2,2)) plot(coal.ash$x,coal.ash$y,axes=F,xlab="",ylab="") plot(tapply(coal.ash$coal,coal.ash$y,median),1:23,xlab="% coal ash",ylab="Rows",xlim=c(8,1 points(tapply(coal.ash$coal,coal.ash$y,mean),1:23,pch="x") plot(1:16,tapply(coal.ash$coal,coal.ash$x,median),xlab="% coal ash",ylab="Columns",ylim=c( points(1:16,tapply(coal.ash$coal,coal.ash$x,mean),pch="x") plot(coal.ash$x,coal.ash$y,axes=F,type="n",xlab="",ylab="") text(1,22,"◦ = Median %coal ash", adj=0) text(1,19,"x = Mean %coal ash", adj=0) Se puede afirmar que la media del proceso es la misma en toda el área de estudio? Costruya los estadı́sticos de la prueba de hipótesis de la media y la mediana por filas y concluya. 6. Dispersogramas rezagados. La primera forma de explorar la autocorrelación y los datos atı́picos espaciales es generando los dispersogramas rezagados. En el caso de datos grillados algunos de ellos se pueden obtener ası́: x11() par(mfrow=c(1,2)) grid.mat=tapply(coal.ash$coal,list(factor(coal.ash$x),factor(coal.ash$y)),function(x)x) plot(grid.mat[,-1],grid.mat[,-23],xlab="coal ash% in column Z",ylab="coal ash% in column Z identify(grid.mat[,-1],grid.mat[,-23],label=grid.mat[,-1]) plot(grid.mat[-1,],grid.mat[-16,],xlab="coal ash% in row Z",ylab="coal ash% in row Z+1") identify(grid.mat[-1,],grid.mat[-16,],label=grid.mat[-1,]) Existen observaciones atı́picas? Parece haber autocorrelación espacial en las direcciones y rezagos analizados? Por qué? 7. Suavizamiento de medianas. En el caso de existir un comportamiento no estacionario de forma global se puede considerar trabajar con los residuales del ajuste. La visualización de los resultados se pueden obtener ası́: coal.mat=tapply(coal.ash$coal,list(factor(coal.ash$x),factor(coal.ash$y)),function(x)x) for(i in 1:dim(coal.mat)[1]){ fil=coal.mat[i,] fil=fil[!is.na(fil)] for(j in 1:dim(coal.mat)[2]){ col=coal.mat[,j] col=col[!is.na(col)] if(is.na(coal.mat[i,j])) coal.mat[i,j]=median(c(col,fil)) } } coal.mp=medpolish(coal.mat) coalsig.mat=coal.mat-coal.mp$residuals x11() par(mfrow=c(1,2)) par(pty="s") zmin=min(coal.mat,coalsig.mat) zmax=max(coal.mat,coalsig.mat) image(coal.mat,zlim=c(zmin,zmax),main="Coal ASH") image(coalsig.mat,zlim=c(zmin,zmax),main="Ajustados por suavizamiento de medianas") Estudie los resultados del ajuste, cuál (es) de las filas y columnas tienen efectos mayores? Hay evidencia de tados atı́picos espaciales? Cuáles? Sugiere usted modelar los residuales del ajuste de medianas o los datos originales de ceniza de carbón?