2009-09-25 6 views
3

Contexte:R: mettre à jour le tracé [xy] lims avec de nouveaux ajouts de points() ou de lignes()?

Je suis en cours d'exécution d'une simulation de Monte Carlo pour montrer qu'un processus particulier (une moyenne cumulative) ne pas convergent vers au fil du temps, et diverge souvent d'une manière extravagante dans la simulation (l'attente du variable aléatoire = infini). Je veux tracer environ 10 de ces simulations sur un graphique linéaire, où l'axe x a le numéro d'itération, et l'axe y a la moyenne cumulative jusqu'à ce point.

Voici mon problème:

Je vais courir de la première simulation, et construire l'intrigue principale en fonction de sa gamme actuelle (chaque sim ayant 10.000 itérations.). Mais souvent l'une des simulations aura une portée de quelques ordres de grandeur plus grande que la première, de sorte que l'intrigue vole en dehors de la plage d'origine. Donc, existe-t-il un moyen de mettre à jour dynamiquement le ylim ou xlim d'un tracé lors de l'ajout d'un nouvel ensemble de points ou de lignes?

je peux penser à deux solutions de contournement pour cela: 1. magasin chaque simulation, puis choisissez celui avec la plus large gamme, et construire le graphe de base hors de ce (pas élégant, et je devrais stocker beaucoup de données en mémoire, mais serait probablement compatible avec les ordinateurs portables [[EDIT: comme le souligne Marek, ce n'est pas un exemple intense en mémoire, mais si vous connaissez une solution sympa qui supporterait bien plus d'itérations telles que cela devient un problème (pensez aux promenades de grande dimension qui nécessitent beaucoup, beaucoup plus d'échantillons de MC pour la convergence) puis sautez à droite dans]]) 2. trouvez une graine qui apparaît pour en construire une jolie version, et réglez manuellement le ylim, ce qui rendrait la démonstration reproductible.

Naturellement, je tiens à quelque chose de plus élégant que mes solutions de contournement. En espérant que ce n'est pas trop un problème piéton, puisque j'imagine que ce n'est pas rare avec des simulations en R. Des idées?

+2

Je me demande simplement: avez-vous des problèmes de mémoire? 10 vecteurs de 10.000 n'est pas beaucoup. Comme je vérifie: X <-lapply (1: 10, fonction (i) rnorm (100000,0,1000)); object.size (X)/1024/1024 est juste 7 Mo de RAM. Donc 1. devrait être ok. – Marek

+0

Non, bon point - Je ne suis certainement pas confronté à des problèmes de mémoire (d'où mon ordinateur portable) avec cette simulation, mais je vais démontrer des simulations beaucoup plus compliquées [Q] MC [MC] dans le futur, avec la même sortie d'un graphique. Je cherche quelque chose qui, en général, ne compterait pas trop sur le stockage, d'autant plus que les choses se compliquent et que j'ai besoin de tailles d'échantillons MC beaucoup plus grandes pour assurer la convergence. Cela peut être inévitable/je surestime peut-être la difficulté de mettre en œuvre les futures simulations. – HamiltonUlmer

Répondre

5

Je ne sais pas si cela est possible en utilisant des graphiques de base, si quelqu'un a une solution, j'aimerais le voir. Cependant, les systèmes graphiques basés sur grid (lattice et ggplot2) permettent d'enregistrer et de mettre à jour l'objet graphique. C'est incroyablement facile dans ggplot2.

require(ggplot2)

faire des données et obtenir la gamme:

foo <- as.data.frame(cbind(data=rnorm(100), numb=seq_len(100))) 

faire un objet initial de ggplot et le tracer:

p <- ggplot(as.data.frame(foo), aes(numb, data)) + layer(geom='line') 
p 

faire un peu plus de données et l'ajouter à l'intrigue

foo <- as.data.frame(cbind(data=rnorm(200), numb=seq_len(200))) 

p <- p + geom_line(aes(numb, data, colour="red"), data=as.data.frame(foo)) 

tracer le nouvel objet

p 
+0

Ceci est une bonne solution, et la preuve que je dois utiliser ggplot2 plus. L'utilisation de rnorm (200, 0, 1000) dans la deuxième assignation de foo montre vraiment que cela fonctionne magnifiquement :-) – Vince

+1

Maintenant que j'y pense un peu plus, cela n'aidera pas le problème de mémoire s'il y en a un (tous que les données de l'objet ggplot doivent vivre quelque part.) – Peter

+0

Étant donné ce contexte particulier (simulations simples et courtes), l'utilisation de ggplot est la meilleure approche. Et le fait est que ggplot2 est vraiment sympa pour d'autres raisons, donc une réponse qui l'utilise est correcte dans mon livre. Je vais potentiellement demander à nouveau si. quand la mémoire est un problème. – HamiltonUlmer

0

Je pense que (1) est la meilleure option. En fait, je ne pense pas que ce n'est pas élégant. Je pense qu'il serait plus intensif en calcul de redessiner chaque fois que vous frappez un point plus grand que xlim ou ylim.

En outre, j'ai vu dans le livre de Peter Hoff à propos des statistiques bayésiennes une utilisation sympa de ts() au lieu de lines() pour les sommes cumulatives. Il semble assez épatant:

alt text

+1

Une solution qui utilise des graphiques de base et une mémoire plus légère serait de suivre les X et Y max. Enregistrez ensuite l'ensemble de données complet dans un fichier. Lorsque vous effectuez une nouvelle exécution, si la plage est plus grande, refaites le tracé, puis passez en boucle dans les fichiers de données stockés. – Peter

+0

Au lieu de vérifier (et éventuellement de replotter) après chaque essai, on pourrait enregistrer des données et des plages de stockage, puis trouver une plage globale, l'utiliser comme ylim et tracer des résultats (pour la première fois). – Marek

+0

Une partie de mon soutien de cette approche a été le commentaire de Marek ci-dessus, que ce n'est pas * beaucoup * de données. 7 Mo de RAM. Comparé aux exigences de mémoire d'assemblage de génome que j'ai vues récemment, les sims de MCMC sont une goutte dans le seau! – Vince

Questions connexes