การทำเอฟเฟกต์ของการเปลี่ยนแปลงความกว้างเคอร์เนลใน R


10

ฉันมีข้อมูลบางอย่างใน R เก็บไว้ในรายการ คิด

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

แม้ว่านี่จะไม่ใช่ข้อมูลของฉัน ถ้าฉันแล้วป้อนคำสั่ง

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

จากนั้นฉันจะได้รับการประมาณความหนาแน่นของความน่าจะเป็นเคอร์เนลที่เคอร์เนลเป็นมาตรฐานปกติ ถ้าฉันแทนที่ 1 ด้วยตัวเลขอื่น ๆ แน่นอนว่าภาพเปลี่ยนไป

สิ่งที่ฉันต้องการจะทำคือการสร้างวิดีโอหรือภาพเคลื่อนไหวที่แต่ละเฟรมเป็นพล็อต แต่แบนด์วิดท์ของเคอร์เนลแตกต่างกันไปในแต่ละเฟรมดังนั้นจึงแสดงผลของการเปลี่ยนแบนด์วิดท์ ฉันจะทำสิ่งนี้ได้อย่างไร

(ฉันขอโทษถ้านี่ไม่ใช่สถานที่ที่เหมาะสมที่จะถามคำถามเกี่ยวกับอาร์)

คำตอบ:


11

ขึ้นอยู่กับว่าเป้าหมายสุดท้ายของคุณคืออะไร

แฮ็คที่รวดเร็วและสกปรกสำหรับการสาธิตตามเวลาจริง

ใช้Sys.sleep(seconds)ในการวนรอบที่secondsระบุจำนวนวินาทีระหว่างเฟรมเป็นตัวเลือกที่ทำงานได้ คุณจะต้องตั้งค่าxlimและylimพารามิเตอร์ในการโทรของคุณplotเพื่อให้สิ่งต่าง ๆ ทำงานตามที่คาดไว้

นี่คือตัวอย่างรหัสง่ายๆ

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

มันใช้งานได้ดีโดยเฉพาะอย่างยิ่งการใช้ X-Windows เป็นระบบหน้าต่าง ฉันพบว่า Mac quartz()ไม่เล่นได้ดีน่าเสียดาย

ภาพเคลื่อนไหว GIF

หากคุณต้องการบางสิ่งที่สามารถแจกจ่ายต่อโพสต์บนเว็บเพจ ฯลฯ ดูที่write.gifฟังก์ชันในแพ็คเกจcaTools การแสดงความช่วยเหลือเกี่ยวกับwrite.gifให้ตัวอย่างที่ดีหลายอย่างรวมถึงภาพเคลื่อนไหวสองสามภาพซึ่งเป็นตัวอย่างที่ค่อนข้างดีเมื่อใช้ชุด Mandelbrot

ดูเพิ่มเติมที่นี่และที่นี่

การควบคุมที่แม่นยำยิ่งขึ้นและภาพเคลื่อนไหวที่มีชีวิตชีวายิ่งขึ้น

มีแพ็คเกจแอนิเมชั่นที่มีความสามารถพอสมควร แม้ว่าฉันจะไม่ได้ใช้ด้วยตนเองดังนั้นฉันจึงไม่สามารถให้คำแนะนำที่แท้จริงได้

ฉันได้เห็นตัวอย่างที่ดีของผลลัพธ์จากแพ็กเกจนี้และพวกเขาดูดีมาก บางทีหนึ่งใน "ไฮไลท์" คือความสามารถในการฝังภาพเคลื่อนไหวใน PDF


ดูเหมือนว่าจะทำงาน ฉันส่วนใหญ่กำลังมองหาแฮ็คที่รวดเร็วและสกปรกเพื่อใช้ในการสาธิตในชั้นเรียนที่ฉันกำลังสอนอยู่ แต่ถ้าฉันสามารถโพสต์มันลงบนเว็บเพจได้ดีกว่ามาก
Michael Lugo

สำหรับควอตซ์มันจะเร็วกว่าในการวาดสี่เหลี่ยมสีขาวบนพล็อตที่มีอยู่แล้วเพิ่งวาดเส้นใหม่ ดูtourr:animate_distตัวอย่างของวิธีการนี้
hadley

7

วิธีหนึ่งที่จะไปคือใช้แพ็คเกจอนิเมชั่นที่ยอดเยี่ยมโดย Yihui Xie ฉันอัปโหลดตัวอย่างง่ายๆไปยังบัญชีดรอปบ็อกซ์สาธารณะของฉัน: densityplot (ฉันจะลบตัวอย่างนี้ใน 3 วัน) นี่คือสิ่งที่คุณกำลังมองหา?

ภาพเคลื่อนไหวถูกสร้างขึ้นโดยใช้รหัส 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

เพียงเพื่อประโยชน์ของความสมบูรณ์ถ้าคุณต้องนี้สำหรับการสาธิตระดับผมจะยังพูดถึงmanipulateแพคเกจที่มาพร้อมกับRStudio โปรดทราบว่าแพ็คเกจนี้ขึ้นอยู่กับอินเทอร์เฟซ RStudio ดังนั้นมันจะไม่ทำงานนอก

manipulateค่อนข้างเจ๋งเพราะมันช่วยให้สร้างสไลเดอร์บางอย่างเพื่อจัดการองค์ประกอบในพล็อต สิ่งนี้จะทำให้การสาธิตง่ายและเรียลไทม์ในชั้นเรียน

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

ตัวอย่างอื่น ๆที่นี่


4

นี่คือวิธีการอื่น:

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' )
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.