[ GIT ] Inconsistencias en archivos remotos y locales

Cuando utilizamos git pull origin master internamente se ejecutan dos comandos: `git fetch` y git merge.

El primer comando git fetch origin master descarga el contenido de la rama (branch) master del repositorio origin Mientras, el comando git merge junta los archivos descargados con la rama master local. Es muy frequente que tengamos algunos archivos differentes a los del repositorio remoto y a la hora de hacer el mergese presenten inconsistencias entre el repositorio remoto y el local.

La forma más común de corregir esto es editando el archivo con problemas (usar git statussobre la raíz del repositorio) y seleccionar la versión que necesitemos, es decir, entre la version remota y la local. Git automaticamente añade las dos versiones en el archivo aludido concatenado las líneas de texto difentes entre las dos versiones. Estas diferencias son fácilmente visibles por que git añade adicionalmente las líneas >>>>[hash commit remoto] para las diferencias provenientes del repositorio remoto, y >>>HEAD para la version local. Ambas versiones están separadas por los símbolos =======. Recuerda, estas modificaciones son automáticamente añadidas en el archivo que presenta el problema.

Una vez que hemos borrado la versión que no queremos proseguimos a salvar el archivo, añadirlo al Stage de git (con git add [archivo problematico]) y luego hacemos un commit (git commit -m "alguna mensaje").

Arreglar inconsitencias en archivos grandes

Algunas veces editar manualmente cada archivo problemático puede ser engorroso o simplemente ya sabemos que alguna versión es mejor que la otra. Por ejemplo la versión local (nuestra versión) puede estar más actualizada o la versión remota (la del ellos) puede ser más estable.

En versiones git > 1.6.1 podemos utilizar la opción --ours (nuestra versión) o --theirs (la de ellos) para seleccionar si queremos mantener la versión local o la versión remota (respectivamente). Esta opción sólo es válida para el comando git checkout [archivo problemático] . De esta manera podemos hacer:

git checkout --ours [archivo problemático]

Para quedarnos con nuestra versión.

git checkout --theirs [archivo problemático]

Para quedarnos con la versión remota.

Regresión logística jerarquizada con STAN

Estoy sorprendido por la capacidad y flexibilidad para expresar modelos estadísticos complejos con STAN. Como sabrán, STAN es un lenguage declarativo de programación probabilístico. Los modelos estadísticos son descritos con una sintaxis sencilla para especificar de una forma muy similar a lo que hacemos en el pizarrón o en papel. STAN está basado en principios bayesianos y utiliza varios métodos para muestrear distribuciones posteriores, entre los más conocidos están Hamiltonian Monte Carlo, Non U Turn y Metrópolis-Hastings (no voy a meterme a detalle en esto ahora, en internet hay montón de referencias al respecto).

En este post veremos como definir un modelo logistico jerárquico. Supongamos que para toda observación binaria \(y_i \in \{0,1\} \) existe un nivel associado \(j_i \in \{1,2,…,J\}\) y un vector de covariables (predictores) \(x_i \in \mathbb{R}^K\). Supondremos pues que las observaciones son realizaciones de un proceso bernoulli independendiente cuando se condiciona con un proceso normal jerarquizado. Esto es:

\([Y | S] \sim Bernoulli(S)\)

Ahora, \(S\) puede ser descrita de la siguiente forma:

\(S_{i,j} = \beta^t_j x_i + \epsilon\)

Y se lee de la siguiente forma. La variable S en la observación i del nivel j es igual a \(\beta^t_j x_{i} + \epsilon \). Es decir, el vector \(\beta\) son los coeficientes associados a la respuesta \(S_{i}\) en el nivel j.

En STAN esto es equivalente al siguiente código:

hierarquical_log_model = u"""
data {
  int<lower=0> N; // num obs. 
  int<lower=0> J; // number of levels
  int<lower=1> K;                // num covariates
  matrix[N, K] x;                // design matrix
  int<lower=1,upper=J> level[N];  // type of level (spec)
  int<lower=0,upper=1> y[N];              // observations, in this case is binary.
  
} 
parameters {
  real mu[K];
  vector[K] beta[J];
  real<lower=0,upper=100> sigma; // same sigma

}

model {
    for (k in 1:K) {
        mu[k] ~ normal(0,100);
        for (j in 1:J)
            beta[j,k] ~ normal(mu[k], sigma);
    }
    for (i in 1:N)
        y[i] ~ bernoulli_logit(x[i] * beta[level[i]]);
  
}"""

Para correr el modelo en Python usando PyStan hacer esto.

varying_intercept_model = pystan.StanModel(model_code=hierarquical_log_model)
multilevel_linear_data = {'N': X.shape[0],
                          'J': 2,
                          'K': X.shape[1],
                          'level': data.codes.values, # niveles
                          'x' : X.values,
                          'y': data.obs.values}
%time fit = varying_intercept_model.sampling(data=multilevel_linear_data, iter=1000,chains=1)
sample = fit.extract(permuted=True)

En este caso mis datos están definidos en un Pandas Dataframe llamado X, separado de las observaciones. Para eso use patsy. La muestra de la distribución posterior estará guardada en el objeto ‘sample’

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)