Blogia
bappf

estadística

Salvando los muebles

Tuve un dominio y lo perdí. Lo abandoné porque era más fuente de trabajos que de remuneraciones. Una fête nationale, la del 2002, colgué mi paginita de internet con más expectativas que cálculos. Otra fête nationale, la de dos años después y sin pena ni gloria, los DNS's devolvieron IP's en vano y ahora nada queda de www.consultoresestadisticos.com.

Lo peor de todo es que ahora que rebusco por entre mis ralos bacaps y de ella nada hallo. La copia que de su contenido guardaba queda en su contenedor: un disco duro que ahora se oxida muy lejos. Sólo me queda ver de salvar los pocos muebles que del poco prevenido, por más que anunciado, naufragio hayan perdurado varados en alguna playa recóndita del oceanoso internet.

Curiosamente, buscando "sigma consultores estadísticos" en Google he tropezado con un plagio escandaloso de algunos de mis parrafitos más difíciles de re-componer. Habían sido reeditados, pero conservaban algunas de esas peculiaridades sintácticas y léxicas que comparten los hijos de mi teclado y de los escasos claros de mi guadianizante ingenio. Y, afortunadamente, sumergido en la parte no visible de la página, su mismo código fuente, he encontrado un enlace a esto, una copia enteramente fidedigna —y, hecho curioso, exactísimamente atribuida a su legítimo dueño— al texto original. Más curioso todavía, está alojada en el servidor de una empresa que consideraba competencia y que, además, promueve el uso de un software estadístico que yo desaconsejaba más o menos explícitamente.

En fin, que lo que en mi día escribí es como sigue:

Análisis Comparativo de Paquetes Estadísticos

Muchas de las consultas que recibimos en Sigma Consultores Estadísticos se refieren a recomendaciones acerca de la idoneidad de uno u otro paquete estadístico para un usuario, aplicación o proyecto concreto. Por eso nos hemos sentido urgidos a hacer constar públicamente nuestra opinión al respecto.

En cualquier caso, tenemos que dejar claro por adelantado que todo lo que sigue no es sino una opinión particular, por más que cualificada por nuestra amplia experiencia, y desinteresada por nuestra desvinculación respecto a todo distribuidor comercial. Sabedores de que pueda estar en conflicto con muchas, le invitamos a leerla y, de estar en desacuerdo con nosotros, a transmitirnos sus comentarios.

Las variables que es necesario tener en cuenta para comparar adecuadamente unos paquetes estadísticos de otros son, esencialmente, las cinco que se discuten a continuación:

1.- Coste

Esta página no tendría apenas sentido de no existir en el mundo sino software libre: de tener SAS o SPSS en el disco duro quedarían satisfechas el 99.9% de las necesidades del 99% de los usuarios potenciales de los métodos estadísticos y el 90% del 1% restante. Desafortunadamente, el coste de sus licencias está fuera del alcance de la mayor parte de los usuarios y la obtención de copias subrepticias no es posible para muchos ni fácil en absoluto para ninguno.

2.- Nivel de sofisticación del usuario

Idealmente, éste debería ser un entendido en estadística y tener ciertos conocimientos de programación. En la medida que carezca de los segundos, tendrá que renunciar a realizar por su cuenta cierto tipo de análisis que vayan más allá de los más comunes; y en tanto que carezca de los primeros, será más dependiente de aquellos paquetes con un interfaz más informativo.

3.- Tamaño del conjunto de datos

En la mayor parte de los problemas —al menos, en lo que respecta a su número, no a su dificultad ni importancia— esta variable no supone ninguna restricción significativa. De hecho, cualquiera de los paquetes que se examinarán a continuación puede manejar sin mayores problemas conjuntos de datos no excesivamente grandes. Sólo cuando se rebasa cierto umbral es preciso considerar paquetes específicamente diseñados para hacer frente a este tipo de condicionantes.

De todos modos, los ordenadores modernos permiten manipular eficientemente conjuntos de datos cada vez más extensos. Por ejemplo, con un ordenador con 256 MB de RAM que en Agosto del 2002 costó 500 euros hemos podido ubicar simultáneamente en memoria casi 53 millones de números reales de doble precisión. Eso significa que, probablemente, cualquier paquete estadístico podría manipular eficientemente conjuntos de datos con algunos cientos de miles de entradas. Además, cualquier sistema operativo debería ser capaz de reubicar, en caso de necesidad, el exceso de la demanda de memoria en el disco duro; ciertamente, eso ralentizaría significativamente el proceso de manipulación de los datos, pero permitiría salir del paso en alguna situación puntual.

De hecho, el mayor de los conjuntos de datos que hemos analizado en Sigma Consultores Estadísticos consistía en una matriz de dimensión 7128x72, es decir, cosa de medio millón de números que, supuestos de doble precisión, apenas venían a ocupar un 1% de la capacidad teórica máxima del computador.

Los distribuidores de muchos paquetes estadísticos comerciales suelen hacer hincapié en la probada capacidad de sus productos para manipular grandes conjuntos de datos. Desafortunadamente para ellos, el rango de problemas en que estas virtudes son críticas se estrecha aceleradamente: por una parte, las ampliaciones de memoria son cada vez más económicas, elevando hasta niveles muy cómodos el umbral a partir del cual serían necesarios productos más sofisticados; por la otra, para los problemas en que los conjuntos de datos son verdaderamente grandes -bases de datos de corporaciones, información censal, etc.- pueden emplearse herramientas específicas como, por ejemplo, programas escritos en C que interactúen con el gestor de la base de datos.

4.- Grado de intensidad computacional

El incremento en la potencia computacional de los ordenadores permite hoy en día aplicar ciertas técnicas estadísticas impensables hace unos años y ampliar su campo de aplicación a ámbitos inasequibles para las tradicionales. Las técnicas de remuestreo o de validación cruzada, ciertos tests exactos y gran parte de las técnicas bayesianas exigen una enorme capacidad de cálculo.

No todos los paquetes estadísticos están igualmente adaptados para este tipo de problemas. Con muchos de ellos —por ejemplo, Minitab, Stata y gran parte de los paquetes gratuitos— resulta simplemente imposible porque fueron diseñados únicamente para implemementar técnicas tradicionales y carecen de un verdadero lenguaje de programación asociado que resulte eficiente.

Otros sí que cuentan con él. Por ejemplo, SAS permite realizar cierto número de manipulaciones no elementales en su data step, así como construir programas relativamente complejos usando su sistema de macros y gran número de operaciones matriciales, un poco al estilo de MatLab, usando las rutinas de su extensión IML. Además, es relativamente veloz en comparación con otros lenguajes de programación no compilados. Sin embargo, adolece de ciertas desventajas que dificultan su aplicación eficiente a cierto tipo de problemas y que tiene que ver con su misma estructura, un tanto desfasada. Así, SAS realiza la mayor parte de los cálculos estadísticos por medio de los llamados procedimientos, verdaderos programas independientes con un interfaz relativamente rígido. Los programas en que uno quiere acceder repetidamente —digamos, unas cuantas decenas de miles de veces— a uno sólo de los campos que calcula cualquiera de tales procedimientos puede convertirse en una tarea frustrante y extenuante. Las nuevas versiones de SAS incluyen, es cierto, mecanismos que agilizan estas tareas pero, incluso con su concurso, resulta, por ejemplo, que los procedimientos siguen empeñándose en escribir sus resultados en el fichero .log que enseguida se satura. Entonces, aunque se deje a SAS resolviendo automáticamente un problema cuyo cálculo se extienda durante cierto número de horas, todavía hay que estar pendiente de él borrando manualmente el fichero .log cada cinco o diez minutos so pena de que la ejecución del programa se interrumpa.

Sucede así porque SAS no fue concebido originalmente como un lenguaje de programación en sí, sino más bien como un conjunto de programas semi-independientes sobre el cual se ha construido después un lenguaje de macros. Por eso que recientemente le hayan comido terreno en ciertos campos que exigen de gran poder computacional otros paquetes estadísticos más próximos a lo que se entiende por un verdadero lenguaje de programación. Por ejemplo, S, un hermano de C en cuanto a su origen, los laboratorios Bell —muy aficionados a los nombres sucintos—.

S es un lenguaje de programación orientado a objetos, concebido originalmente para ser utilizado en aplicaciones estadísticas, por lo que cuenta, implementados en el mismo lenguaje, con gran número de procedimientos estadísticos y mecanismos para la manipulación de datos y matrices. Existen, sin perjuicio de otras, dos versiones disponibles de él. Una, S-Plus, es comercial e incluye un interfaz bastante completo y una nada desdeñable capacidad gráfica. Su principal contrapartida es el coste de sus licencias. Afortunadamente, existe otra versión gratuita, R, libremente diponible en internet y cuyas virtudes y limitaciones se analizarán sucintamente más adelante.

5.- Ergonomía

Curiosamente, el aspecto que tal vez más encarezca determinados paquetes estadísticos es el ergonómico: la posibilidad de contar con ayudas interactivas o tutoriales, de representar gráficamente datos con un golpe de ratón, de exportar automáticamente los resultados a formato .html o .pdf, etc. Bajo cierto punto de vista, el coste de las licencias es, de hecho, el coste de la impericia o la pereza. A la primera, en mercadotecnia, se la suele denominar productivity; a la segunda, learning curve. Es más productivo y exige menor esfuerzo mental un paquete estadístico en que para imprimir no haya sino que pulsar el icono de la impresora, en que para visualizar unos datos baste con visitar el menú Gráficos o el Importar para leer datos de un fichero con el formato de cierta hoja de cálculo. Este tipo de habilidades son realmente reduntantes si se cuenta con un mínimo de habilidad y no se pretende escatimar un adarme de esfuerzo: utilizando ficheros de texto como intermediarios, se pueden intercambiar datos con cualquier hoja de cálculo o con otros programas que permiten manipular datos o gráficos, gran parte de los cuales son de distribución gratuita.

Por ejemplo, Sigma Consultores Estadísticos se vio una vez necesitada de un mecanismo para representar gráficamente matrices de correlación entre cierto número relativamente grande de variables. Existen programas comerciales bastante costosos que permiten visualizar este tipo de información mediante códigos cromáticos. Ninguna hoja de cálculo incluía gráficos de esta naturaleza, dado que concernía a una aplicación un tanto específica que no tenía cabida en ningún programa genérico. ¿Cuál fue nuestra solución? Utilizando R -programa gratuito- calculamos la matriz de correlación, la exportamos a un fichero de texto y la insertamos en un fichero de extensión .htm, una página de internet, que contenía apenas 20 líneas de código en JavaScript, un lenguaje de programación gratuito incluido en todos los navegadores de internet modernos. Con un coste nulo y un esfuerzo mínimo, muy inferior al de adquirir la licencia del programa comercial, obtuvimos un resultado análogo.

Nuestra Recomendación

A la vista de lo discutido más arriba, nuestra recomendación es simple. A los usuarios que sólo se aproximan circunstancialmente a problemas de tipo estadístico y que sólo buscan soluciones poco sofisticadas y puntuales les invitamos a:

  • Reexaminar las rutinas estadísticas de cualquier hoja de cálculo, incluyendo, tal vez, algunos de los macros de libre distribución que pueden encontrar en internet.
  • Utilizar algún programa de propósito más general, como Mathematica, Maple, MatLab u otros.
  • Usar algún programa gratuito con un interfaz simple como los que pueden encontrarse acá.
  • Tal vez, buscar en internet alguna de las cada vez más numerosas páginas en las que es posible realizar interactivamente y en línea determinadas manipulaciones estadísticas.


Por otra parte, a aquellos usuarios que tengan que realizar análisis estadísticos más complejos y de una forma más regular les recomendamos, como primera opción R, programa gratuito que pueden descargarse acá. Usado en combinación con otro tipo de programas que extienden su capacidad gráfica -hojas de cálculo, procesadores de texto, programas específicos para la representación de datos, JavaScript, etc.- puede realizar con un coste nulo análisis sumamente sofisticados que, incluyen, tal vez, el 99% de los que precisan el 95% de los usuarios. Sólo un número pequeño de ellos echaría en falta alguna de las herramientas adicionales que incluye su versión comercial, S-Plus, o tal vez alguna de las de SAS o SPSS u otros.

De todos modos, incluso en tal caso, hay que tener en cuenta que o bien este tipo de herramientas adicionales —pensamos, por ejemplo, en las herramientas de S-Plus para ondículas (wavelets)— están presentes en otro tipo de paquetes más genéricos -MatLab, por ejemplo- y que sólo en contadísimas ocasiones, en problemas que realmente exigen de un elevadísimo poder computacional, tendría que recurrir a elaborar sus propios programas en un lenguaje genérico como C o C++. Más adelante hay una discusión al respecto.

Finalmente, grandes empresas, institutos estadísticos, centros de estudio y otros grandes usuarios de aplicaciones estadísticas que necesitan manipular grandes bases de datos y coordinar grupos de trabajo encargados específicamente de ellas, aparte de las soluciones antes mencionadas, válidas para tareas más rutinarias, tendrían que sopesar hasta qué punto les es ventajoso adquirir una licencia para usar uno de los grandes paquetes estadísticos, SAS o SPSS en lugar de, simplemente, utilizar su propio código, en C o C++ por ejemplo, para interactuar con los gestores de bases de datos y analizar de esta manera la información que contienen. Esta segunda opción podría resultarles, en los más de los casos, más económica. Además, como se verá en el último de los apartados de esta página, puede ser más barato adquirir determinadas librerías ya disponibles, tanto comercial como gratuitamente, que podrían potencialmente convertir cualquier compilador de C o C++ en un verdadero paquete estadístico de gran poder. Probablemente, además, les resulte más económico conseguir programadores en un lenguaje genérico que en otros específicos.

Comparación entre R y C++

Para manipulaciones estadísticas habituales —regresiones, análisis de la varianza, estadística descriptiva, series temporales, etc.— sobre conjuntos de datos de, por ejemplo, hasta 100 MB, R es tan eficiente como pudiera serlo cualquiera de los paquetes estadísticos comerciales —SAS, SPSS o, por supuesto, siendo básicamente, la misma cosa, S-Plus—. La principal de las limitaciones de R como lenguaje para realizar manipulaciones estadísticas más complejas que incluyen gran número de iteraciones y que van popularizándose dentro de la estadística aplicada conforme se abarata la capacidad de cálculo de los ordenadores, es consecuencia del hecho de ser un lenguaje interpretado y no compilado. De todos modos, el lenguaje incluye mecanismos que permiten sortear hasta cierto punto este tipo de dificultades.

Por ejemplo, para sumar los datos contenidos en una lista de valores puede utilizarse un bucle for o, como alternativa, el comando sum, que invoca una rutina precompilada; no obstante, la primera opción puede resultar del orden de 100 veces más lenta. Como consecuencia, programar R eficientemente en ciertas aplicaciones en que es necesario iterar determinados cálculos puede implicar recurrir a determinados trucos que serían tachados de malas prácticas de programación por los ortodoxos. Bajo este punto de vista sería preferible escribir programas en un lenguaje que permitiese compilar el código.

Bajo otro punto de vista, programar en C o C++ puede resultar ineficiente en el sentido de que determinadas operaciones, como el producto de matrices, la obtención de sus valores propios o el cálculo de los parámetros de una regresión, están implementados en R y se resumen en una sola línea de código, mientras que en C o C++ exigirían, posiblemente, varias decenas de ellas.

Existen tres alternativas para sacudirse esta disyuntiva:

  • Esperar a que surja un compilador de S -o R, o S-Plus-, cosa cuya dificultad técnica no nos atrevemos a pronosticar y que es probable que no ocurra jamás.
  • Explotar el interfaz de S -o R, o S-Plus, de nuevo- con rutinas externas escritas en otros lenguajes, cosa que conlleva ciertas dificultades debido a su complejidad y que implica un grado de sofisticación por parte del usuario que no es legítimo exigirle en todos casos.
  • Utilizar librerías que permitiesen utilizar cualquier compilador de C++, por ejemplo, en un verdadero paquete estadístico.


La tercera opción es, probablemente, la más factible a medio plazo y son numerosos los estadísticos que la contemplan, a la par que subrayan la complejidad de poder llevar a cabo un programa de tal tipo. Lo ideal sería poder contar con librerías en C++, por ejemplo, que simulasen los comandos estadísticos específicos de R o SAS y clases que permitiesen operar con matrices y otras estructuras de datos con la misma soltura que en MatLab, R o SAS-IML. Ya existen algunos intentos, parciales por el momento, para desarrollar dicho proyecto. Lamentablemente, el más avanzado, que sepamos, está patrocinado por una empresa comercial a la que no creemos dispuesta distribuir el código en un régimen abierto. Existen otros ensayos parciales por parte de programadores independientes alguno de los cuales querríamos ver fructificar pronto y que abriría la puerta a la democratización casi absoluta de los recursos computacionales en este área.

Al hilo de la discusión anterior, y como colofón, queríamos hacer constar el interés que tenemos en Sigma Consultores Estadísticos en aportar, como proyecto a medio plazo, nuestra colaboración en este sentido creando nuestras propias librerías en C++ estándar bajo una licencia de código abierto, libre distribución, etc. Para informarse acerca de la evolución del proyecto, sugerencias e, incluso, colaboraciones, invitamos a nuestros lectores a escribirnos.