Animieren des Effekts der Änderung der Kernelbreite in R.

10

Ich habe einige Daten in R, die in einer Liste gespeichert sind. Überlegen

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

obwohl dies nicht meine Daten sind. Wenn ich dann den Befehl eingebe

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

dann erhalte ich die Schätzung der Kernelwahrscheinlichkeitsdichte, wobei der Kernel Standardnormal ist. Wenn ich 1 durch andere Zahlen ersetze, ändert sich natürlich das Bild.

Was ich tun möchte, ist ein Video oder eine Animation zu erstellen, in der jeder Frame ein solches Diagramm ist, aber die Bandbreite des Kernels von Frame zu Frame variiert, wodurch der Effekt der Änderung der Bandbreite gezeigt wird. Wie kann ich das machen?

(Ich entschuldige mich, wenn dies nicht der richtige Ort ist, um Fragen zu R. zu stellen.)

Michael Lugo
quelle

Antworten:

11

Es hängt ein wenig davon ab, was Ihr Endziel ist.

Schneller und schmutziger Hack für Echtzeit-Demonstrationen

Die Verwendung Sys.sleep(seconds)in einer Schleife, in der secondsdie Anzahl der Sekunden zwischen Frames angegeben wird, ist eine praktikable Option. Sie müssen die Parameter xlimund ylimin Ihrem Aufruf festlegen , plotdamit sich die Dinge wie erwartet verhalten.

Hier ist ein einfacher Demonstrationscode.

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

Dies funktioniert ziemlich gut, insbesondere wenn X-Windows als Fenstersystem verwendet wird. Ich habe festgestellt, dass Macs quartz()leider nicht gut spielen.

Animierte GIFs

Wenn Sie etwas benötigen, das neu verteilt, auf einer Webseite usw. veröffentlicht werden kann, sehen Sie sich die write.gifFunktion im caTools- Paket an. Das Anzeigen der Hilfe auf write.gifenthält einige schöne Beispiele, darunter einige Animationen - eine mit einem sehr schönen Beispiel, das das Mandelbrot-Set verwendet.

Siehe auch hier und hier .

Feinere Steuerung und schickere Animationen

Es gibt ein Animationspaket , das ziemlich leistungsfähig aussieht. Ich habe es jedoch nicht selbst verwendet, daher kann ich keine wirklichen Empfehlungen geben.

Ich habe einige gute Beispiele für die Ausgabe dieses Pakets gesehen und sie sehen ziemlich gut aus. Vielleicht ist eines der "Highlights" die Möglichkeit, eine Animation in ein PDF einzubetten.

Kardinal
quelle
Das scheint zu funktionieren. Ich suche hauptsächlich nach einem schnellen und schmutzigen Hack für Demonstrationen in einer Klasse, die ich unterrichte, aber wenn ich ihn auf einer Webseite veröffentlichen kann, umso besser.
Michael Lugo
Bei Quarz ist es schneller, ein weißes Rechteck über das vorhandene Diagramm zu zeichnen und dann einfach die Linien neu zu zeichnen. Siehe tourr:animate_distals Beispiel für diesen Ansatz.
Hadley
7

Eine Möglichkeit besteht darin, das hervorragende Animationspaket von Yihui Xie zu verwenden. Ich habe ein sehr einfaches Beispiel in mein öffentliches Dropbox-Konto hochgeladen: Densityplot (ich werde dieses Beispiel in 3 Tagen entfernen). Suchst du danach?

Die Animation wurde mit dem folgenden R-Code erstellt:

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

Nur der Vollständigkeit halber würde ich, wenn Sie dies für eine Klassendemonstration benötigen, auch das manipulatePaket erwähnen , das mit RStudio geliefert wird . Beachten Sie, dass dieses Paket von der RStudio-Schnittstelle abhängig ist, sodass es außerhalb nicht funktioniert.

manipulateist ziemlich cool, weil es ermöglicht, schnell einige Schieberegler zu erstellen, um jedes Element im Plot zu manipulieren. Dies würde eine einfache Demonstration in Echtzeit im Unterricht ermöglichen.

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

Andere Beispiele hier

nico
quelle
4

Hier ist ein anderer Ansatz:

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
quelle