Spline temeli görselleştirme


18

Ders kitapları genellikle konuyu açıklarken tekdüze spline tabanının güzel örnek grafiklerine sahiptir. Doğrusal bir spline için bir dizi küçük üçgen veya kübik bir spline için bir dizi küçük hörgüç gibi bir şey.

Bu tipik bir örnektir:

http://support.sas.com/documentation/cdl/en/statug/63033/HTML/default/viewer.htm#statug_introcom_a0000000525.htm

Standart R fonksiyonlarını (bs veya ns gibi) kullanarak spline tabanını çizmenin kolay bir yolu olup olmadığını merak ediyorum. Sanırım basit bir matris aritmetiği, zarif bir şekilde spline tabanının güzel bir grafiğini çıkaran önemsiz bir R programı ile birleştirildi. Sadece düşünemiyorum!

Yanıtlar:


22

B-spline'larına örnek olarak şunu deneyin:

x <- seq(0, 1, by=0.001)
spl <- bs(x,df=6)
plot(spl[,1]~x, ylim=c(0,max(spl)), type='l', lwd=2, col=1, 
     xlab="Cubic B-spline basis", ylab="")
for (j in 2:ncol(spl)) lines(spl[,j]~x, lwd=2, col=j)

Bunu veriyoruz:

resim açıklamasını buraya girin


4
matplotSütunlar arasında döngü yapmak yerine işlevi kullanmak biraz daha etkilidir .
Greg Snow

Yani (+1), neden zihinsel araç setimden düşürdüğümü bilmiyorum.
jbowman

9

İşte "temel" sınıfı için bir autoplotyöntem (hem bs hem de ns'den miras alınır):

library(ggplot2)
library(magrittr)
library(reshape2)
library(stringr)
autoplot.basis <- function(basis, n=1000) {
    all.knots <- sort(c(attr(basis,"Boundary.knots") ,attr(basis, "knots"))) %>%
        unname
    bounds <- range(all.knots)
    knot.values <- predict(basis, all.knots) %>%
        set_colnames(str_c("S", seq_len(ncol(.))))
    newx <- seq(bounds[1], bounds[2], length.out = n+1)
    interp.values <- predict(basis, newx) %>%
        set_colnames(str_c("S", seq_len(ncol(.))))
    knot.df <- data.frame(x=all.knots, knot.values) %>%
        melt(id.vars="x", variable.name="Spline", value.name="y")
    interp.df <- data.frame(x=newx, interp.values) %>%
        melt(id.vars="x", variable.name="Spline", value.name="y")
    ggplot(interp.df) +
        aes(x=x, y=y, color=Spline, group=Spline) +
        geom_line() +
        geom_point(data=knot.df) +
        scale_color_discrete(guide=FALSE)
}

Bu sadece autoplotns veya bs nesnesini çağırmanızı sağlar . Jbowman'ın örneğini almak:

library(splines)
x <- seq(0, 1, by=0.001)
spl <- bs(x,df=6)
autoplot(spl)

hangi üretir:

Temel otoplot

Düzenleme: Bu, ggfortify paketinin sonraki sürümüne eklenecektir: https://github.com/sinhrks/ggfortify/pull/129 . Bundan sonra, ihtiyacınız olan tek şey olduğuna inanıyorum:

library(splines)
library(ggfortify)
x <- seq(0, 1, by=0.001)
spl <- bs(x,df=6)
autoplot(spl)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.