Ich wurde beauftragt, eines unserer aktuellen großen stochastischen Modelle aus SAS in eine neue Sprache zu überführen. Persönlich bevorzuge ich eine traditionell kompilierte Sprache, aber der PI möchte, dass ich R auschecke, das ich nie benutzt habe. Unsere Motivation, das Modell aus SAS herauszuholen, ist, dass (1) viele Menschen keinen Zugang dazu haben, weil SAS teuer ist, (2) wir versuchen, uns von einer interpretierten Sprache zu lösen, und (3) SAS ist langsam die Art von Modell, das wir haben.
Für (1) erfüllt R offensichtlich das Bedürfnis, frei zu sein. Für (2) möchten wir im Idealfall eine ausführbare Datei erstellen, aber normalerweise wird R als Skriptsprache verwendet. Ich sehe, dass kürzlich jemand einen R-Compiler herausgebracht hat - wurde dies gut aufgenommen? Ist es einfach zu bedienen Wir möchten den Benutzer nicht dazu zwingen, R selbst herunterzuladen. Für (3) ist unser Problem mit SAS die Zeit, die wir für das Schreiben und Lesen von Datensätzen aufwenden. Unser Modell ist rechenintensiv und wir sind oft durch die Laufzeit begrenzt. (ZB ist es nicht ungewöhnlich, dass jemand über das Wochenende die Computer anderer Leute entführt, um Läufe durchzuführen.) Wir haben ein ähnliches Modell in Fortran gebaut, das nicht das gleiche Problem hat, da alle Arbeiten im Speicher ausgeführt werden. Wie funktioniert R? Wird es dasselbe sein wie SAS, da es in Datenschritten arbeitet, Dateien lesen und schreiben? Oder kann es Array-Manipulation im Speicher tun?
Antworten:
R arbeitet im Arbeitsspeicher - daher müssen Ihre Daten für die meisten Funktionen in den Arbeitsspeicher passen.
Das Compiler-Paket ist, wenn ich an das denke, woran Sie denken ( das mit R gelieferte Compiler- Paket von Luke Tierney ), nicht dasselbe wie eine kompilierte Sprache im herkömmlichen Sinne (C, Fortran). Es handelt sich um einen Byte-Compiler für R im Sinne von Java-Bytecode, der von der Java-VM ausgeführt wird, oder um eine Bytekompilierung von Emacs-LISP-Code. Es kompiliert R-Code nicht in Maschinencode, sondern bereitet den R-Code in Bytecode vor, damit er effizienter verwendet werden kann als zu interpretierender roher R-Code.
Beachten Sie, dass Sie, wenn Sie Fortran gut geformt haben, wahrscheinlich das Beste aus beiden Welten haben könnten. R kann kompilierte Fortran-Routinen aufrufen.
quelle
Ich habe es
SAS
15 Jahre lang benutzt und habe inR
den letzten 6 Monaten angefangen, es ernsthaft zu benutzen, wobei ich ein paar Jahre vorher daran herumgebastelt habe. In Bezug auf die Programmierung werdenR
Daten direkt bearbeitet, es gibt keine Entsprechung zuDATA
oderPROC SQL
Prozeduren, da diese nicht benötigt werden (letztere sind effizienter,SAS
wenn viele Daten aus externen Datenquellen, z. B. Verwaltungsdaten, bearbeitet werden müssen). Das bedeutet, dass die Datenmanipulation jetzt schnellerR
und mit weniger Code durchgeführt werden kann.Das Hauptproblem, auf das ich gestoßen bin, ist das Gedächtnis. Nicht bei allen R-Paketen sind
WEIGHT
Typspezifikationen zulässig. Wenn Sie alsoSAS
Datasets mit Variablen haben, die inFREQ
oderREPLICATE
Anweisungen verwendet werden, können Probleme auftreten. Ich habe mir dieff
undbigmemory
-Pakete in R angesehen, aber sie scheinen nicht mit allen R-Paketen kompatibel zu sein. Wenn Sie also sehr große Datensätze haben, für die Analysen erforderlich sind, die relativ ungewöhnlich und aggregiert sind, können Probleme mit dem Arbeitsspeicher auftreten.Wenn Sie dies für die Automatisierung
SAS macros
tun, sollten Sie in der Lage sein, das Äquivalent zu programmierenR
und als Batch auszuführen.Zum Programmieren habe
R
ichNotepad++
die Sprache verwendet und eingestelltR
und entdecke jetzt die Freuden vonR Studio
. Beide Produkte sind kostenlos und haben eine Sprachmarkierung wie die verbesserteSAS
Syntax-GUI (in der ich bisher nur den Syntax-Bildschirm verwendet habeSAS
).Es gibt eine Website und ein dazugehöriges Buch für Leute, die von
SAS
nach tauschenR
. Ich fand sie nützlich, um herauszufinden, wie man einigeSAS
Befehle übersetztR
.Update: eine Sache , die mich treibt Nüsse , wenn sie kommt ,
R
ist , dassR
nicht davon ausgehen , alles , was ein Datensatz ist (data frame
inR
parlance), weil es in der Art und Weise nicht ein statistisches Paket ist , dassSAS
,SPSS
,Stata
, etc. ist. Ich habe zum Beispiel eine Weile gebraucht , umif
Anweisungen zum Laufen zu bringen , weil ich immer wieder die Hilfe fürif
Anweisungen mit Vektoren (oder vielleicht Matrizen) erhielt, während ich eineif
Anweisung brauchte , mit der es funktioniertedata frames
. Daher müssen die Hilfeseiten wahrscheinlich genauer gelesen werden, als Sie es normalerweise tun würden, da Sie überprüfen müssen, ob der gewünschte Befehl mit dem von Ihnen verwendeten Datenobjekttyp funktioniert.Das, was mich beim Erlernen eines neuen
R
Befehls (z. B. einer Analysemethode in einem beigestellten Paket) immer noch verrückt macht, ist, dass die Hilfe für Befehle oft nicht vollständig in sich geschlossen ist. Ich gehe zur Hilfeseite, um zu versuchen, den Befehl und die darin oft...
enthaltenen Verwendungshinweise zu lernen . Manchmal hat der Versuch herauszufinden, was dahin gehen kann oder soll, wo...
es ist, mich in eine rekursive Schleife geführt. Die relative Kürze der Hilfetexte, ausSAS
denen ausführliche Syntaxbeispiele und Arbeitsbeispiele mit einer Erläuterung der Studie im Beispiel hervorgehen, war ein ziemlicher Schock.quelle
R ist eine Programmiersprache. Es funktioniert nicht in Datenschritten. Es macht, was immer Sie wollen, denn es ist nur eine Programmiersprache, ein Sklave für Ihre Wünsche, ausgedrückt in geschweiften Klammern und Doppelpunkten.
Stellen Sie es sich wie Fortran oder C vor, aber mit impliziter Vektorisierung, damit Sie keine Schleife über Arrays durchführen müssen, und dynamischer Speicherverwaltung, damit Sie zu keinem Zeitpunkt malloc () oder Arraygrößen deklarieren müssen.
Meistens erledigt es seine ganze Arbeit im Speicher, aber wenn Sie einen Teil einer Datei einlesen, mungieren, dann einige der Ergebnisse ausspucken und das nächste Bit einlesen wollen, dann schreiben Sie ein R-Programm, das tut das.
Sie widersprechen sich darin, dass das Modell rechenintensiv ist, SAS jedoch aufgrund von E / A langsam ist ... Der eine oder andere sicherlich ...
Wenn Sie in Fortran bereits etwas Ähnliches haben und sagen, Sie möchten sich von einer interpretierten Sprache lösen, warum dann nicht auch in Fortran?
Der R-Compiler kann einige Beschleunigungen verursachen, aber wenn Ihr R-Code trotzdem gut geschrieben ist, werden Sie nichts zu massives bekommen - anders als wenn Sie ihn in C oder Fortran schreiben.
quelle
Ich verstehe, dass SAS standardmäßig mit Modellen arbeiten kann, die größer als der Arbeitsspeicher sind, aber dies ist bei R nicht der Fall, es sei denn, Sie verwenden speziell Pakete wie biglm oder ff.
Wenn Sie jedoch Array-Arbeiten in R ausführen, die vektorisiert werden können, ist dies sehr schnell - in einigen Fällen vielleicht halb so schnell wie ein C-Programm schleppend. Um Ihnen ein Beispiel zu geben:
Als ich N um den Faktor 10 auf 100.000 erhöhte, gab ich Test 4 nach 20 Minuten auf, aber die Tests 1: 3 erforderten 61, 3 und 37 Milli -Sekunden jeder
Für N = 10.000.000 beträgt die Zeit für die Tests 1: 3 3,3 s, 0,6 s und 1,6 s
Beachten Sie, dass dies auf einem i7-Laptop durchgeführt wurde und bei 480 MB für N = 10 Millionen kein Problem mit dem Speicher bestand.
Für Benutzer von 32-Bit-Fenstern gibt es ein Speicherlimit von 1,5 GB für R, unabhängig davon, wie viel Speicher Sie haben. Für 64-Bit-Fenster oder 64-Bit-Linux gibt es jedoch kein solches Limit. Heutzutage ist der Speicher sehr billig im Vergleich zu den Kosten einer Stunde meiner Zeit, daher kaufe ich mir einfach mehr Speicher, anstatt Zeit damit zu verbringen, dies zu umgehen. Dies setzt jedoch voraus, dass Ihr Modell in den Speicher passt.
quelle
Ja, und das ist der gute Grund, warum Sie zu R wechseln. Das Interesse am Schreiben eines R-Pakets besteht darin, Benutzern die Möglichkeit zu geben, Ihre Funktionen einfach mit anderen von R bereitgestellten Tools zu interagieren, z. Wenn Sie dies nicht für wichtig halten, bleiben Sie bei C / C ++ oder Ihrer bevorzugten kompilierten Sprache.
Ich möchte eine Einschränkung hinzufügen: Sie sind bereits Programmierer, und das Erlernen von R ist einfach und schnell. Lernen effizienter R-Programmierung wird länger sein. Da R interpretiert wird, verbergen sich die Konstanten in derO ( ) von der asymptotischen Komplexität kann riesig oder klein sein ... Wenn Sie zum Beispiel an Läufen in Ihren Daten interessiert sind, werden Sie verwenden
rle()
, es wird schnell sein (es ist eine vorkompilierte Funktion). Wenn Sie genau den gleichen Algorithmus schreiben, ist er langsam (er wird interpretiert). Dies ist ein einfaches Beispiel: Sie haben viele Tricks mit Vektoren und Matrizen, um interpretierte Schleifen zu vermeiden und vorkompilierte Funktionen den ganzen Job erledigen zu lassen.Sei also sehr vorsichtig. Nach Ihren ersten Versuchen werden Sie sicherlich ein Ekel mit R haben, weil Sie es langsam finden, mit einer seltsamen Syntax usw. Wenn Sie es einmal wissen, kann es ein sehr effizientes Werkzeug sein. Sie können sogar mit der Skripterstellung Ihrer Methoden in R als Vorbereitungsphase für die C / C ++ - Codierung enden. Die ultimative Phase besteht darin, die API von R zu lernen, um vorkompilierte Funktionen zu erstellen, und Sie werden ein R-Assistent sein :)
quelle
Die Manipulation von Arrays im Speicher ist anscheinend eine große Sache für SAS. Ich kenne die Besonderheiten von R nicht, aber ich vermute, dass R standardmäßig im Speicher arbeitet, da die Speichererweiterungspakete für R, ff und bigmemory Daten vom Speicher auf die Festplatte verschieben. Ich habe Hinweise für Sie, wenn Sie entweder die Geschwindigkeit oder die Speichernutzung verbessern möchten. Um die Geschwindigkeit zu verbessern, müssen Sie zuerst R wie vorgesehen verwenden, dh Ihren Code vektorisieren und die Bytecode-Kompilierung verwenden. (Außerdem: Vermeiden Sie Speicherkopiervorgänge so weit wie möglich.) Verwenden Sie zweitens den mitgelieferten Code-Profiler Rprof (), um langsame Patches in Ihrem Code zu identifizieren, und schreiben Sie sie gegebenenfalls in C oder C ++ um. Wenn Sie mehr Speicher benötigen, können Sie das Argument skip in der Funktion read.table () verwenden, um jeweils einen Block Ihrer Daten einzulesen, und Sie können auch ein Paket wie RMySQL verwenden, das R Dienstprogramme zur Datenbankmanipulation hinzufügt. Wenn Sie noch mehr Speicherplatz benötigen und sich die damit einhergehende Geschwindigkeitsreduzierung leisten können, können Sie mit dem Schneepaket R parallel laufen lassen. (Details dazu und vieles mehr finden Sie in dem Ende letzten Jahres erschienenen Buch "The Art of R Programming" von Norman Matloff. Details zu den hier genannten Paketen finden Sie online.)
quelle