Ist Matlab / Oktave oder R besser für die Monte-Carlo-Simulation geeignet?

14

Ich begann Monte Carlo in R als Hobby zu machen, aber irgendwann riet mir ein Finanzanalyst, nach Matlab zu migrieren. Ich bin ein erfahrener Softwareentwickler. aber ein Monte Carlo Anfänger. Ich möchte statische Modelle mit Sensitivitätsanalyse konstruieren, später dynamische Modelle. Benötige gute Bibliotheken / Algorithmen, die mich leiten.

Mir scheint, dass R ausgezeichnete Bibliotheken hat, und ich vermute, dass Mathlab von unerfahrenen Programmierern wegen der einfachen Pascal-ähnlichen Sprache bevorzugt wird. Die R-Sprache basiert auf einem Schema und das ist für Anfänger schwer, aber nicht für mich. Wenn Matlab / Octave keine Vorteile auf der Seite der Numerik / Bibliothek hat, würde ich bei R bleiben.

Roland Kofler
quelle
2
R basiert auf Scheme, gibt aber den Anfängern ziemlich gut vor, dass es eher C-basiert ist.
2
> Ich werde dies nicht als Antwort posten, da es in diesen Dingen viele kenntnisreichere Leute gibt als ich. Allerdings denke ich, dass man hinsichtlich der Geschwindigkeit zwischen R-Base und dem Mix guter Programmierer / toller Pakete unterscheiden muss. Ein guter Programmierer kann einige der in cran enthaltenen Tools wie Multicore, GPUtools und Magma (bald, aber noch nicht für MCMC nützlich), Rcpp usw. nutzen, um einen ziemlich schnellen Code zu erstellen. Ich glaube nicht, dass matlab central etwas Vergleichbares zu bieten hat.
User603
@kwak - Ich hätte meine Antwort wahrscheinlich auch als Kommentar posten sollen. Das tut mir leid.
M. Tibbits
2
MT, das ist verrückt - deine Antwort ist großartig. Wenn überhaupt, sollte Kwak ihm auch eine angemessene Antwort geben. Lassen Sie die sachkundigeren abstimmen oder antworten, wie sie es für richtig halten.
Matt Parker
Entschuldigung im Voraus für die Nekropost. Das GNU Octave-Finanzpaket octave.sourceforge.net/financial unterstützt jetzt (ab 0.5.0) die Monte-Carlo-Simulation. Es ist deutlich schneller als die MATLAB-Version, da der Code ohne for-Schleifen geschrieben wird. Benchmarking (im Vergleich zu MATLAB) und ein Tutorial finden Sie unter parsiad.ca/post/simulate-sdes-in-gnu-octave-financial-package . Ich sollte auch meine Voreingenommenheit veröffentlichen, da ich der Autor dieser Methoden bin.
Parsiad

Antworten:

17

Ich benutze beides. Ich habe in Matlab oft Funktionen und Algorithmen prototypisiert, weil es, wie gesagt, einfacher ist, einen Algorithmus in etwas auszudrücken, das einer rein mathematischen Sprache nahekommt.

R hat ausgezeichnete Bibliotheken. Ich lerne es immer noch, aber ich lasse Matlab langsam im Staub, denn sobald Sie R kennen, ist es auch ziemlich einfach, dort Funktionen zu prototypisieren.

Wenn Sie jedoch möchten, dass Algorithmen in einer Produktionsumgebung effizient funktionieren, empfiehlt es sich, zu einer kompilierten Sprache wie C ++ zu wechseln. Ich habe Erfahrung darin, C ++ sowohl in Matlab als auch in R zu packen (und diesbezüglich zu übertreffen), aber ich habe eine bessere Erfahrung mit R. Haftungsausschluss: Als Student habe ich keine aktuelle Version von Matlab für meine DLLs verwendet. Ich habe fast ausschließlich in Matlab 7.1 gearbeitet (das ist ungefähr 4 Jahre alt). Vielleicht funktionieren die neueren Versionen besser, aber ich kann mir zwei Situationen vorstellen, in denen eine C ++ - DLL auf der Rückseite von Matlab dazu führte, dass Windows XP einen Bluescreen bekam, weil ich mich unangemessen außerhalb der Grenzen eines Arrays befand - ein sehr schweres Problem Fehlerbehebung, wenn Ihr Computer jedes Mal neu startet, wenn Sie diesen Fehler machen ...

Schließlich scheint die R-Community viel schneller und dynamischer zu wachsen, als es die Matlab-Community jemals getan hat. Da es kostenlos ist, müssen Sie sich auch nicht mit dem Godforsaken Flexlm License Manager auseinandersetzen.

Hinweis: Fast meine gesamte Entwicklung befasst sich derzeit mit MCMC-Algorithmen. Ich mache ungefähr 90% in der Produktion in C ++ mit der Visualisierung in R mit ggplot2.

Update für parallele Kommentare:

Ein beträchtlicher Teil meiner Entwicklungszeit wird derzeit für die Parallelisierung von MCMC-Routinen aufgewendet (dies ist meine Doktorarbeit). Ich habe Matlab parallel Toolbox und Star P-Lösung verwendet (was ich jetzt im Besitz von erraten Microsoft ?? - jeez ist ein anderer verschlungen ...) Ich habe die parallel Toolbox fand eine Konfiguration seinen Alptraum - wenn ich es benutze, Es erforderte Root-Zugriff auf jeden einzelnen Clientknoten. Ich denke, sie haben diesen kleinen "Bug" jetzt behoben, aber immer noch ein Chaos. Ich fand die Lösung elegant, aber oft schwer zu profilieren. Ich habe Jacket nicht benutzt , aber ich habe gute Dinge gehört. Ich habe auch nicht die neueren Versionen der parallelen Toolbox verwendet, die auch die GPU-Berechnung unterstützen.

Ich habe praktisch keine Erfahrung mit den R-Parallel-Paketen.

Ich habe die Erfahrung gemacht, dass die Parallelisierung von Code auf C ++ - Ebene erfolgen muss, wo Sie eine genauere Kontrolle über die Aufteilung der Aufgaben und die Speicher- / Ressourcenzuweisung haben. Ich finde, wenn Sie versuchen, Programme auf hoher Ebene zu parallelisieren, erhalten Sie oft nur eine minimale Beschleunigung, es sei denn, Ihr Code ist trivial zerlegbar (auch als Dummy-Parallelität bezeichnet). Das heißt, Sie können mit OpenMP sogar eine vernünftige Beschleunigung erzielen, wenn Sie eine einzelne Zeile auf C ++ - Ebene verwenden:

#pragma omp parallel for

Kompliziertere Schemata haben eine Lernkurve, aber ich mag es wirklich, wohin die Dinge mit GPGPU gehen. Seit JSM in diesem Jahr wird es von den wenigen Personen, mit denen ich über die GPU-Entwicklung in R gesprochen habe, sozusagen als "Zehen im tiefen Bereich" bezeichnet. Aber wie gesagt, ich habe nur minimale Erfahrung - in naher Zukunft zu ändern.

M. Tibbits
quelle
+1 für C ++; Während es ziemlich einfach ist, C / C ++ in RI einzubinden, werden meine Codes oft in R eingebunden und ausgeführt. Dann ist es besser, Parameter zu übergeben, live zu visualisieren und die Ergebnisse zu analysieren, ohne das Ausgabeformat zu berücksichtigen.
gut ausgedrückt; MC wird irgendwann einen benötigen, um zu C / C ++ zu wechseln. Ich habe nicht genug Erfahrung mit R, um Kommentare abzugeben, aber ich hatte einige Kopfschmerzen mit C / C ++ mit Matlab, weil verschiedene Versionen von Shared Object Libraries (unter Linux) von der ausführbaren Matlab-Datei abgerufen wurden, als mit denen ich verknüpfen möchte mein Code.
Shabbychef
tibbits: Wie generierst du RNs mit openMP?
Csgillespie
Im Moment bin ich nicht. Die teuersten Teile meiner MCMC-Algorithmen berechnen mehrere Wahrscheinlichkeiten, daher versuche ich, sie so gut wie möglich zu bündeln und parallel zu berechnen. Die gesamte Einrichtung, die RN-Generierung (für Vorschläge), erfolgt jedoch auf einem einzigen CPU-Kern. Für parallele RNGs würde ich mit DC für den Mersenne Twister beginnen - aber ich persönlich habe es nie über eine triviale Übersetzung in CUDA für GPUs hinaus verwendet (eher als Übung).
M. Tibbits
15

Um ehrlich zu sein, denke ich, dass jede Frage, die Sie hier zu R vs ... stellen, in Richtung R tendiert. Denken Sie daran, dass R bei weitem das am häufigsten verwendete Tag ist !

Was ich mache

Meine derzeitige Arbeitspraxis besteht darin, mit R Prototypen zu erstellen und C zu verwenden, wenn ich einen zusätzlichen Geschwindigkeitsschub benötige. Früher musste ich sehr schnell auf C umsteigen (wieder für meine speziellen Anwendungen), aber das R Multi - Core - Bibliotheken Verzögerung , dass der Schalter geholfen. Im Wesentlichen führen Sie eine forSchleife parallel zu einer geringfügigen Änderung aus.

Ich sollte erwähnen, dass meine Bewerbungen sind sehr rechenintensiv sind.

Empfehlung

Um ganz ehrlich zu sein, hängt es wirklich davon ab, was Sie genau tun möchten. Ich stütze meine Antwort auf diese Aussage in Ihrer Frage.

Ich möchte statische Modelle mit Sensitivitätsanalyse konstruieren, später dynamische Modelle. Benötige gute Bibliotheken / Algorithmen, die mich leiten

Ich würde mir vorstellen, dass dieses Problem ideal für das Prototyping in R und die Verwendung von C bei Bedarf (oder einer anderen kompilierten Sprache) geeignet ist.

In der Regel erfordert die Monte-Carlo-Analyse / Sensitivitätsanalyse keine besonders fortgeschrittenen statistischen Routinen - natürlich sind möglicherweise andere fortgeschrittene Funktionen erforderlich. Also ich (ohne weitere Informationen) denken , dass Sie könnten Ihre Analyse in jeder Sprache durchzuführen, aber vollständig vorgespannt ist, würde ich empfehlen , R!

csgillespie
quelle
4
Ich mag den Teil über "Meine gegenwärtige Arbeitspraxis besteht darin, R zum Prototypen zu verwenden und C zu verwenden, wenn ich einen zusätzlichen Geschwindigkeitsschub benötige." - es klingt wie die Stellenbeschreibung meines armen, unwürdigen Ichs und der C ++ - Entwickler im nächsten Büro ... und ich denke, es erfasst im Grunde jede Situation, die R, C / C ++ und ein Problem bei der statistischen Berechnung betrifft.
S. Kolassa - Setzen Sie Monica
9

Obwohl ich fast ausschließlich verwende R, bewundere ich den Profiler in Matlab.
Wenn Ihr Programm langsam ist, möchten Sie normalerweise wissen, wo sich der Engpass befindet. Der Matlab-Profiler ist ein großartiges Werkzeug, um dies zu erreichen, da er Ihnen sagt, wie viel Zeit für jede Codezeile aufgewendet wird.

Zumindest für mich ist die Verwendung Rprofunvergleichlich schlimmer. Ich kann nicht herausfinden, welcher Anruf der Engpass ist. Mit erhalten RprofSie nicht die Information, wie viel Zeit für jede Zeile aufgewendet wird, sondern wie viel Zeit für jede primitive Funktion (oder so) aufgewendet wird. Viele der gleichen primitiven Funktionen werden jedoch von vielen verschiedenen Funktionen aufgerufen.

Obwohl ich empfehle R(weil es einfach großartig ist: kostenlos, extrem leistungsfähig, ...), wenn Sie wissen, dass Sie Ihren Code viel profilieren müssen, ist Matlab viel besser. Und um fair zu sein, es gibt in Matlab Multicore- und Parallel-Computing-Toolboxen (allerdings sehr teuer).

Henrik
quelle
4
Ich stimme @Henrik voll und ganz zu. Wenn Sie sich Gedanken über die Profilerstellung machen, verfügt Matlab über ein hervorragendes Profilerstellungstool (bereits in Version 7.1 !!). Rprof hingegen lässt zu wünschen übrig. Am Ende der Profilerstellung führe ich jeden Befehl mehrmals in einer for-Schleife aus und vergleiche den system.timeUnterschied zwischen verschiedenen Versionen. Hier ist eine interessante Fallstudie
M. Tibbits
2

Wenn Ihre Simulationen relativ ausgefeilte Techniken beinhalten, ist R der richtige Weg, denn es ist wahrscheinlich, dass die von Ihnen benötigten Routinen in R verfügbar sind, jedoch nicht unbedingt in matlab.

PeterR
quelle
2

Matlab ist meiner Meinung nach eine hässliche Sprache. Vielleicht hat es inzwischen Standardargumente und benannte Argumente in seinem Kern, aber viele Beispiele, die Sie online finden, führen das alte "Wenn es 6 Argumente gibt, dies, sonst wenn es 5 Argumente gibt, das und das ..." und benannte Argumente sind gerecht Vektoren mit abwechselnden Zeichenfolgen (Namen) und Werten. Das ist so 1970, dass ich es einfach nicht benutzen kann.

R mag seine Probleme haben, und es ist auch alt, aber es wurde auf einer Grundlage (Schema / Lisp) aufgebaut, die vorausschauend war und sich im Vergleich gut behauptet hat.

Das heißt, Matlab ist viel schneller, wenn Sie mit Schleifen usw. codieren möchten. Außerdem bietet es viel bessere Debugging-Möglichkeiten. Und mehr interaktive Grafiken. Auf der anderen Seite ist das, was für die Dokumentation Ihres Codes / Ihrer Bibliotheken gilt, ziemlich lächerlich im Vergleich zu R, und Sie zahlen einen hübschen Cent für die Verwendung von Matlab.

Alles IMO.

Wayne
quelle