Matlab / octave o R è più adatto alla simulazione monte carlo?


14

Ho iniziato a fare Monte Carlo in R come hobby, ma alla fine un analista finanziario mi ha consigliato di migrare su Matlab. Sono uno sviluppatore software esperto. ma un principiante di Monte Carlo. Voglio costruire modelli statici con analisi di sensibilità, successivamente modelli dinamici. Ho bisogno di buone librerie / algoritmi che mi guidino.

A me sembra che R abbia librerie eccellenti, e sospetto che la matematica sia preferita dai programmatori inesperti a causa del linguaggio semplice simile a quello pasquale. Il linguaggio R si basa sullo schema e questo è difficile per i principianti, ma non per me. Se Matlab / Octave non ha vantaggi dal punto di vista numerico / bibliotecario, rimarrei con R.


2
R si basa su Scheme ma è piuttosto bravo a fingere ai principianti che è piuttosto basato su C.

2
> Non pubblicherò questo come risposta perché ci sono molte persone più informate in queste cose di me. Tuttavia, penso che per quanto riguarda la velocità devi distinguere tra R base e il buon programmatore / ottimi pacchetti. Un buon programmatore può sfruttare alcuni degli strumenti in cran come multicore, GPUtools e magma (presto ma non ancora utile per MCMC), Rcpp, ... per creare un codice abbastanza veloce. Non credo che Matlab Central abbia qualcosa di paragonabile da offrire.
user603

@kwak - Probabilmente avrei dovuto pubblicare la mia risposta anche come commento. Mi dispiace per quello.
M. Tibbits,

2
MT, è pazzesco: la tua risposta è fantastica. Semmai, anche Kwak dovrebbe fare della sua una risposta adeguata. Lascia che siano i più competenti a votare o rispondere a loro piacimento.
Matt Parker,

Ci scusiamo in anticipo per la necropost. Il pacchetto finanziario GNU Octave octave.sourceforge.net/financial ora supporta (a partire dalla versione 0.5.0) la simulazione Monte Carlo. È significativamente più veloce della versione MATLAB poiché il codice è scritto senza loop. Per il benchmarking (confrontato con MATLAB) e un tutorial, consultare parsiad.ca/post/simulate-sdes-in-gnu-octave-financial-package . Dovrei anche pubblicizzare il mio pregiudizio, poiché sono l'autore di questi metodi.
parsiad

Risposte:


17

Io uso entrambi. Spesso prototipo di funzioni e algoritmi in Matlab perché, come detto, è più facile esprimere un algoritmo in qualcosa che è vicino a un linguaggio matematico puro.

R ha librerie eccellenti. Lo sto ancora imparando, ma sto iniziando a lasciare Matlab nella polvere perché una volta che conosci R, è anche abbastanza facile prototipare le funzioni lì.

Tuttavia, trovo che se si desidera che gli algoritmi funzionino in modo efficiente all'interno di un ambiente di produzione, è meglio passare a un linguaggio compilato come C ++. Ho esperienza nell'involgere C ++ sia in Matlab che in R (ed eccelle per quella materia), ma ho avuto un'esperienza migliore con R. Disclaimer: essendo uno studente laureato, non ho usato una versione recente di Matlab per le mie dll, Ho lavorato quasi esclusivamente in Matlab 7.1 (che è come 4 anni). Forse le versioni più recenti funzionano meglio, ma riesco a pensare a due situazioni nella parte superiore della mia testa in cui una DLL C ++ nella parte posteriore di Matlab ha causato la schermata blu di Windows XP perché ho camminato in modo inappropriato al di fuori dei limiti di un array - un problema molto difficile da eseguire il debug se il computer si riavvia ogni volta che si commette l'errore ...

Infine, la comunità R sembra crescere molto più velocemente e con molto più slancio di quanto la comunità Matlab abbia mai avuto. Inoltre, poiché è gratuito, non hai nemmeno a che fare con il gestore di licenze flexlm Godforsaken.

Nota: quasi tutto il mio sviluppo è attualmente in algoritmi MCMC. Faccio circa il 90% della produzione in C ++ con la visualizzazione in R usando ggplot2.

Aggiornamento per commenti paralleli:

Una buona parte del mio tempo di sviluppo in questo momento è dedicato alla parallelizzazione delle routine MCMC (è la mia tesi di dottorato). Ho usato toolbox parallela del Matlab e la soluzione di Stella P (che credo sia ora di proprietà di Microsoft ?? - jeez un altro è inghiottito ...) ho trovato la casella degli strumenti in parallelo ad essere una configurazione incubo - quando l'ho usato, ha richiesto l'accesso come root a ogni singolo nodo client. Penso che abbiano risolto quel piccolo "bug" ora, ma ancora un casino. Ho trovato * 'p soluzione elegante, ma spesso difficile da profilare. Non ho usato Jacket , ma ho sentito cose buone. Inoltre non ho usato le versioni più recenti della toolbox parallela che supportano anche il calcolo della GPU.

Non ho praticamente alcuna esperienza con i pacchetti R parallel.

È stata la mia esperienza che il parallelismo del codice deve avvenire a livello C ++ in cui si dispone di una granularità più fine di controllo per la decomposizione delle attività e l'allocazione di memoria / risorse. Trovo che se si tenta di parallelizzare i programmi ad alto livello, spesso si riceve solo una velocità minima a meno che il codice non sia banalmente scomponibile (chiamato anche parallelismo fittizio). Detto questo, puoi persino ottenere ragionevoli accelerazioni usando una linea singola a livello di C ++ usando OpenMP:

#pragma omp parallel for

Schemi più complicati hanno una curva di apprendimento, ma mi piace molto dove vanno le cose di gpgpu. A partire da JSM quest'anno, le poche persone con cui ho parlato dello sviluppo della GPU in R lo citano come "dita dei piedi nel profondo" per così dire. Ma come detto, ho un'esperienza minima - per cambiare nel prossimo futuro.


+1 per C ++; mentre è abbastanza facile incorporare C / C ++ in RI spesso avvolge i miei codici ed eseguirli all'interno di R - quindi è meglio passare parametri, eseguire visualizzazioni live e ovviamente analizzare i risultati senza pensare al formato del file di output.

ben messo; MC alla fine ne richiederà uno per passare a C / C ++. Non ho abbastanza esperienza in R per commentare, ma ho avuto un certo numero di mal di testa usando C / C ++ con Matlab a causa del fatto che diverse versioni delle librerie di oggetti condivisi (sotto Linux) venivano trascinate dall'eseguibile Matlab rispetto a ciò con cui voglio collegarmi il mio codice.
shabbychef,

tibbits: come si generano gli RN quando si utilizza openMP?
csgillespie,

Al momento no. Le parti più costose dei miei algoritmi MCMC stanno calcolando diverse probabilità, quindi provo a raggrupparle nel miglior modo possibile e calcolarle in parallelo. Ma tutto il setup, la generazione RN (per le proposte), è fatto su un singolo core della CPU. Per RNG paralleli, inizierei con DC per il Mersenne Twister, ma non l'ho mai usato personalmente al di là di una banale traduzione in CUDA per GPU (più come un vero esercizio).
M. Tibbits,

15

Ad essere sincero, penso che qualsiasi domanda che poni qui su R vs ... sarà parzializzante verso R. Ricorda che R è di gran lunga il tag più usato !

Quello che faccio

La mia attuale pratica di lavoro è usare R per prototipo e usare C quando ho bisogno di un ulteriore aumento di velocità. In passato dovevo passare a C molto rapidamente (di nuovo per le mie applicazioni particolari), ma R librerie multicore hanno contribuito a ritardare tale passaggio. In sostanza, si foresegue un ciclo in parallelo con una banale modifica.

Dovrei menzionare che le mie domande sono molto impegnative dal punto di vista computazionale.

Raccomandazione

Ad essere sinceri, dipende davvero esattamente da cosa vuoi fare. Quindi sto basando la mia risposta su questa affermazione nella tua domanda.

Voglio costruire modelli statici con analisi di sensibilità, successivamente modelli dinamici. Ho bisogno di buone librerie / algoritmi che mi guidino

Immagino che questo problema sarebbe ideale per la prototipazione in R e l'uso di C quando necessario (o qualche altro linguaggio compilato).

Dicendo che, in genere Monte-Carlo / analisi della sensibilità non coinvolgono routine statistiche particolarmente avanzate - ovviamente potrebbe aver bisogno di altre funzionalità avanzate. Quindi penso che (senza ulteriori informazioni) che si potrebbe svolgere la vostra analisi in qualsiasi lingua, ma essere completamente prevenuto, mi sento di raccomandare R!


4
Mi piace la parte su "La mia pratica di lavoro attuale è usare R per prototipo e usare C quando ho bisogno di un ulteriore aumento di velocità". - sembra la descrizione del lavoro del mio povero indegno e degli sviluppatori C ++ nel prossimo ufficio ... e penso che catturi davvero praticamente qualsiasi situazione che coinvolga R, C / C ++ e un problema nel calcolo statistico.
Stephan Kolassa,

9

Anche se uso quasi esclusivamente R, ammiro molto il profiler in Matlab.
Quando il tuo programma è un po 'lento, normalmente vuoi sapere dove si trova il collo di bottiglia. Il profiler di Matlab è un ottimo strumento per raggiungere questo obiettivo in quanto ti dice quanto tempo è trascorso su ogni riga del codice.

Almeno per me, l'uso Rprofè incomparabilmente peggio. Non riesco a capire quale chiamata è il collo di bottiglia. utilizzandoRprof non si ottengono le informazioni su quanto tempo viene impiegato su ciascuna riga, ma quanto tempo viene dedicato a ciascuna funzione primitiva (o giù di lì). Tuttavia, molte delle stesse funzioni primitive sono chiamate da molte funzioni diverse.

Anche se lo consiglio R(perché è semplicemente fantastico: gratuito, estremamente potente, ...) se sai che devi profilare molto il tuo codice, Matlab è molto meglio. E per essere onesti, ci sono toolbox di calcolo multicore e parallelo in Matlab (anche se estremamente costosi).


4
Sono completamente d'accordo @Henrik. Se sei preoccupato per la profilazione, Matlab ha un eccellente strumento di profilazione (anche nella versione 7.1 !!). D'altra parte Rprof lascia molto a desiderare. Finisco di profilare eseguendo ogni comando più volte in un ciclo for e confrontando la system.timedifferenza tra le diverse versioni. Ecco un caso di studio interessante
M. Tibbits,

2

Se le tue simulazioni coinvolgeranno tecniche relativamente sofisticate, allora R è la strada da percorrere, perché è probabile che le routine di cui avrai bisogno siano disponibili in R, ma non necessariamente in matlab.


2

Secondo me, Matlab è un linguaggio brutto. Forse ha ottenuto argomenti predefiniti e argomenti nominati nel suo nucleo ormai, ma molti esempi che trovi online fanno il vecchio "Se ci sono 6 argomenti, questo, altrimenti se ci sono 5 argomenti questo e quello ..." e gli argomenti nominati sono solo vettori con stringhe (nomi) e valori alternati. Sono così gli anni '70 che semplicemente non riesco a usarlo.

R potrebbe avere i suoi problemi, ed è anche vecchio, ma è stato costruito su una fondazione (Scheme / Lisp) che era lungimirante e ha resistito piuttosto bene in confronto.

Detto questo, Matlab è molto più veloce se ti piace programmare con loop, ecc. E ha strutture di debug molto migliori. E più grafica interattiva. D'altra parte, ciò che passa per documentare il tuo codice / librerie è piuttosto ridicolo rispetto a R e paghi un bel soldo per usare Matlab.

Tutto IMO.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.