17 votos

Cálculo de la velocidad en R?

He sido encargado de la mudanza, uno de nuestros grandes modelos estocásticos de SAS y en un nuevo lenguaje. Personalmente, prefiero el tradicional lenguaje compilado, pero la PI me quiere a retirar R, que nunca la he utilizado. Nuestra motivación para conseguir el modelo de SAS (1) muchas personas no tienen acceso a ella, porque SAS es caro, (2) que está buscando alejarse de un lenguaje interpretado, y (3) SAS es lento para el tipo de modelo que tenemos.

Para (1), obviamente R satisface la necesidad de ser libre. Para (2), idealmente, nos gustaría crear un ejecutable, pero R se utiliza normalmente como un lenguaje de secuencias de comandos. Veo que alguien ha puesto recientemente a cabo una R compilador - esto ha sido bien recibido? ¿Es fácil de usar? Preferimos no obligar al usuario a descargar R a sí mismos. Para (3), nuestro problema con SAS es todo el tiempo gastado en I/O de la escritura y de la lectura de conjuntos de datos. Nuestro modelo es computacionalmente intensivo, y a menudo estamos limitados por el tiempo de ejecución. (por ejemplo, no Es raro que alguien de apropiarse de los ordenadores de las personas durante el fin de semana para realizar corre.) Tenemos un modelo similar construido en Fortran que no tiene el mismo problema, porque todo el trabajo se realiza en la memoria. ¿Cómo R trabajo? Será la misma como SAS, en la que se trabaja en datasteps, lectura y escritura de archivos? O puede hacer la manipulación de matrices en memoria?

18voto

David J. Sokol Puntos 1730

R trabaja en la-memoria - de modo que tus datos no necesita ajuste en la memoria para la mayoría de las funciones.

El compilador paquete, si estoy pensando en algo que estás pensando (Lucas Tierney del compilador paquete se suministra con R), no es la misma cosa como un lenguaje compilado en el sentido tradicional (C, Fortran). Es un byte compilador para R en el sentido de bytecode de Java ejecutado por la máquina virtual Java o byte compilación de Emacs LISP código. No compilar R código en código máquina, sino más bien prepara el código R en código de bytes para que pueda ser utilizado de manera más eficiente que los crudos R código para ser interpretado.

Tenga en cuenta que si usted tiene bien formado Fortran, que probablemente podría tener lo mejor de ambos mundos; R puede llamar compilado Fortran rutinas.

13voto

Peter Puntos 1

He utilizado SAS durante 15 años, y han empezado a usar R seriamente en los últimos 6 meses, con algunos retoques en torno de él por un par de años antes de que. Desde una perspectiva de programación, R ¿las manipulaciones de datos directamente, no es equivalente a DATA o PROC SQLprocedimientos ya no son necesarios (siendo este último el más eficiente en SAS cuando hay una gran cantidad de manipulación de datos desde orígenes de datos externos, por ejemplo, los datos administrativos). Esto significa que, ahora que me estoy acostumbrando, la manipulación de datos es más rápido en R y requiere mucho menos código.

El principal problema que he encontrado es la memoria. No todos los paquetes de R permitir WEIGHT tipo de especificaciones, por lo que si usted tiene SAS conjuntos de datos con las variables que se utilizan en FREQ o REPLICATE declaraciones, puede tener problemas. He mirado en la ff y bigmemory paquetes en R pero no parecen ser compatibles con todos los paquetes de R, así que si usted tiene conjuntos de datos muy grandes que requieren de análisis que son relativamente poco comunes, y han sido agregados, puede que tenga problemas con la memoria.

Para la automatización, si usted tiene SAS macros , a continuación, usted debe ser capaz de programar el equivalente en R y ejecutar como proceso por lotes.

Para la codificación en R, yo estaba usando Notepad++ y establecer el idioma a R, y ahora estoy descubrir las alegrías de la R Studio. Estos dos productos son libres, y hacer de lenguaje de marca, como la mejora de la SAS sintaxis de la interfaz de usuario (sólo la he utilizado la sintaxis de la pantalla en SAS).

Hay un sitio web, y relacionados con el libro, para que la gente de intercambio de SAS a R. He encontrado útil para intentar averiguar cómo traducir algunos SAS comandos en R.

Actualización: una cosa que me volvía loco cuando viene a R es que R no asumir que todo es un conjunto de datos (data frame en R jerga), porque no es un paquete estadístico en la forma en que SAS, SPSS, Stata, etc. Así, por ejemplo, me tomó un tiempo para conseguir if instrucciones de trabajo, porque yo seguía recibiendo la ayuda para if de las declaraciones con los vectores (matrices) considerando que necesitaba un if declaración en la que trabajó con data frames. Así que las páginas de ayuda probablemente se tendría que leer más de cerca de lo que normalmente sería, porque tendrá que comprobar que el comando que desea hacer la voluntad de operar con los datos del tipo de objeto que tiene.

El bit que todavía me tiene loco cuando el aprendizaje de un nuevo R de comandos (por ejemplo, el método de análisis en un contribuido paquete) es que la ayuda para los comandos a menudo no es totalmente autosuficiente. Voy a ir a la página de ayuda para tratar de aprender los comandos y el uso de notas a menudo tienen ... contenida en ellos. A veces, tratando de averiguar qué se puede o se debe ir a donde el ... es me ha llevado en un bucle recursivo. La relativa brevedad de la ayuda de notas, provenientes de SAS que proporciona ejemplos detallados de la sintaxis y ejemplos desarrollados con una explicación del estudio en el ejemplo, fue un gran shock.

10voto

samiq Puntos 1128

R es un lenguaje de programación. Esto funciona no en datasteps. Hace lo que quiere hacer con él, para él no es sino un lenguaje de programación, un esclavo de sus deseos, expresados en un lenguaje de llaves y dos puntos.

Piense en ello como Fortran o C, pero con la implícita vectorización por lo que no tiene un bucle a través de matrices, y de administración de memoria dinámica por lo que no tiene a malloc() o declarar la matriz de tamaños en cualquier momento.

En su mayoría hace todo su trabajo en la memoria, pero si desea leer la parte de un archivo, mung, luego de escupir algunos de los resultados, y leer el siguiente bit, así, que seguir adelante y escribir un programa R que hace que.

Se contradice a sí mismo al decir que el modelo es computacionalmente intensivo sin embargo SAS es lento a causa de e/S... Uno o el otro sin duda...

Si tienes algo similar en Fortran ya, y usted dice que quiere alejarse de un lenguaje interpretado, entonces ¿por qué no hacerlo en Fortran así?

El R compilador puede causar algunas mejoras, pero si tu R código está bien escrito, de todos modos no se consigue nada demasiado masivo - no se como escribir en C o Fortran.

7voto

Chris Alparas Puntos 21

Entiendo que por defecto SAS puede trabajar con modelos que son más grandes que la memoria, pero este no es el caso con R, a menos que usted específicamente el uso de paquetes como biglm o ff.

Sin embargo, si usted está haciendo matriz de trabajo en R, que puede ser vectorizada va a ser muy rápido - tal vez la mitad de la velocidad de un programa en C en algunos casos, pero si usted está haciendo algo que no puede ser vectorizada, entonces se parecen bastante lento. Para dar un ejemplo:

# create a data.frame with 4 columns of standard normally distributed RVs
N <- 10000

# test 1
system.time( {df1 <- data.frame(h1=rnorm(N),
                h2=rpois(N, lambda=5),
                h3=runif(N),
                h4=rexp(N))
} )
# about 0.003 seconds elapsed time

# vectorised sum of columns 1 to 4
# i.e. it can work on an entire column all at once
# test 2
system.time( { df1$rowtotal1 <- df1$h1 + df1$h2 + df1$h3 + df1$h4 })
# about 0.001 seconds elapsed time

# test 3
# another version of the vectorised sum
system.time( { df1$rowtotal2 <- rowSums(df1[,c(1:4)]) })
# about 0.001 seconds elapsed time

# test 4
# using a loop... THIS IS *VERY* SLOW AND GENERALLY A BAD IDEA!!! :-)
system.time( {
        for(i in 1:nrow(df1)) {
                df1$rowtotal3 <- df1[i,1]+ df1[i,2] + df1[i,3] + df1[i,4]
        }
} )
# about 9.2 seconds elapsed time

Cuando yo el aumento de N por un factor de diez a 100.000, me di por vencido en la prueba de 4 después de 20 minutos, pero las pruebas 1:3 tomó 61, 3 y 37 de mili-segundos cada uno

Para N=10,000,000 el tiempo para las pruebas 1:3 3.3 s, 0,6 s y 1,6 s

Tenga en cuenta que esto fue hecho en un i7 portátil y en 480 mb para N=10million, la memoria no era un problema.

Para los usuarios de windows de 32 bits no es un 1.5 gb de límite de memoria para R no importa la cantidad de memoria que tiene, pero que no existe ningún límite para windows de 64 bits o de 64 bits de linux. En estos días la memoria es muy barato en comparación con el costo de una hora de mi tiempo, así que me acabo de comprar más memoria en lugar de gastar su tiempo tratando de conseguir alrededor de esto. Pero esto supone que el modelo se ajuste en la memoria.

3voto

user8076 Puntos 16

(2), idealmente, nos gustaría crear un ejecutable, pero R se utiliza normalmente como un lenguaje de secuencias de comandos

Sí, y esta es la buena razón mover a R. El interés por la escritura de un paquete de R es permitir a los usuarios realizar fácilmente sus funciones interactuar con otras herramientas proporcionadas por R, por ejemplo, la alimentación de ellos bootstraped de datos... o de lo que quieran. Si usted no cree que esto es importante, se adhieren a la C/C++, o su favorito lenguaje compilado.

Quiero añadir un inciso: ya eres un programador, el aprendizaje de R será fácil y rápido; el aprendizaje eficiente programación de R será más largo. Debido a que R se interpreta, las constantes ocultas en el $O()$ de la complejidad asintótica pueden ser grandes o pequeñas... por ejemplo, si usted está interesado en carreras en sus datos, usted utilizará rle(), va a ser rápido (es un precompilado de la función). Si la secuencia de comandos exactamente el mismo algoritmo, va a ser lento (que se interpreta en español). Este es un ejemplo básico: usted tiene un montón de trucos usando vectores y matrices, para evitar interpretado bucles y hacer precompilado funciones de hacer todo el trabajo.

Así que mucho cuidado. Después de sus primeros intentos, usted seguramente va a tener un disgusto con R, porque usted encontrará que es lento, con una extraña sintaxis, etc. Una vez que usted lo sepa, puede ser una herramienta muy eficaz. Usted puede incluso poner fin mediante secuencias de comandos en sus métodos en R como una fase preliminar para C/C++ de codificación. La última etapa será la de aprender R de la API para crear precompilado funciones, y que será una R asistente :)

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X