Se me ha encomendado la tarea de trasladar uno de nuestros modelos estocásticos grandes actuales de SAS a un nuevo idioma. Personalmente, prefiero un lenguaje compilado tradicional, pero el PI quiere que revise R, que nunca he usado. Nuestra motivación para sacar el modelo de SAS es (1) muchas personas no tienen acceso a él porque SAS es costoso, (2) estamos buscando alejarnos de un lenguaje interpretado, y (3) SAS es lento para El tipo de modelo que tenemos.
Para (1), obviamente R satisface la necesidad de que sea libre. Para (2), idealmente, nos gustaría crear un ejecutable, pero R normalmente se usa como un lenguaje de script. Veo que alguien ha lanzado recientemente un compilador R, ¿ha sido bien recibido? ¿Es fácil de usar? Preferimos no obligar al usuario a descargar R ellos mismos. Para (3), nuestro problema con SAS es todo el tiempo dedicado a escribir y leer conjuntos de datos de E / S. Nuestro modelo es computacionalmente intensivo, y a menudo estamos limitados por el tiempo de ejecución. (por ejemplo, no es raro que alguien secuestre las computadoras de las personas durante el fin de semana para realizar ejecuciones). Tenemos un modelo similar construido en Fortran que no tiene el mismo problema porque todo el trabajo se realiza en la memoria. ¿Cómo funciona R? ¿Será lo mismo que SAS, ya que funciona en pasos de datos, leyendo y escribiendo archivos? ¿O puede hacer una manipulación de matriz en la memoria?
Respuestas:
R funciona en la memoria, por lo que sus datos deben caber en la memoria para la mayoría de las funciones.
El paquete compilador, si estoy pensando en lo que está pensando (el paquete compilador de Luke Tierney suministrado con R), no es lo mismo que un lenguaje compilado en el sentido tradicional (C, Fortran). Es un compilador de bytes para R en el sentido del código de bytes de Java ejecutado por Java VM o la compilación de bytes del código LISP de Emacs. No compila el código R en código de máquina, sino que prepara el código R en código de bytes para que pueda usarse de manera más eficiente que el código R sin procesar para ser interpretado.
Tenga en cuenta que si ha formado Fortran bien, probablemente podría tener lo mejor de ambos mundos; R puede llamar a rutinas compiladas de Fortran.
fuente
Lo he usado
SAS
durante 15 años, y he comenzado a usarloR
seriamente en los últimos 6 meses, con algunos ajustes por un par de años antes de eso. Desde una perspectiva de programación,R
las manipulaciones de datos se realizan directamente, no hay equivalentesDATA
niPROC SQL
procedimientos porque no son necesarios (este último es más eficienteSAS
cuando hay mucha manipulación de datos para hacer desde fuentes de datos externas, por ejemplo, datos administrativos). Esto significa que, ahora que me estoy acostumbrando, la manipulación de datos es más rápidaR
y requiere mucho menos código.El principal problema que he encontrado es la memoria. No todos los paquetes R permiten
WEIGHT
especificaciones de tipo, por lo que si tieneSAS
conjuntos de datos con variables utilizadas enFREQ
oREPLICATE
declaraciones, puede tener problemas. He examinado los paquetesff
ybigmemory
en R, pero no parecen ser compatibles con todos los paquetes de R, por lo que si tiene conjuntos de datos muy grandes que requieren análisis que son relativamente poco comunes y se han agregado, es posible que tenga problemas con la memoria.Para la automatización, si lo tiene
SAS macros
, debería poder programar el equivalenteR
y ejecutarlo como lote.Para codificar
R
, estaba usandoNotepad++
y configurando el idiomaR
, y ahora estoy descubriendo las alegrías deR Studio
. Ambos productos son gratuitos y marcan el lenguaje como laSAS
GUI de sintaxis mejorada (solo he usado la pantalla de sintaxisSAS
).Hay un sitio web y un libro relacionado para que las personas cambien de
SAS
aR
. Los encontré útiles para tratar de averiguar cómo traducir algunosSAS
comandosR
.Actualización: una cosa que me volvía loco cuando viene a
R
es queR
no asume todo es un conjunto de datos (data frame
enR
la jerga), porque no es un paquete estadístico de la manera queSAS
,SPSS
,Stata
, etc son. Entonces, por ejemplo, me tomó un tiempo hacer que lasif
declaraciones funcionaran porque seguía recibiendo ayuda para lasif
declaraciones con vectores (o tal vez matrices), mientras que necesitaba unaif
declaración que funcionaradata frames
. Por lo tanto, es probable que las páginas de ayuda se deban leer más detenidamente de lo normal, ya que deberá verificar que el comando que desea ejecutar funcione con el tipo de objeto de datos que tiene.La parte que todavía me vuelve loco al aprender un nuevo
R
comando (por ejemplo, el método de análisis en un paquete contribuido) es que la ayuda para los comandos a menudo no es completamente autónoma. Iré a la página de ayuda para tratar de aprender el comando y las notas de uso que a menudo...
contienen. A veces, tratar de averiguar qué puede o debe ir donde...
está me ha llevado a un círculo recursivo. La relativa brevedad de las notas de ayuda, que provienen deSAS
ejemplos detallados de sintaxis y ejemplos trabajados con una explicación del estudio en el ejemplo, fue un shock bastante grande.fuente
R es un lenguaje de programación. No funciona en pasos de datos. Hace lo que quieras que haga, ya que no es más que un lenguaje de programación, un esclavo de tus deseos, expresado en un lenguaje de llaves y dos puntos.
Piense en ello como Fortran o C, pero con vectorización implícita para que no tenga que recorrer los arreglos, y administración de memoria dinámica para que no tenga que malloc () o declarar tamaños de matriz en cualquier momento.
Principalmente hace todo su trabajo en la memoria, pero si desea leer parte de un archivo, mezclarlo, luego escupe algunos de los resultados y lee el siguiente bit, bueno, continúe y escriba un programa R que hace eso.
Se contradice a sí mismo al decir que el modelo es computacionalmente intenso pero SAS es lento debido a E / S ... Uno u otro seguramente ...
Si ya tiene algo similar en Fortran y dice que quiere alejarse de un idioma interpretado, ¿por qué no hacerlo también en Fortran?
El compilador R puede causar algunas aceleraciones, pero si su código R está bien escrito de todos modos, no obtendrá nada demasiado masivo, no como escribirlo en C o Fortran.
fuente
Entiendo que, de forma predeterminada, SAS puede trabajar con modelos que son más grandes que la memoria, pero este no es el caso con R, a menos que utilice específicamente paquetes como biglm o ff.
Sin embargo, si está haciendo un trabajo de matriz en R que se puede vectorizar, será muy rápido, tal vez la mitad de la velocidad de un programa C en algunos casos, pero si está haciendo algo que no se puede vectorizar, entonces parecerá bastante lento. Para darle un ejemplo:
Cuando he aumentado N por un factor de diez a 100.000, di arriba en la prueba 4, después de 20 minutos, pero las pruebas 1: 3 tomó 61, 3 y 37 mili -seconds cada
Para N = 10,000,000 el tiempo para las pruebas 1: 3 es 3.3s, 0.6s y 1.6s
Tenga en cuenta que esto se hizo en una computadora portátil i7 y a 480mb por N = 10million, la memoria no fue un problema.
Para los usuarios en ventanas de 32 bits, hay un límite de memoria de 1.5 gb para R, sin importar cuánta memoria tenga, pero no existe dicho límite para las ventanas de 64 bits o Linux de 64 bits. En estos días, la memoria es muy barata en comparación con el costo de una hora de mi tiempo, así que solo compro más memoria en lugar de perder el tiempo tratando de solucionar esto. Pero esto supone que su modelo quedará en la memoria.
fuente
Sí, y esta es la buena razón para mudarse a R. El interés de escribir un paquete R es permitir a los usuarios hacer que sus funciones interactúen fácilmente con otras herramientas proporcionadas por R, por ejemplo, dándoles datos de arranque ... o lo que quieran. Si no cree que esto sea importante, utilice C / C ++ o su lenguaje compilado favorito.
rle()
Así que ten mucho cuidado. Después de sus primeros intentos, seguramente tendrá un disgusto con R, porque lo encontrará lento, con una sintaxis extraña, etc. Una vez que lo sepa, puede ser una herramienta muy eficiente. Incluso puede terminar escribiendo sus métodos en R como una fase preliminar para la codificación C / C ++. La etapa final será aprender la API de R para crear funciones precompiladas, y serás un asistente de R :)
fuente
La manipulación de la matriz en la memoria es una gran cosa para SAS, aparentemente. No conozco los detalles específicos sobre R, pero supongo que R opera en la memoria por defecto, ya que los paquetes de expansión de memoria para R, ff y bigmemory, mueven datos de la memoria al disco. Tengo punteros para usted si desea mejorar la velocidad o el uso de la memoria. Para mejorar la velocidad, primero debe usar R según lo previsto, es decir: vectorizar su código y usar la compilación de código de bytes. (Además: evite las operaciones de copia de memoria tanto como sea posible). En segundo lugar, use el generador de perfiles de código Rprof () para identificar parches lentos en su código y vuelva a escribirlos en C o C ++ si es necesario. Si necesita más memoria, puede usar el argumento de omisión en la función read.table () para leer en sus datos un fragmento a la vez y también puede usar un paquete como RMySQL, que agrega utilidades de manipulación de bases de datos a R. Si necesita aún más memoria y puede permitirse la disminución concomitante de la velocidad, puede usar el paquete de nieve para ejecutar R en paralelo. (Puede encontrar detalles sobre esto, y mucho más, en el libro "The Art of R Programming", de Norman Matloff, publicado a fines del año pasado. Los detalles sobre los paquetes mencionados aquí se pueden encontrar en línea).
fuente