Mi Blog

Cargar datos en R

… y ajustar un modelo GLM

Introducción

Este post quiere ser un pequeño acordeon (chuleta) de ciertas funciones y paquetes en R para hacer análisis espaciales.
Si, he aceptado que hay un montón de cosas que valen la pena en R y este es mi intento de volverme a acercar a ese lenguaje que sigo considerado obscuro y sucio. Sin embargo, a la comunidad de estadística le gusta. Supongo que por razones históricas y la típica ley de potencia de Winners take all… Yo

Supuestos

  • Datos extraidos de Biospytial y guardados en CSV en el backend de Redis.
    • > (Actualizado. el objeto en redis es un pickle de un DataFrame de Pandas. No he encontrado forma trivial de portar estos objetos en R. Se utiliza entonces un formato CSV (estandar) guardado con antelación)
  • Command-line. No hay interfáz gráfica

Preparación

  • Seleccionar un repositorio CRAN (alguno de los dos)
    chooseCRANmirror(graphics=FALSE)
    options(repos='http://cran.rstudio.com/')
  • Cargar driver de Redis
    • library('rredis')
  • Conectar a BD redis
  • redisConnect(host='redis',password='biospytial.')
     
  • Read data from CSV
    TDF = read.csv("/outputs/training_data_sample_puebla_p2_abies_pinophyta.csv")
    PDF = read.csv('/outputs/presence_only_models/predictors/dataset100x100-puebla-p2/0-pred.csv')
     

Definir el modelo

$$ Y(x) = Dist.Road + Pop.denst + vegtype$$ Se procederá a ajustar un modelo GLM con supuestos de independencia en los residuales (i.e. estandard GLM). formula = ‘Pinophyta ~ Dist.to.road_m + Population_m + tipos’ mod_sig = glm(formula, data=TDF, family=binomial()) summary(mod_sig) confint(mod_sig)    

	

Visualizar correlaciones en Python

En este post veremos como graficar correlaciones de una matrix de diseño multidimensional usando un correlograma con Python, Pandas y Seaborn.

Seaborn es una biblioteca para visualizar datos. Posee similares características a R.

Calcular correlaciones

Para hacer esto basta con utilizar el método ‘pandas.DataFrame.corrs()’. El método regresa un dataframe de salida. Esta estructura será utilizada por la funcion ‘heatmap’ de Seaborn.

Código:

Supongamos que tenemos un Pandas DataFrame llamado TDF.

Nota de actualización: Por alguna razón se perdió la imagen original. La estoy sustituyendo por otro correlograma. Este sin embargo no proviene de una “Matríz de diseño” si no de un modelo condicional de autocorrelación espacial. Aquí simplemente convertí la matriz generada por MCMC  que representa regiones geográficas como columnas y muestras (iteraciones) como renglones. El patrón es muy hermoso, da una apariencia textil, aunque no esta relacionado a esto en absoluto pues solo muestra la correlación entre regiones geográficas de un modelo CAR.

El código para desarrollar esto fue hecho en STAN y tengo pensado subirlo pronto. Por lo pronto, aquí les dejo la imágen y el código para visualizarlo.

import seaborn as sb
## El objecto cadenaMCMC fue generado por STAN (extract) 
phidf = pd.DataFrame(cadenaMCMC['phi'])
correlaciones = phidf.corr()
sb.heatmap(correlaciones)

Cómo graficar geometrías de Django (Biospytial)

Hola!

Biospytial utiliza el backend de Django-postgis para representar objetos y geometrías. Por eso es común encontrar objetos del tipo “django.contrib.gis.geos” [Point, Polygon] para poder usar operaciones geométricas.

Hay algunas incompatibilidades con Shapely y en general para plotear directamente usando matplotlib.

Para poder obtener una gráfica de algún objeto geométrico, deberemos utilizar ‘GeoPandas’  y ‘Shapefile’ como intermediario.

Simplemente cargamos las librerias:

from geopandas import GeoSeries
from shapely.wkt import loads

Después simplemente instanciamos un objeto GeoSeries (GeoDataSet) y cargamos el objeto geos.Polygon utilizando el método de representación en WKT.

Revisa el siguiente código para entender

from django.contrib.gis.geos import Point, Polygon
xcoord = -99.76
ycoord = 17.55
p = Point(xcoord,ycoord,srid=4326)
newp = p.buffer(0.08)

from geopandas import GeoSeries
from shapely.wkt import loads

gs = GeoSeries([loads(newp.wkt)])
gs.crs = {'init' : 'epsg:4326'}
gs.plot()

 

 

 

Insertar y quitar comentarios con VIM

Llevo poco tiempo usando NeoVim y me está gustando mucho.

Aquí les describo una manera rápida de seleccionar un bloque de texto y comentarlo.

Vamos a suponer que tenemos el siguiente código en Python y  queremos comentar algunas líneas dentro del ambiente de Model().

with Model() as model: # model specifications in PyMC3 are wrapped in a with-statement
    # Define priors
    sigma = HalfCauchy('sigma', beta=10, testval=1.)
    intercept = Normal('Intercept', 0, sd=20)
    x_coeff = Normal('x', 0, sd=20)

    # Define likelihood
    likelihood = Normal('y', mu=intercept + x_coeff * x,
                        sd=sigma, observed=y)

    # Inference!
    trace = sample(3000, cores=2) # draw 3000 posterior samples

Para comentar en bloque hay que hacer lo siguiente:

  • Teclear [ Ctrl ] + V  — Esto activará el modo “Visual en Bloque”.
  • Movemos el cursor con las flechas o ( teclas JKLH ) para seleccionar todo el bloque que queramos comentar.
  • Si queremos insertar un comentario deberemos cambiar al modo de insertar presionando: [ Shift ] + i (I may’uscula)
  • Si queremos quitar el comentario presionar la tecla [x] (correspondiente a borrar un caracter)
  • Insertamos el símbolo de comentario (e.g. #) . Esto modificará sólo la primera línea.
  • Salir del modo de inserción por bloque con la tecla [ ESC ]

Vim insertará este caracter en todo el bloque seleccionado.

with Model() as model: # model specifications in PyMC3 are wrapped in a with-statement
    # Define priors
#    sigma = HalfCauchy('sigma', beta=10, testval=1.)
#    intercept = Normal('Intercept', 0, sd=20)
#    x_coeff = Normal('x', 0, sd=20)

#    # Define likelihood
#    likelihood = Normal('y', mu=intercept + x_coeff * x,
                        sd=sigma, observed=y)

    # Inference!
    trace = sample(3000, cores=2) # draw 3000 posterior samples

 

 

 

 

Lista de Datos para Modelar Distribuciones de Especies

Lista de datos ambientales para modelar distribución de especies

Usando la clasificación propuesta en MNE2018

Basadas en interpolación

Basadas en modelos de circulación (Atmosphere-Ocean General Circulation Models)

  • Climatologies at high resolution for the earth’s land surface areas

Karger, D.N., Conrad, O., Böhner, J., Kawohl, T., Kreft, H., Soria-Auza, R.W., Zimmermann, N.E., Linder, H.P., Kessler, M., 2017. Climatologies at high resolution for the earth’s land surface areas. Sci. Data 4, 170122. doi:10.1038/sdata.2017.122

** Basadas en IPCC y series de tiempo

  • MERRAclim, a high-resolution global dataset of remotely sensed bioclimatic variables for ecological modelling > C. Vega, G., Pertierra, L.R., Olalla-Tárraga, M.Á., 2017. MERRAclim, a high-resolution global dataset of remotely sensed bioclimatic variables for ecological modelling. Sci. Data 4, 170078. doi:10.1038/sdata.2017.78

Datos oceánicos basados en modelos de circulación marina