Animare l'effetto della modifica della larghezza del kernel in R


10

Ho alcuni dati in R, memorizzati in un elenco. Pensare

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

sebbene questi non siano i miei dati. Se poi inserisco il comando

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

quindi ottengo la stima della densità di probabilità del kernel, in cui il kernel è normale standard. Se sostituisco 1 con altri numeri, ovviamente l'immagine cambia.

Quello che mi piacerebbe fare è creare un video o un'animazione in cui ogni frame è una trama, ma la larghezza di banda del kernel varia da frame a frame, mostrando così l'effetto di cambiare la larghezza di banda. Come posso fare questo?

(Mi scuso se questo non è il posto giusto per porre domande su R.)

Risposte:


11

Dipende un po 'dal tuo obiettivo finale.

Hack veloce e sporco per dimostrazioni in tempo reale

L'utilizzo Sys.sleep(seconds)in un ciclo in cui secondsindica il numero di secondi tra i frame è un'opzione praticabile. È necessario impostare i parametri xlime ylimnella chiamata plotper fare in modo che le cose si comportino come previsto.

Ecco un semplice codice dimostrativo.

# 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)
}

Funziona abbastanza bene, specialmente usando X-Windows come sistema di finestre. Ho scoperto che i Mac quartz()non funzionano bene, sfortunatamente.

GIF animate

Se hai bisogno di qualcosa che può essere ridistribuito, pubblicato su una pagina web, ecc., Guarda la write.giffunzione nel pacchetto caTools . La visualizzazione della guida su write.giffornisce alcuni esempi interessanti, tra cui un paio di animazioni, una con un esempio piuttosto piacevole che utilizza il set Mandelbrot.

Vedi anche qui e qui .

Controllo più preciso e animazioni più elaborate

C'è un pacchetto di animazione che sembra abbastanza capace. Non l'ho usato da solo, quindi non posso dare alcun vero consiglio in entrambi i casi.

Io ho visto un paio di buoni esempi di output da questo pacchetto e sembrano abbastanza piacevole. Forse uno dei "punti salienti" è la possibilità di incorporare un'animazione in un PDF.


Sembra funzionare. Sto principalmente cercando un trucco rapido e sporco da usare per le dimostrazioni in una classe che sto insegnando, ma se posso pubblicarlo su una pagina Web tanto meglio.
Michael Lugo,

Per il quarzo, è più veloce disegnare un rettangolo bianco sulla trama esistente e quindi ridisegnare le linee. Vedi tourr:animate_distper un esempio di questo approccio.
Hadley,

7

Un modo per procedere è utilizzare l'eccellente pacchetto di animazione di Yihui Xie. Ho caricato un esempio molto semplice sul mio account dropbox pubblico: densityplot (lo rimuoverò tra 3 giorni). E 'questo quello che stai cercando?

L'animazione è stata creata utilizzando il seguente codice 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")

5

Solo per completezza, se ne hai bisogno per una dimostrazione di classe, vorrei anche menzionare il manipulatepacchetto fornito con RStudio . Si noti che questo pacchetto dipende dall'interfaccia di RStudio, quindi non funzionerà al di fuori di esso.

manipulateè piuttosto interessante perché consente di creare rapidamente alcuni cursori per manipolare qualsiasi elemento della trama. Ciò consentirebbe di fare alcune dimostrazioni facili e in tempo reale in classe.

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

Altri esempi qui


4

Ecco un altro approccio:

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' )
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.