Animation de l'effet de la modification de la largeur du noyau dans R

10

J'ai quelques données dans R, stockées dans une liste. Pense

d <- c(1,2,3,4) 

bien que ce ne soit pas mes données. Si j'entre alors la commande

 plot(density(d, kernel="gaussian", width=1))

puis j'obtiens l'estimation de la densité de probabilité du noyau, où le noyau est normal normal. Si je remplace 1 par d'autres nombres, bien sûr l'image change.

Ce que je voudrais faire, c'est créer une vidéo ou une animation dans laquelle chaque image est un tel complot, mais la bande passante du noyau varie d'une image à l'autre, montrant ainsi l'effet de changer la bande passante. Comment puis-je faire ceci?

(Mes excuses si ce n'est pas le bon endroit pour poser des questions sur R.)

Michael Lugo
la source

Réponses:

11

Cela dépend un peu de votre objectif final.

Hack rapide et sale pour des démonstrations en temps réel

L'utilisation Sys.sleep(seconds)dans une boucle où secondsindique le nombre de secondes entre les images est une option viable. Vous devrez définir les paramètres xlimet ylimdans votre appel plotpour que les choses se comportent comme prévu.

Voici un code de démonstration simple.

# Just a quick test of Sys.sleep() animation

x <- seq(0,2*pi, by=0.01)
y <- sin(x)
n <- 5
pause <- 0.5

ybnds <- quantile(n*y, probs=c(0,1))
x11()

# Draw successively taller sinewaves with a gradually changing color
for( i in 1:n )
{
    plot(x, i*y, type="l", lwd=2, ylim=ybnds, col=topo.colors(2*n)[i])
    Sys.sleep(pause)
}

Cela fonctionne assez bien, en particulier en utilisant X-Windows comme système de fenêtrage. J'ai trouvé que Mac quartz()ne fonctionne pas bien, malheureusement.

GIF animés

Si vous avez besoin de quelque chose qui peut être redistribué, publié sur une page Web, etc., regardez la write.giffonction dans le paquet caTools . L'affichage de l'aide sur write.gifdonne plusieurs exemples intéressants, y compris quelques animations, dont une avec un bel exemple utilisant l'ensemble Mandelbrot.

Voir aussi ici et ici .

Contrôle plus précis et animations plus sophistiquées

Il existe un package d' animation qui semble assez performant. Je ne l'ai pas utilisé moi-même, donc je ne peux pas donner de vraies recommandations de toute façon.

Je l' ai vu quelques bons exemples de sortie de ce paquet et ils ont l' air assez agréable. L'un des "points forts" est peut-être la possibilité d'incorporer une animation dans un PDF.

cardinal
la source
Cela semble fonctionner. Je recherche principalement un hack rapide et sale à utiliser pour les démonstrations dans une classe que j'enseigne, mais si je peux le publier sur une page Web, tant mieux.
Michael Lugo
Pour le quartz, il est plus rapide de dessiner un rectangle blanc sur le tracé existant, puis de redessiner les lignes. Voir tourr:animate_distpour un exemple de cette approche.
hadley
7

Une façon de procéder consiste à utiliser l'excellent package d' animation de Yihui Xie. J'ai téléchargé un exemple très simple sur mon compte dropbox public: densitéplot (je supprimerai cet exemple dans 3 jours). Est-ce ce que vous recherchez?

L'animation a été créée à l'aide du code R suivant:

library(animation)
density.ani <- function(){
    i <- 1  
    d <- c(1,2,3,4) 
    while (i <= ani.options("nmax")) {
      plot(density(d, kernel="gaussian", bw = i), ylim = c(0, 0.25))
      ani.pause()
      i <- i + 1
    }
}

saveHTML({
par(mar = c(5, 4, 1, 0.5))
density.ani()
}, nmax = 30, title = "Changing kernel width")
Bernd Weiss
la source
5

Par souci d'exhaustivité, si vous en avez besoin pour une démonstration de classe, je mentionnerais également le manipulatepackage fourni avec RStudio . Notez que ce package dépend de l'interface RStudio, donc il ne fonctionnera pas en dehors de celui-ci.

manipulateest assez cool car il permet de créer rapidement des curseurs pour manipuler n'importe quel élément de l'intrigue. Cela permettrait de faire une démonstration facile et en temps réel en classe.

manipulate(
  plot(density(1:10, bw)),
  bw = slider(0, 10, step = 0.1, initial = 1)) 

D'autres exemples ici

Nico
la source
4

Voici une autre approche:

library(TeachingDemos)

d <- c(1,2,3,4)

tmpfun <- function(width=1, kernel='gaussian'){
    plot(density(d, width=width, kernel=kernel))
}

tmplst <- list( width=list('slider', init=1, from=.5, to=5, resolution=.1),
    kernel=list('radiobuttons', init='gaussian', values=c('gaussian',
        "epanechnikov","rectangular","triangular","biweight","cosine",
        "optcosine")))

tkexamp( tmpfun, tmplst, plotloc='left' )
Greg Snow
la source