O Matlab / oitava ou R é mais adequado para a simulação de monte carlo?

14

Comecei a fazer Monte Carlo em R como hobby, mas eventualmente um analista financeiro aconselhou a migração para o Matlab. Sou um desenvolvedor de software experiente. mas um iniciante em Monte Carlo. Eu quero construir modelos estáticos com análise de sensibilidade, modelos dinâmicos posteriores. Precisa de boas bibliotecas / algoritmos que me guiem.

Para mim, parece que o R possui excelentes bibliotecas, e eu suspeito que o mathlab seja preferido por programadores inexperientes devido à linguagem fácil do tipo pascal. A linguagem R é baseada no esquema e isso é difícil para iniciantes, mas não para mim. Se o Matlab / Octave não tiver vantagens no lado numérico / da biblioteca, eu ficaria com R.

Roland Kofler
fonte
2
R é baseado em Scheme, mas é muito bom em fingir para os iniciantes que é bastante baseado em C.
2
> Não vou postar isso como resposta, porque há muitas pessoas com mais conhecimento dessas coisas do que eu. No entanto, acho que com relação à velocidade, você precisa distinguir entre a base R e a mistura de bons programadores / ótimos pacotes. Um bom programador pode aproveitar algumas das ferramentas do cran, como multicore, GPUtools e magma (em breve, mas ainda não úteis para o MCMC), Rcpp, ... para criar um código bastante rápido. Não acho que o Matlab Central tenha algo comparável a oferecer.
user603
@kwak - Eu provavelmente também deveria ter postado minha resposta como comentário. Me desculpe por isso.
M. Tibbits
2
MT, isso é loucura - sua resposta é ótima. Se alguma coisa, o kwak também deve ser uma resposta adequada. Permita que aqueles com mais conhecimento votem ou respondam como entenderem.
Matt Parker
Desculpas antecipadas pelo necropost. O pacote financeiro do GNU Octave, octave.sourceforge.net/financial, agora suporta (a partir de 0.5.0) a simulação de Monte Carlo. É significativamente mais rápido que a versão do MATLAB, pois o código é escrito sem loops. Para benchmarking (comparado ao MATLAB) e um tutorial, consulte parsiad.ca/post/simulate-sdes-in-gnu-octave-financial-package . Também devo divulgar meu viés, pois sou o autor desses métodos.
parsiad 30/06/16

Respostas:

17

Eu uso os dois. Geralmente protótipo de funções e algoritmos no Matlab porque, como afirmado, é mais fácil expressar um algoritmo em algo próximo de uma linguagem matemática pura.

R tem excelentes bibliotecas. Ainda estou aprendendo, mas estou começando a deixar o Matlab na poeira, porque quando você conhece o R, também é bastante fácil criar protótipos de funções lá.

No entanto, acho que se você deseja que os algoritmos funcionem eficientemente dentro de um ambiente de produção, é melhor mudar para uma linguagem compilada como C ++. Tenho experiência em agrupar C ++ em Matlab e R (e, nesse caso, excel), mas tive uma experiência melhor com R. Isenção de responsabilidade: como estudante de graduação, não usei uma versão recente do Matlab para minhas dlls, Eu tenho trabalhado quase exclusivamente no Matlab 7.1 (que tem 4 anos). Talvez as versões mais recentes funcionem melhor, mas consigo pensar em duas situações em que uma dll C ++ na parte de trás do Matlab causou a tela azul do Windows XP porque caminhei de maneira inadequada fora dos limites de uma matriz - um problema muito difícil de resolver. depure se o seu computador reiniciar toda vez que você cometer esse erro ...

Por fim, a comunidade R parece estar crescendo muito mais rápido e com muito mais impulso do que a comunidade Matlab já teve. Além disso, como é gratuito, você também não tem contato com o gerenciador de licenças flexlm esquecido por Deus.

Nota: Quase todo o meu desenvolvimento está nos algoritmos do MCMC agora. Faço cerca de 90% na produção em C ++ com a visualização em R usando o ggplot2.

Atualização para comentários paralelos:

Uma boa parte do meu tempo de desenvolvimento atualmente é gasta em paralelo às rotinas do MCMC (é minha tese de doutorado). Eu usei a caixa de ferramentas paralela do Matlab e a solução Star P (que eu acho que agora é de propriedade da Microsoft ?? - eita, outra é devorada ...) Eu achei a caixa de ferramentas paralela um pesadelo de configuração - quando eu a usei, exigia acesso raiz a todos os nós do cliente. Acho que eles corrigiram esse pequeno "bug" agora, mas ainda estão uma bagunça. Eu achei a solução * 'p elegante, mas geralmente difícil de definir. Eu não usei Jacket , mas ouvi coisas boas. Também não usei as versões mais recentes da caixa de ferramentas paralelas, que também suportam o cálculo da GPU.

Não tenho praticamente nenhuma experiência com os pacotes paralelos R.

Minha experiência é que o código paralelo deve ocorrer no nível C ++, onde você tem uma granularidade de controle mais fina para decomposição de tarefas e alocação de memória / recurso. Descobri que, se você tentar paralelizar programas em um nível alto, geralmente recebe apenas uma aceleração mínima, a menos que seu código seja trivialmente decomponível (também chamado de paralelismo fictício). Dito isso, você pode até obter velocidades razoáveis ​​usando uma linha única no nível C ++ usando o OpenMP:

#pragma omp parallel for

Esquemas mais complicados têm uma curva de aprendizado, mas eu realmente gosto de onde as coisas do gpgpu estão indo. No JSM deste ano, as poucas pessoas com quem conversei sobre o desenvolvimento de GPU no R o citam como sendo apenas "dedos no fundo do poço", por assim dizer. Mas, como afirmado, tenho experiência mínima - para mudar no futuro próximo.

M. Tibbits
fonte
+1 para C ++; embora seja bastante fácil incorporar C / C ++ à RI, geralmente envolva meus códigos e os execute no R - então é melhor passar parâmetros, fazer visualização ao vivo e obviamente analisar resultados sem pensar no formato do arquivo de saída.
Bem colocado; O MC eventualmente exigirá que você mude para C / C ++. Eu não tenho experiência suficiente em R para comentar, mas tive várias dores de cabeça usando C / C ++ com Matlab devido a diferentes versões de bibliotecas de objetos compartilhados (no Linux) sendo puxadas pelo executável do Matlab do que o que eu quero vincular. meu código
21810 shabbychef
tibbits: Como você gera RNs ao usar o openMP?
Csgillespie 13/10/10
No momento, não estou. As partes mais caras dos meus algoritmos MCMC estão computando várias probabilidades, então eu tento agrupá-las da melhor maneira possível e computá-las em paralelo. Mas toda a configuração, geração RN (para propostas), é feita em um único núcleo da CPU. Para RNGs paralelos, eu começaria com o DC para o Mersenne Twister - mas nunca o usei pessoalmente além de uma tradução trivial para CUDA para GPUs (mais como um exercício realmente).
M. Tibbits
15

Para ser honesto, acho que qualquer pergunta que você fizer por aqui sobre R vs ... será tendenciosa para R. Lembre-se de que R é de longe a tag mais usada !

O que eu faço

Minha prática de trabalho atual é usar R para prototipar e usar C quando eu precisar de um aumento extra de velocidade. Costumava ter que mudar para C muito rapidamente (novamente para meus aplicativos específicos), mas as bibliotecas R de vários núcleos ajudaram a atrasar essa troca. Essencialmente, você forexecuta um loop em paralelo com uma alteração trivial.

Devo mencionar que meus aplicativos são muito computacionais.

Recomendação

Para ser perfeitamente honesto, isso realmente depende exatamente do que você deseja fazer. Então, estou baseando minha resposta nessa afirmação em sua pergunta.

Eu quero construir modelos estáticos com análise de sensibilidade, modelos dinâmicos posteriores. Precisa de boas bibliotecas / algoritmos que me guiem

Eu imaginaria que esse problema seria ideal para prototipar em R e usar C quando necessário (ou alguma outra linguagem compilada).

Ao dizer isso, normalmente a análise de Monte-Carlo / sensibilidade não envolve rotinas estatísticas particularmente avançadas - é claro que pode ser necessária outra funcionalidade avançada. Então eu acho (sem mais informações) que você poderia realizar sua análise em qualquer idioma, mas sendo completamente tendencioso, eu recomendaria o R!

csgillespie
fonte
4
Gosto da parte sobre "Minha prática de trabalho atual é usar R para prototipar e usar C quando preciso de um aumento extra de velocidade". - soa como a descrição do trabalho do meu pobre indigno e dos desenvolvedores de C ++ no próximo escritório ... e acho que realmente captura basicamente qualquer situação envolvendo R, C / C ++ e um problema na computação estatística.
Stephan Kolassa
9

Embora eu quase exclusivamente use R , eu realmente admiro o criador de perfil no Matlab.
Quando o seu programa está meio lento, você normalmente quer saber onde está o gargalo. O criador de perfil do Matlab é uma ótima ferramenta para conseguir isso, pois informa quanto tempo é gasto em cada linha do código.

Pelo menos para mim, o uso Rprofé incomparavelmente pior. Não consigo descobrir qual chamada é o gargalo. Usando Rprofvocê não obtém informações sobre quanto tempo é gasto em cada linha, mas quanto tempo é gasto em cada função primitiva (mais ou menos). No entanto, muitas das mesmas funções primitivas são chamadas por muitas funções diferentes.

Embora eu recomende R(porque é ótimo: gratuito, extremamente poderoso, ...) se você sabe que precisa criar um perfil muito do seu código, o Matlab é muito melhor. E para ser justo, existem caixas de ferramentas de computação multicore e paralelas no Matlab (embora extremamente caras).

Henrik
fonte
4
Concordo plenamente @Henrik. Se você está preocupado com a criação de perfis, o Matlab possui uma excelente ferramenta de criação de perfis (mesmo na versão 7.1 !!). Rprof, por outro lado, deixa muito a desejar. Termino a criação de perfil executando cada comando várias vezes em um loop for e comparando a system.timediferença entre versões diferentes. Aqui está um estudo de caso interessante
M. Tibbits
2

Se suas simulações envolverem técnicas relativamente sofisticadas, R é o caminho a seguir, porque é provável que as rotinas necessárias estejam disponíveis em R, mas não necessariamente no matlab.

PeterR
fonte
2

Na minha opinião, o Matlab é uma linguagem feia. Talvez já tenha obtido argumentos padrão e argumentos nomeados em seu núcleo, mas muitos exemplos que você encontra on-line fazem o antigo "Se houver 6 argumentos, este, caso contrário, se houver 5 argumentos, isto e aquilo ..." e argumentos nomeados são apenas vetores com seqüências alternadas (nomes) e valores. Isso é tão dos anos 70 que eu simplesmente não posso usá-lo.

O R pode ter seus problemas, e também é antigo, mas foi construído sobre uma base (Scheme / Lisp) que era prospectiva e se mantinha bastante bem em comparação.

Dito isto, o Matlab é muito mais rápido se você gosta de codificar com loops, etc. E possui recursos de depuração muito melhores. E gráficos mais interativos. Por outro lado, o que se passa com a documentação de seu código / bibliotecas é ridículo em comparação ao R e você paga um centavo para usar o Matlab.

Todos IMO.

Wayne
fonte