Primer elemento de un grupo dentro de un dataframe de R

Hoy he encontrado una solución decente a un problema que venía arrastrando desde hace un tiempo en R. Tengo una tabla muy grande (decenas de millones de registros) con su id. Me interesa quedarme con el subconjunto de la tabla original en que para cada id el valor de una determinada variable es mínimo. Un caso de uso: esa variable adicional mide la distancia de la observación a los centroides de unos clústers. El registro con el menor valor proporciona la asignación del sujeto a su grupo. ...

19 de septiembre de 2014 · Carlos J. Gil Bellosta

Recordatorio: esta tarde participo en el DataBeers de Madrid

Si lees estas líneas y vives en Madrid o sus alrededores, casi seguro que te interesa el DataBeers de esta tarde. Que a sus tradicionales bondades añade en esta ocasión la de que participaré y hablaré durante seis minutos y veinte segundos sobre mascotas y rebaños de modelos. ¿Nos veremos?

18 de septiembre de 2014 · Carlos J. Gil Bellosta

Una transformación (y segmentación) novedosa de variables (lognormaloides)

– La variable gasto tiene una distribución muy fea que tiene un impacto en el modelo. He optado por transformarla. – ¿Qué has hecho? – Bueno, verás: no es lo mismo que alguien gaste menos de un euro o que gaste más de cien. A los que gastan entre cero y uno les he dado el valor 0. – Vale. – Entonces, a los que gastan, digamos, entre 1 y 10, 1; luego, a los que gastan entre 10 y 100, 2. Porque no es lo mismo gastar 9 que 90, ¿no? – Claro. – Y así sucesivamente… a los que gastan entre 100 y 1000 euros, les he puesto un 3… – Para, para, para… ¡has tomado el logaritmo! – Eh, bueno, en realidad… log10(x+1)… ...

17 de septiembre de 2014 · Carlos J. Gil Bellosta

R en Nada Es Gratis

Jesús Fernández Villaverde escribió en Nada es Gratis sobre R el otro día. Publicó cuatro vídeos: Una entrevista a Hadley Wickham La conferencia plenaria de John Chambers en la useR! 2014 Una entrevista a Yihui Xie, el creador de knitr La conferencia plenaria de Martin Mächler en la useR! 2014, Good Practices in R Programming Todos muy interesantes. Pero todavía lo es más que desde unas páginas del impacto de Nada es Gratis tengan a bien contribuir al conocimiento (¡y al uso!) de R.

16 de septiembre de 2014 · Carlos J. Gil Bellosta

Componentes conexas (de grafos) en Spark

Uno de mis últimos pet projects tiene que ver con el análisis de las componentes conexas de unos grafos muy grandes. Como aquí pero con datos de un tamaño muchos órdenes de magnitud mayores. Usando Spark, claro. Y ya que lo cito, aprovecho la ocasión para regalar un consejo a mis lectores más jóvenes: no esperéis a los cuarenta para aprender Scala y Spark. Voy a limitarme a copiar el código para referencia mía y de otros. Creo que se autoexplica: ...

15 de septiembre de 2014 · Carlos J. Gil Bellosta

Bajo el capó del particionamiento recursivo basado en modelos

Una de las mayores contrariedades de estar sentado cerca de alguien que es más matemático que un servidor (de Vds., no de silicio) es que oye siempre preguntar por qué. Una letanía de preguntas me condujo a leer papelotes que ahora resumo. Primero, unos datos: set.seed(1234) n <- 100 x1 <- rnorm(n) x2 <- rnorm(n) x3 <- rnorm(n) y <- 0.3 + 0.2 * x1 + 0.5 * (x2 > 0) + 0.2 * rnorm(n) Luego, un modelo: modelo <- lm(y ~ x1) summary(modelo) # Call: # lm(formula = y ~ x1) # # Residuals: # Min 1Q Median 3Q Max # -0.9403 -0.2621 0.0420 0.2299 0.6877 # # Coefficients: # Estimate Std. Error t value Pr(>|t|) # (Intercept) 0.55632 0.03364 16.538 < 2e-16 *** # x1 0.21876 0.03325 6.579 2.34e-09 *** # --- # Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 # # Residual standard error: 0.3323 on 98 degrees of freedom # Multiple R-squared: 0.3063, Adjusted R-squared: 0.2992 # F-statistic: 43.28 on 1 and 98 DF, p-value: 2.341e-09 Pocos que no entiendan cómo se han generado los datos advertirían lo malo de su especificación: hemos omitido una variable explicativa cuyo efecto ha ido a incrementar el error de manera que los tests habituales de bondad de ajuste no advierten. ...

12 de septiembre de 2014 · Carlos J. Gil Bellosta

Missing

Dos motivos me han tenido missing estas últimas semanas. Uno es una estancia en la Universidad de Santa Catalina del Burgo de Osma. Oportunamente ubicada en las estribaciones de la muy generosa en caldos de calidad Ribera del Duero, ha sido reconvertida a la sazón en un hotel propicio para la evasión y la agrafía. El segundo es que en horas intempestivas he estado purgando de missings unas matrices enormes y de la, se conoce, mayor trascendencia. Es un asunto delicado, jamás bien resuelto, para el que el paquete [VIM](http://cran.r-project.org/web/packages/VIM/index.html) puede proporcionar ayuda. Sobre todo en los aspectos gráficos. ...

11 de septiembre de 2014 · Carlos J. Gil Bellosta

Modelos, mascotas y rebaños en el DataBeers de Madrid

El próximo día 18 de septiembre hablaré de modelos, mascotas y rebaños en el DataBeers de Madrid. Los detalles (incluido el enlace para registrarse) están disponibles aquí. Haréis mal en faltar porque, con la excepción de un servidor, el resto del cartel es de primera: Pedro Concejero: Decide Fran Castillo: Big data needs artist explorers Carlos Herrera: La Geografía de las Redes Sociales Urbanas

10 de septiembre de 2014 · Carlos J. Gil Bellosta

Factorización de enteros con grid

Vi esto y me dije: yo también quiero. Así que dicho y hecho: Por si acaso, cada diagrama representa la descomposición en números primos de un número del 1 al 100. El código (que no he adecentado lo que suelo) es un pequeño ejercicio con el paquete grid y unos elementos de recursividad (como en Grid, Scala y arbolitos fractales): library(grid) library(gmp) plot.factors <- function(n, new.plot = TRUE){ if(new.plot) grid.newpage() divisors <- sort(as.integer(factorize(n)), decreasing = T) foo <- function(divs){ if(length(divs) == 0){ grid.circle(x = 0.5, y = 0.5, r = 0.5, gp=gpar(fill="black")) return() } n <- divs[1] x <- (Re(exp( 2 * pi *(1:n) * 1i /n))) / 4 + 0.5 y <- (Im(exp( 2 * pi *(1:n) * 1i /n))) / 4 + 0.5 for(i in 1:n){ tmp <- viewport(x = x[i], y = y[i], w = 2/(3 + n), h = 2/(3 + n)) pushViewport(tmp) #grid.rect(gp = gpar(col = "grey")) foo(divs[-1]) popViewport() } } foo(divisors) } plot.factors(25) grid.newpage() nrow <- 10 ncol <- 10 for(y in 1:nrow){ for(x in 1:ncol){ tmp <- viewport(x = x / (1 + ncol), y = 1 - y / (1 + nrow), w = 1/(1 + ncol), h = 1/(1+ncol)) pushViewport(tmp) #grid.rect(gp = gpar(col = "grey")) plot.factors(x + y * ncol - ncol, new.plot = FALSE) popViewport() } }

9 de septiembre de 2014 · Carlos J. Gil Bellosta

Tres citas para los amantes del análisis de datos públicos

En estos días van a celebrarse tres eventos (de los que tengo noticia) relacionados con el análisis de datos. El primero es la Segunda Edición del Taller de Periodismo de Datos, en Madrid. Extraigo de su convocatoria lo siguiente: Durante dos fines de semana largos (octubre 24-26 y diciembre 12-14) desarrollaremos proyectos para seguir la traza del dinero público con la ayuda de expertos tales como Ben Welsh (Los Angeles Times), Mariano Zafra (El País), Juan Elosúa (España en Llamas) y el equipo de periodismo de datos de El Confidencial. ...

8 de septiembre de 2014 · Carlos J. Gil Bellosta