¿Es Matlab / octava o R más adecuado para la simulación de Monte Carlo?


14

Comencé a hacer Montecarlo en R como pasatiempo, pero finalmente un analista financiero me aconsejó migrar a Matlab. Soy un desarrollador de software experimentado. pero un principiante de Monte Carlo. Quiero construir modelos estáticos con análisis de sensibilidad, modelos dinámicos posteriores. Necesito buenas bibliotecas / algoritmos que me guíen.

A mí me parece que R tiene excelentes bibliotecas, y sospecho que los programadores inexpertos prefieren el mathlab debido al lenguaje fácil de pascal. El lenguaje R se basa en un esquema y esto es difícil para los principiantes, pero no para mí. Si Matlab / Octave no tiene ventajas en el lado numérico / biblioteca, me quedaría con R.


2
R se basa en el esquema, pero es bastante bueno al pretender a los principiantes que se basa más bien en C.

2
> No publicaré esto como respuesta porque hay muchas personas con más conocimientos en estas cosas que yo. Sin embargo, creo que con respecto a la velocidad hay que distinguir entre R base y la combinación de buen programador / excelentes paquetes. Un buen programador puede aprovechar algunas de las herramientas en cran como multinúcleo, GPUtools y magma (pronto pero aún no es útil para MCMC), Rcpp, ... para hacer un código bastante rápido. No creo que matlab central tenga algo comparable para ofrecer.
usuario603

@kwak: probablemente también debería haber publicado mi respuesta como comentario. Lo siento por eso.
M. Tibbits

2
MT, eso es una locura, tu respuesta es genial. En todo caso, kwak también debería ser su respuesta adecuada. Deje que aquellos con más conocimientos voten o respondan como mejor les parezca.
Matt Parker

Disculpas de antemano por el necropost. El paquete financiero GNU Octave octave.sourceforge.net/financial ahora admite (a partir de 0.5.0) la simulación de Monte Carlo. Es significativamente más rápido que la versión de MATLAB ya que el código se escribe sin bucles. Para la evaluación comparativa (en comparación con MATLAB) y un tutorial, consulte parsiad.ca/post/simulate-sdes-in-gnu-octave-financial-package . También debería publicar mi sesgo, ya que soy el autor de estos métodos.
parsiad

Respuestas:


17

Yo uso ambos. A menudo prototipo de funciones y algoritmos en Matlab porque, como se dijo, es más fácil expresar un algoritmo en algo cercano a un lenguaje matemático puro.

R tiene excelentes bibliotecas. Todavía lo estoy aprendiendo, pero estoy empezando a dejar a Matlab en el polvo porque una vez que conoces R, también es bastante fácil crear prototipos de funciones allí.

Sin embargo, creo que si desea que los algoritmos funcionen eficientemente dentro de un entorno de producción, es mejor pasar a un lenguaje compilado como C ++. Tengo experiencia en envolver C ++ en Matlab y R (y sobresalir para el caso), pero he tenido una mejor experiencia con R. Descargo de responsabilidad: Siendo un estudiante graduado, no he usado una versión reciente de Matlab para mis dlls, He estado trabajando casi exclusivamente en Matlab 7.1 (que tiene como 4 años). Quizás las versiones más nuevas funcionen mejor, pero puedo pensar en dos situaciones fuera de mi cabeza donde un dll C ++ en la parte posterior de Matlab causó que Windows XP apareciera en la pantalla azul porque caminé inapropiadamente fuera de los límites de una matriz, un problema muy difícil de resolver. depurar si su computadora se reinicia cada vez que comete ese error ...

Por último, la comunidad R parece estar creciendo mucho más rápido y con mucho más impulso que la comunidad de Matlab. Además, como es gratis, tampoco tiene que lidiar con el administrador de licencias flexlm de Godforsaken.

Nota: Casi todo mi desarrollo está en algoritmos MCMC en este momento. Realizo alrededor del 90% en producción en C ++ con la visualización en R usando ggplot2.

Actualización para comentarios paralelos:

Una buena parte de mi tiempo de desarrollo en este momento lo paso en paralelo a las rutinas MCMC (es mi tesis doctoral). He usado la caja de herramientas paralelas de Matlab y la solución de Star P (¿supongo que ahora es propiedad de Microsoft? Dios, otra está engullida ...) Encontré que la caja de herramientas paralelas es una pesadilla de configuración , cuando la usé, requirió acceso raíz a cada nodo de cliente. Creo que han solucionado ese pequeño "error" ahora, pero sigue siendo un desastre. Encontré que la solución * 'p es elegante, pero a menudo difícil de perfilar. No he usado Jacket , pero he escuchado cosas buenas. Tampoco he usado las versiones más recientes de la caja de herramientas paralelas que también admiten el cálculo de GPU.

Prácticamente no tengo experiencia con los paquetes paralelos R.

Según mi experiencia, el código de paralelización debe ocurrir en el nivel de C ++ donde tiene una granularidad de control más fina para la descomposición de tareas y la asignación de memoria / recursos. Me parece que si intentas paralelizar programas en un nivel alto, a menudo solo recibes una aceleración mínima a menos que tu código sea trivialmente descomponible (también llamado paralelismo ficticio). Dicho esto, incluso puedes obtener aceleraciones razonables usando una sola línea en el nivel de C ++ usando OpenMP:

#pragma omp parallel for

Los esquemas más complicados tienen una curva de aprendizaje, pero realmente me gusta hacia dónde van las cosas de gpgpu. A partir de JSM este año, las pocas personas con las que hablé sobre el desarrollo de GPU en R lo citan como solo "dedos en el fondo", por así decirlo. Pero como se dijo, tengo una experiencia mínima: cambiar en el futuro cercano.


+1 para C ++; Si bien es bastante fácil incrustar C / C ++ en RI, a menudo envuelvo mis códigos y los ejecuto dentro de R, entonces es mejor pasar parámetros, hacer visualización en vivo y obviamente analizar resultados sin pensar en el formato del archivo de salida.

así poner; MC eventualmente requerirá que uno se mueva a C / C ++. No tengo suficiente experiencia en R para comentar, pero he tenido varios dolores de cabeza al usar C / C ++ con Matlab debido a que el ejecutable de Matlab ha introducido diferentes versiones de bibliotecas de objetos compartidos (en Linux) de las que quiero vincular mi código.
shabbychef

tibbits: ¿Cómo generas RN cuando usas openMP?
csgillespie

Ahora mismo no. Las partes más caras de mis algoritmos MCMC son calcular varias posibilidades, así que trato de agruparlas lo mejor posible y calcularlas en paralelo. Pero toda la configuración, generación RN (para propuestas), se realiza en un solo núcleo de CPU. Para RNG paralelos, comenzaría con DC para el Mersenne Twister, pero nunca lo he usado personalmente más allá de una traducción trivial a CUDA para GPU (más como un ejercicio realmente).
M. Tibbits

15

Para ser honesto, creo que cualquier pregunta que hagas aquí sobre R vs ... será un sesgo hacia R. ¡Recuerda que R es, con mucho, la etiqueta más utilizada !

Lo que hago

Mi práctica laboral actual es usar R para crear prototipos y usar C cuando necesito un impulso adicional de velocidad. Solía ​​ser que tendría que cambiar a C muy rápidamente (nuevamente para mis aplicaciones particulares), pero las bibliotecas multinúcleo R han ayudado a retrasar ese cambio. Esencialmente, haces que un forciclo se ejecute en paralelo con un cambio trivial.

Debo mencionar que mis aplicaciones son muy computacionalmente intensivas.

Recomendación

Para ser sincero, realmente depende exactamente de lo que quieras hacer. Así que baso mi respuesta en esta afirmación en su pregunta.

Quiero construir modelos estáticos con análisis de sensibilidad, modelos dinámicos posteriores. Necesito buenas bibliotecas / algoritmos que me guíen

Me imagino que este problema sería ideal para crear prototipos en R y usar C cuando sea necesario (o algún otro lenguaje compilado).

Dicho esto, por lo general, el análisis de sensibilidad / Monte-Carlo no implica rutinas estadísticas particularmente avanzadas; por supuesto, puede necesitar otra funcionalidad avanzada. Así que creo (sin más información) que podría llevar a cabo su análisis en cualquier idioma, pero siendo completamente parcial, le recomendaría R!


44
Me gusta la parte sobre "Mi práctica laboral actual es usar R para crear un prototipo y usar C cuando necesito un impulso adicional de velocidad". - Suena como la descripción del trabajo de mi pobre yo indigno y de los desarrolladores de C ++ en la próxima oficina ... y creo que realmente captura básicamente cualquier situación que involucre R, C / C ++ y un problema en el cálculo estadístico.
Stephan Kolassa

9

Aunque uso casi exclusivamente R, realmente admiro el perfilador Matlab.
Cuando su programa es un poco lento, normalmente quiere saber dónde está el cuello de botella. El generador de perfiles de Matlab es una gran herramienta para lograr esto, ya que le indica cuánto tiempo pasa en cada línea del código.

Al menos para mí, usar Rprofes incomparablemente peor. No puedo entender qué llamada es el cuello de botella. Con el uso Rprofno obtiene la información sobre cuánto tiempo se dedica a cada línea, sino cuánto tiempo se dedica a cada función primitiva (más o menos). Sin embargo, muchas de las mismas funciones primitivas son llamadas por muchas funciones diferentes.

Aunque lo recomiendo R(porque es simplemente genial: gratis, extremadamente potente, ...) si sabes que tienes que perfilar mucho tu código, Matlab es mucho mejor. Y para ser justos, hay cajas de herramientas informáticas multinúcleo y paralelas en Matlab (aunque extremadamente caras).


44
Estoy completamente de acuerdo con @Henrik. Si le preocupa la creación de perfiles, Matlab tiene una excelente herramienta de creación de perfiles (¡incluso en la versión 7.1!). Rprof por otro lado deja mucho que desear. Termino perfilando ejecutando cada comando varias veces en un bucle for y comparando la system.timediferencia entre diferentes versiones. Aquí hay un caso de estudio interesante
M. Tibbits

2

Si sus simulaciones involucrarán técnicas relativamente sofisticadas, entonces R es el camino a seguir, porque es probable que las rutinas que necesitará estén disponibles en R, pero no necesariamente en matlab.


2

En mi opinión, Matlab es un lenguaje feo. Quizás ya tiene argumentos predeterminados y argumentos nombrados en su núcleo, pero muchos ejemplos que encuentra en línea hacen el viejo "Si hay 6 argumentos, esto, si hay 5 argumentos esto y aquello ..." y los argumentos nombrados son solo vectores con cadenas alternas (nombres) y valores. Eso es tan de 1970 que simplemente no puedo usarlo.

R puede tener sus problemas, y también es antiguo, pero fue construido sobre una base (Scheme / Lisp) que era prospectiva y se ha mantenido bastante bien en comparación.

Dicho esto, Matlab es mucho más rápido si te gusta codificar con bucles, etc. Y tiene mejores instalaciones de depuración. Y más gráficos interactivos. Por otro lado, lo que pasa por documentar su código / bibliotecas es bastante ridículo en comparación con R y paga un centavo por usar Matlab.

Todo de la OMI.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.