Matlab / octave ou R est-il mieux adapté à la simulation de monte carlo?

14

J'ai commencé à faire de Monte Carlo en R comme hobby, mais finalement un analyste financier m'a conseillé de migrer vers Matlab. Je suis un développeur de logiciels expérimenté. mais un débutant à Monte-Carlo. Je veux construire des modèles statiques avec analyse de sensibilité, plus tard des modèles dynamiques. Besoin de bonnes bibliothèques / algorithmes qui me guident.

Il me semble que R a d'excellentes bibliothèques, et je soupçonne que mathlab est préféré par les programmeurs inexpérimentés en raison du langage pascal facile. Le langage R est basé sur le schéma et c'est difficile pour les débutants, mais pas pour moi. Si Matlab / Octave n'a pas d'avantages du côté numérique / bibliothèque, je resterais avec R.

Roland Kofler
la source
2
R est basé sur Scheme mais est assez bon pour prétendre aux débutants qu'il est plutôt basé sur C.
2
> Je ne posterai pas cela comme une réponse car il y a beaucoup de gens qui connaissent mieux ces choses que moi. Cependant, je pense qu'en ce qui concerne la vitesse, vous devez faire la distinction entre la base R et le bon mix programmeur / super packages. Un bon programmeur peut exploiter certains des outils de cran tels que le multicœur, GPUtools & magma (bientôt mais pas encore utile pour MCMC), Rcpp, ... pour créer un code assez rapide. Je ne pense pas que matlab central ait quelque chose de comparable à offrir.
user603
@kwak - J'aurais probablement dû aussi poster ma réponse en tant que commentaire. Désolé pour ça.
M. Tibbits du
2
MT, c'est fou - votre réponse est excellente. Si quoi que ce soit, le kwak devrait également faire de lui une bonne réponse. Laissez ces personnes mieux informées voter ou répondre comme bon leur semble.
Matt Parker,
Toutes mes excuses à l'avance pour le nécropost. Le paquet financier GNU Octave octave.sourceforge.net/financial prend désormais en charge (depuis la version 0.5.0) la simulation Monte Carlo. Elle est nettement plus rapide que la version MATLAB car le code est écrit sans pour les boucles. Pour l'analyse comparative (par rapport à MATLAB) et un didacticiel, consultez parsiad.ca/post/simulate-sdes-in-gnu-octave-financial-package . Je devrais également faire connaître mon parti pris, car je suis l'auteur de ces méthodes.
parsiade

Réponses:

17

J'utilise les deux. Je prototype souvent des fonctions et des algorithmes dans Matlab parce que, comme indiqué, il est plus facile d'exprimer un algorithme dans quelque chose qui est proche d'un langage mathématique pur.

R possède d'excellentes bibliothèques. Je suis encore en train de l'apprendre, mais je commence à laisser Matlab dans la poussière car une fois que vous connaissez R, il est également assez facile de prototyper les fonctions là-bas.

Cependant, je trouve que si vous voulez que les algorithmes fonctionnent efficacement dans un environnement de production, il est préférable de passer à un langage compilé comme C ++. J'ai de l'expérience dans l'intégration de C ++ dans Matlab et R (et j'excelle d'ailleurs), mais j'ai eu une meilleure expérience avec R. Avertissement: étant un étudiant diplômé, je n'ai pas utilisé une version récente de Matlab pour mes dll, J'ai travaillé presque exclusivement dans Matlab 7.1 (qui a environ 4 ans). Peut-être que les versions les plus récentes fonctionnent mieux, mais je peux penser à deux situations sur le dessus de ma tête où une DLL C ++ à l'arrière de Matlab a provoqué un écran bleu de Windows XP parce que je marchais de manière inappropriée en dehors des limites d'un tableau - un problème très difficile à résoudre. déboguer si votre ordinateur redémarre à chaque fois que vous faites cette erreur ...

Enfin, la communauté R semble se développer beaucoup plus rapidement et avec beaucoup plus d'élan que la communauté Matlab n'a jamais eu. De plus, comme c'est gratuit, vous n'avez pas non plus affaire avec le gestionnaire de licence Godforsaken flexlm.

Remarque: Presque tout mon développement est en ce moment dans les algorithmes MCMC. Je fais environ 90% de la production en C ++ avec la visualisation en R en utilisant ggplot2.

Mise à jour pour les commentaires parallèles:

Une bonne partie de mon temps de développement est actuellement consacrée à la parallélisation des routines MCMC (c'est ma thèse de doctorat). J'ai utilisé la boîte à outils parallèle de Matlab et la solution de Star P (qui, je suppose, appartient maintenant à Microsoft ?? - jeez un autre est englouti ...) J'ai trouvé que la boîte à outils parallèle était un cauchemar de configuration - quand je l'ai utilisé, il nécessite un accès root à chaque nœud client unique. Je pense qu'ils ont corrigé ce petit "bug" maintenant, mais toujours un gâchis. J'ai trouvé la solution * 'p élégante, mais souvent difficile à profiler. Je n'ai pas utilisé Jacket , mais j'ai entendu de bonnes choses. Je n'ai pas non plus utilisé les versions les plus récentes de la boîte à outils parallèle qui prennent également en charge le calcul GPU.

Je n'ai pratiquement aucune expérience avec les packages parallèles R.

D'après mon expérience, la parallélisation du code doit se produire au niveau C ++ où vous avez une granularité plus fine de contrôle pour la décomposition des tâches et l'allocation de mémoire / ressource. Je trouve que si vous essayez de paralléliser des programmes à un niveau élevé, vous ne recevez souvent qu'une accélération minimale à moins que votre code ne soit décomposable de manière triviale (également appelé parallélisme factice). Cela dit, vous pouvez même obtenir des accélérations raisonnables en utilisant une seule ligne au niveau C ++ en utilisant OpenMP:

#pragma omp parallel for

Les schémas plus compliqués ont une courbe d'apprentissage, mais j'aime vraiment où les choses gpgpu vont. En ce qui concerne JSM cette année, les quelques personnes à qui j'ai parlé du développement de GPU dans R le citent comme n'étant que des "orteils au fond" pour ainsi dire. Mais comme indiqué, j'ai une expérience minimale - pour changer dans un avenir proche.

M. Tibbits
la source
+1 pour C ++; Bien qu'il soit assez facile d'intégrer C / C ++ à RI, j'enveloppe souvent mes codes et les exécutons dans R - alors il est plus agréable de passer des paramètres, de faire une visualisation en direct et évidemment d'analyser les résultats sans penser au format de fichier de sortie.
bien placé; MC en aura éventuellement besoin pour passer en C / C ++. Je n'ai pas assez d'expérience en R pour commenter, mais j'ai eu un certain nombre de maux de tête en utilisant C / C ++ avec Matlab en raison de différentes versions de bibliothèques d'objets partagées (sous Linux) tirées par l'exécutable Matlab que ce avec quoi je veux établir un lien avec mon code.
shabbychef
tibbits: Comment générez-vous des RN lorsque vous utilisez openMP?
csgillespie
En ce moment, je ne le suis pas. Les parties les plus chères de mes algorithmes MCMC calculent plusieurs probabilités, alors j'essaie de les regrouper le mieux possible et de les calculer en parallèle. Mais toute la configuration, la génération RN (pour les propositions), se fait sur un seul cœur de processeur. Pour les RNG parallèles, je commencerais par DC pour le Mersenne Twister - mais je ne l'ai jamais personnellement utilisé au-delà d'une traduction triviale vers CUDA pour les GPU (plus comme un exercice vraiment).
M. Tibbits
15

Pour être honnête, je pense que toute question que vous poserez ici à propos de R vs ... sera biaisée vers R. N'oubliez pas que R est de loin le tag le plus utilisé !

Ce que je fais

Ma pratique de travail actuelle consiste à utiliser R pour créer un prototype et à utiliser C lorsque j'ai besoin d'un coup de pouce supplémentaire. Auparavant, je devais passer très rapidement en C (encore une fois pour mes applications particulières), mais les bibliothèques multicœurs R ont aidé à retarder ce changement. Essentiellement, vous effectuez une forboucle en parallèle avec un changement trivial.

Je dois mentionner que mes applications sont très gourmandes en calcul.

Recommandation

Pour être parfaitement honnête, cela dépend vraiment de ce que vous voulez faire. Je fonde donc ma réponse sur cette affirmation dans votre question.

Je veux construire des modèles statiques avec analyse de sensibilité, plus tard des modèles dynamiques. Besoin de bonnes bibliothèques / algorithmes qui me guident

J'imagine que ce problème serait idéalement adapté au prototypage en R et à l'utilisation de C en cas de besoin (ou d'un autre langage compilé).

En disant que, généralement, l'analyse Monte-Carlo / sensibilité n'implique pas de routines statistiques particulièrement avancées - bien sûr, il peut avoir besoin d'autres fonctionnalités avancées. Je pense donc (sans plus d'informations) que vous pourriez effectuer votre analyse dans n'importe quelle langue, mais étant complètement biaisé, je recommanderais R!

csgillespie
la source
4
J'aime la partie sur "Ma pratique de travail actuelle consiste à utiliser R pour prototyper et à utiliser C lorsque j'ai besoin d'un coup de pouce supplémentaire." - cela ressemble à la description de travail de mon pauvre moi indigne et des développeurs C ++ dans le prochain bureau ... et je pense que cela capture vraiment fondamentalement toute situation impliquant R, C / C ++ et un problème de calcul statistique.
Stephan Kolassa
9

Bien que j'utilise presque exclusivement R , j'admire vraiment le profileur Matlab.
Lorsque votre programme est un peu lent, vous voulez normalement savoir où se trouve le goulot d'étranglement. Le profileur de Matlab est un excellent outil pour y parvenir car il vous indique combien de temps est consacré à chaque ligne du code.

Au moins pour moi, en utilisant Rprof est incomparablement pire. Je ne peux pas déterminer quel appel est le goulot d'étranglement. En utilisant, Rprofvous n'obtenez pas les informations sur le temps passé sur chaque ligne, mais sur le temps passé sur chaque fonction primitive (ou ainsi). Cependant, un grand nombre des mêmes fonctions primitives sont appelées par un grand nombre de fonctions différentes.

Bien que je recommande R(car il est tout simplement génial: gratuit, extrêmement puissant, ...) si vous savez que vous devez beaucoup profiler votre code, Matlab est bien meilleur. Et pour être honnête, il existe des boîtes à outils de calcul multicœurs et parallèles dans Matlab (bien que extrêmement coûteuses).

Henrik
la source
4
Je suis entièrement d'accord avec @Henrik. Si vous êtes préoccupé par le profilage, Matlab dispose d'un excellent outil de profilage (même de retour dans la version 7.1 !!). Rprof d'autre part laisse beaucoup à désirer. Je termine le profilage en exécutant chaque commande plusieurs fois dans une boucle for et en comparant la system.timedifférence entre les différentes versions. Voici une étude de cas intéressante
M. Tibbits
2

Si vos simulations impliquent des techniques relativement sophistiquées, alors R est la voie à suivre, car il est probable que les routines dont vous aurez besoin seront disponibles dans R, mais pas nécessairement dans matlab.

PeterR
la source
2

À mon avis, Matlab est une langue laide. Peut-être qu'il a maintenant des arguments par défaut et des arguments nommés dans son noyau, mais de nombreux exemples que vous trouvez en ligne font l'ancien "s'il y a 6 arguments, ceci, sinon s'il y a 5 arguments ceci et cela ..." et les arguments nommés sont juste vecteurs avec des chaînes (noms) et des valeurs alternées. C'est tellement des années 1970 que je ne peux tout simplement pas l'utiliser.

R peut avoir ses problèmes, et il est également ancien, mais il a été construit sur une fondation (Scheme / Lisp) qui était prospective et a plutôt bien résisté en comparaison.

Cela dit, Matlab est beaucoup plus rapide si vous aimez coder avec des boucles, etc. Et il a de bien meilleures fonctionnalités de débogage. Et des graphismes plus interactifs. En revanche, ce qui passe pour documenter votre code / bibliothèques est plutôt risible par rapport à R et vous payez un joli centime pour utiliser Matlab.

Tous IMO.

Wayne
la source