Animando el efecto de cambiar el ancho del kernel en R

10

Tengo algunos datos en R, almacenados en una lista. Pensar

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

aunque estos no son mis datos. Si luego ingreso el comando

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

entonces obtengo la estimación de densidad de probabilidad del núcleo, donde el núcleo es normal normal. Si reemplazo 1 con otros números, por supuesto, la imagen cambia.

Lo que me gustaría hacer es crear un video o animación en el que cada cuadro sea una trama, pero el ancho de banda del núcleo varía de cuadro a cuadro, mostrando así el efecto de cambiar el ancho de banda. ¿Cómo puedo hacer esto?

(Mis disculpas si este no es el lugar correcto para hacer preguntas sobre R.)

Michael Lugo
fuente

Respuestas:

11

Depende un poco de cuál sea su objetivo final.

Hack rápido y sucio para demostraciones en tiempo real

El uso Sys.sleep(seconds)en un bucle donde secondsindica el número de segundos entre cuadros es una opción viable. Deberá establecer los parámetros xlimy ylimen su llamada plotpara que las cosas se comporten como se espera.

Aquí hay un código de demostración 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)
}

Esto funciona bastante bien, especialmente usando X-Windows como el sistema de ventanas. Descubrí que Mac quartz()no funciona bien, desafortunadamente.

GIF animados

Si necesita algo que pueda redistribuirse, publicarse en una página web, etc., mire la write.giffunción en el paquete caTools . Mostrar ayuda en write.gifproporciona varios ejemplos agradables, que incluyen un par de animaciones, una con un ejemplo bastante bueno usando el conjunto de Mandelbrot.

Ver también aquí y aquí .

Control más ajustado y animaciones más sofisticadas

Hay un paquete de animación que se ve bastante capaz. Sin embargo, no lo he usado, así que no puedo dar ninguna recomendación real de ninguna manera.

Yo he visto algunos buenos ejemplos de salida de este paquete y se ven bastante bien. Quizás uno de los "aspectos más destacados" es la capacidad de incrustar una animación en un PDF.

cardenal
fuente
Eso parece funcionar. Principalmente busco un truco rápido y sucio para usar en demostraciones en una clase que estoy enseñando, pero si puedo publicarlo en una página web, mucho mejor.
Michael Lugo
Para el cuarzo, es más rápido dibujar un rectángulo blanco sobre el diagrama existente y luego volver a dibujar las líneas. Vea tourr:animate_distun ejemplo de este enfoque.
Hadley
7

Una forma de hacerlo es usar el excelente paquete de animación de Yihui Xie. Subí un ejemplo muy simple a mi cuenta pública de Dropbox : densidadplot (eliminaré este ejemplo en 3 días). ¿Es esto lo que estás buscando?

La animación se creó con el siguiente código R:

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
fuente
5

En aras de la integridad, si necesita esto para una demostración de clase, también mencionaría el manipulatepaquete que viene con RStudio . Tenga en cuenta que este paquete depende de la interfaz RStudio, por lo que no funcionará fuera de él.

manipulatees bastante bueno porque permite crear rápidamente algunos controles deslizantes para manipular cualquier elemento en la trama. Esto permitiría hacer una demostración fácil y en tiempo real en clase.

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

Otros ejemplos aquí

nico
fuente
4

Aquí hay otro enfoque:

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
fuente