R

Paquetes estadísticos: una anécdota sin moraleja

Un banco que gana mucho dinero quiso gastarse un nada desdeñable pellizco de sus ingresos contratando a unos consultores muy resabidos de un país extranjero donde, es fama, todos saben mucho. El resultado fue una documentación ininteligible y un larguísimo programa en VB sin apenas comentarios que se demoraba horas en realizar una simulación trivial.

El banco, cansado de quemar ciclos de CPU en vano, encargó a una consultora local la reimplementación del algoritmo en un afamado paquete estadístico. A falta de documentación, la reimplementación hubo de hacerse tratando de adivinar qué demonios hacía el código original. Prácticamente, fue un proceso de ingeniería inversa.

El paquete multicore de R

R

Tengo acceso a una máquina que, aunque anda un poco corta de memoria, cuenta con ocho CPUs. Tenía unas simulaciones bastante pesadas que correr y quise aprovechar su naturaleza perfectamente paralelizable. Y, de paso, hacer con R lo mismo por lo que he visto a un consultor de SAS cobrar a razón de 3.000 dólares diarios.

En el fondo, es una trivialidad. Supongamos que la función que implementa la simulación se llama foo. Habitualmente, haríamos

Anuncio de la integración de Rapidminer y R

RapidMiner es, posiblemente, la plataforma de minería de datos libre que mejor reputación goza. Hasta la publicación de la versión 5 le veía un pequeño problema: tenía una interfaz bastante poco intuitiva.

Hasta hace pocos días le veía otro: no podía extenderse —al menos de una manera obvia— programando en Java o, preferiblemente, R. Sin embargo, el módulo de integración de R con Rapidminer ya está listo y su lanzamiento va a ser el plato fuerte de RCOMM 2010, la conferencia de usuarios de Rapidminer (oficialmente, RapidMiner Community Meeting And Conference).

La función ifelse "a la SAS"

R

Una función muy útil de R es ifelse:

val <- 0
var <- ifelse( val == 1, "uno", "cero" )
print( var )

Un programador en SAS haría algo así como

%macro test(val);
    %if &val=1 %then %let var=one;
    %else %let var=zero;
    %put &var;
%mend;

%test(0);

SAS, sin embargo, recomienda hacerlo así:

%let val=0;
%let var=%sysfunc(ifc(&val=1,one,zero));
%put &var;

Una línea, sí, pero una línea muy críptica. ¡Aunque para gustos están los colores!

Sobre la cuota de mercado mundial de las herramientas analíticas de negocio

R

Hace poco, IDC —una empresa que hace estudios de mercado a nivel global de distintas herramientas de sofware y hardware — hizo público su informe periódico Worldwide Business Intelligence Tools 2009 Vendor Shares. En su página 8, la más jugosa del informe, aparece la tabla que reproduzco a continuación:

Puede apreciarse cómo en el segmento de la minería de datos (que viene a ser a lo que se refieren con lo de advanced analytics) es SAS el claro dominador con IBM/SPSS en una débil segunda posición.

R en Yotube y Facebook

R

Bebilda, que no sé quién es (misterio que me he propuesto resolver pronto) ha arrancado dos proyectos bastante interesantes:

Los tutoriales están francamente bien y los hay sobre temas diversos como análisis ANOVA, el test de Student, estadística descriptiva, creación de histogramas y otros asuntos de estadística básica.

¡A disfrutar! (Y publicitar, claro).

Una tarea para mis lectores

R

Ayer me dieron los resultados de unos análisis de sangre y, contra todo pronóstico, la médica me dijo que tengo el colesterol bajo control. ¡Con razón —me dije—, si en el blog lo hago yo todo! Así que para mejorar la circulación sanguínea de mis lectores, esta entrada es un ejercicio para quienes me leen. Espero pues que, a pesar de lo vacacional de las fechas, tengan tiempo de completar lo que queda sin hacer y lo hagan constar —antes de que pase lista— en un comentario explicando sus averiguaciones.

Un ilustrador problema de compatibilidad de licencias libres

R

This whole thing is such a nuisance. It seems one can’t even give something away these days!

Así de infeliz se mostraba G. Grothendieck hace unos días. Y es que habíamos enviado una primera versión del paquete rJython que subir a CRAN y nos encontramos con problemas de licencias.

Eso de las licencias de software es un tema enojoso. Importante, pero enojoso.

Además, da la impresión, que totalmente exótico a la ética y costumbres de este país desde el que escribo: algún día, como divertimento, contaré alguna historieta. Y cuando haya vencido la fecha de prescripción, la más divertida, la más ilustradora del fenómeno, la sin par: la del código con copyright de EverisWaterhouseCoopers.

Un curioso bug de R

R

A vueltas con los bugs, el otro día leí sobre uno bastante curioso de R. En resumen:

> a <- c(1,2, sqrt( 2) ^ 2 )
> table(a)
a
1 2
1 2
> unique(a)
[1] 1 2 2

¿El motivo? La función unique compara el valor numérico de los valores del vector de manera que le afectan los errores de redondeo. Sin embargo, la función table compara los valores de acuerdo con su representación como cadena de caracteres.

> 2 - sqrt(2) ^ 2
[1] -4.4409e-16
> as.character(c(2, sqrt(2)^2))
[1] "2" "2"

Los entusiastas de R pueden comprobar todo lo anterior examinando (¡que es una buena costumbre!) el código de ambas funciones.

rJython: un nuevo paquete para llamar a Python desde R

R

Ya está disponible el paquete rJython que permite llamar a Python desde R. Aunque todavía no se ha subido a CRAN, puede instalarse así:

install.packages("rJython", repos="http://R-Forge.R-project.org")

Una vez instalado puede probarse el paquete ejecutando, por ejemplo,

rJython <- rJython()
a <- 1:4
jython.assign(rJython, "a", a)
jython.exec(rJython, "b = len( a )")
jython.get(rJython, "b")
rJython$exec("import math")
jython.get(rJython, "math.pi")
jython.call(rJython, "len", 1:3)
b <- 5:8
rJython$exec("def concat(a,b): return a+b")
jython.call(rJython, "concat", a, b)

Arquitectura: Jython y rJava

El paquete no está basado en el habitual Cpython sino en Jython, un intérprete de Python desarrollado en Java. El motivo es doble: