Verileri yumuşatma ve tekdüzeliği zorlama


14

Düzeltmek istediğim bazı verilerim var, böylece düzeltilmiş noktalar monoton olarak azalıyor. Verilerim keskin bir şekilde azalıyor ve daha sonra platoya başlıyor. İşte R'yi kullanan bir örnek

df <- data.frame(x=1:10, y=c(100,41,22,10,6,7,2,1,3,1))
ggplot(df, aes(x=x, y=y))+geom_line()

düzeltmek için veri grafiği

Kullanabileceğim iyi bir yumuşatma tekniği nedir? Ayrıca, 1. yumuşatılmış noktayı gözlemlenen noktama yakın olmaya zorlayabilirsem iyi olur.


1
Örnek değerlerinizin tamsayı olduğunu fark ettim. Gerçek değerleriniz önemli mi? Eğer öyleyse, (bu tekdüzeliğin bir garantisi olmasa da, böyle veriler için genellikle yine de verir), böyle bir şey yararlı olabilir:plot(y~x,data=df); f=fitted( glm( y~ns(x,df=4), data=df,family=quasipoisson)); lines(df$x,f)
Glen_b -Restate Monica

Yanıtlar:


18

Bunu , mgcv paketindeki mono.con()ve pcls()işlevleri aracılığıyla monotonite kısıtlamaları olan cezalandırılmış spline'ları kullanarak yapabilirsiniz . Yapılması gereken biraz uğraşma var, çünkü bu işlevler kullanıcı dostu değil , ancak adımlar, verdiğiniz örnek verilere uyacak şekilde değiştirilmiş, çoğunlukla örneğe dayanarak aşağıda gösterilmiştir :gam()?pcls

df <- data.frame(x=1:10, y=c(100,41,22,10,6,7,2,1,3,1))

## Set up the size of the basis functions/number of knots
k <- 5
## This fits the unconstrained model but gets us smoothness parameters that
## that we will need later
unc <- gam(y ~ s(x, k = k, bs = "cr"), data = df)

## This creates the cubic spline basis functions of `x`
## It returns an object containing the penalty matrix for the spline
## among other things; see ?smooth.construct for description of each
## element in the returned object
sm <- smoothCon(s(x, k = k, bs = "cr"), df, knots = NULL)[[1]]

## This gets the constraint matrix and constraint vector that imposes
## linear constraints to enforce montonicity on a cubic regression spline
## the key thing you need to change is `up`.
## `up = TRUE` == increasing function
## `up = FALSE` == decreasing function (as per your example)
## `xp` is a vector of knot locations that we get back from smoothCon
F <- mono.con(sm$xp, up = FALSE)   # get constraints: up = FALSE == Decreasing constraint!

Şimdi pcls()sığdırmak istediğimiz cezalandırılmış kısıtlanmış modelin ayrıntılarını içeren nesneyi doldurmamız gerekiyor

## Fill in G, the object pcsl needs to fit; this is just what `pcls` says it needs:
## X is the model matrix (of the basis functions)
## C is the identifiability constraints - no constraints needed here
##   for the single smooth
## sp are the smoothness parameters from the unconstrained GAM
## p/xp are the knot locations again, but negated for a decreasing function
## y is the response data
## w are weights and this is fancy code for a vector of 1s of length(y)
G <- list(X = sm$X, C = matrix(0,0,0), sp = unc$sp,
          p = -sm$xp, # note the - here! This is for decreasing fits!
      y = df$y,
          w = df$y*0+1)
G$Ain <- F$A    # the monotonicity constraint matrix
G$bin <- F$b    # the monotonicity constraint vector, both from mono.con
G$S <- sm$S     # the penalty matrix for the cubic spline
G$off <- 0      # location of offsets in the penalty matrix

Şimdi nihayet montajı yapabiliriz

## Do the constrained fit 
p <- pcls(G)  # fit spline (using s.p. from unconstrained fit)

pspline karşılık gelen temel fonksiyonlar için bir katsayı vektörü içerir. Takılan spline'ı görselleştirmek için, modelden x aralığında 100 konumda tahmin edebiliriz. Arsada güzel bir düzgün çizgi elde etmek için 100 değer yapıyoruz.

## predict at 100 locations over range of x - get a smooth line on the plot
newx <- with(df, data.frame(x = seq(min(x), max(x), length = 100)))

Kullandığımız tahmin edilen değerleri üretmek için Predict.matrix(), bir katsayı ile katsayıların ptakılan modelden tahmin edilen değerler vereceği şekilde bir matris üretir :

fv <- Predict.matrix(sm, newx) %*% p
newx <- transform(newx, yhat = fv[,1])

plot(y ~ x, data = df, pch = 16)
lines(yhat ~ x, data = newx, col = "red")

Bu aşağıdakileri üretir:

resim açıklamasını buraya girin

Verileri ggplot ile çizmek için düzenli bir forma sokmak size bırakacağım ...

Temel işlevinin boyutunu artırarak daha yakın bir oturmayı zorlayabilirsiniz (daha pürüzsüz olanın ilk veri noktasına uymasıyla ilgili sorunuzu kısmen yanıtlamak için) x. Örneğin, keşittir 8( k <- 8) ve yukarıdaki kodu yeniden

resim açıklamasını buraya girin

Sen itemezsiniz kbu veriler için çok daha yüksek ve uydurma üzerinde yaklaşık dikkatli olmak zorunda; tek pcls()şey kısıtlamalar ve verilen temel işlevler göz önüne alındığında cezalandırılmış en küçük kareler sorununu çözmek, sizin için pürüzsüzlük seçimi yapmıyor - bilmiyorum ...)

İnterpolasyon istiyorsanız ?splinefun, Hermite spline'larına ve monotoniklik kısıtlamalarına sahip kübik splinelara sahip temel R fonksiyonuna bakın . Ancak bu durumda veriler kesinlikle monotonik olmadığından kullanamazsınız.


Teşekkürler. Eminim çözümünüz uygun bir çözümdür, ama o kadar karmaşık ve şaşkın ki onu kullanamam. splinefunbenim ilk düşünce de (I interpolating ediyorum) ama spline(x=df$x, y=df$y, n=nrow(df), method="monoH.FC")ve spline(x=df$x, y=df$y, n=nrow(df), method="hyman")hem zam hataları
Ben

1
Sadece denerseniz, eminim kullanabilirsiniz; Burada kaputun altında neler olup bittiğiyle ilgili çok az fikrim var ama bunu hallettim ve bir şeyleri değiştirmek için ihtiyacınız olan yerleri belirttim. Tabii ki bazı R bildiğinizi varsayarsak . Ayrıntıların çoğu, yapmak istediğiniz her şeyin monoton olarak kısıtlanmış bir spline uyduğunu görmezden gelebileceğiniz uygulamadır. Her adımın ne yaptığını daha iyi vurgulamak için kodu biraz daha açıklamamı ister misiniz? İçindeki başvuru ?mono.con, yöntem hakkında daha fazla ayrıntıya sahiptir.
Monica'yı eski durumuna getirin - G. Simpson

Neden splinefunbir hata doğuruyor ise; Az önce fark ettim, kendisi monotonik olmayan verileri enterpolasyonlayan monotonik bir spline sığabilirsiniz. Gözlem de x = 6daha fazla bir açıdan olduğu ygözlemler o x = 5. Cevabın bu kısmını görmezden gelmeniz gerekecek :-)
Reinstate Monica - G. Simpson

Anladım. Ve gerek yok - Ben oldukça deneyimli bir R kullanıcısıyım. Sadece kullandığım şeyin arkasındaki matematiği anlamaktan hoşlanıyorum ve bu çözümün altında çok fazla şey olduğu görülüyor. Yardımın için tekrar teşekkürler.
Ben

Her şeyin ne olduğunu veya ne yaptığını açıklamak için bazı notlar ekledim; dikkat edilmesi gereken ana nokta, monotonluk kısıtlamalarının mono.conkübik bir spline için geri dönen bir dizi eşitsizlik kısıtlaması tarafından uygulanmakta olduğudur. ?pclsyukarıdakilerden daha az kullanıcı dostu olan, ancak bu tür spline türleri için matematik bilgisine sahipseniz matematiği biraz daha açığa çıkarabilecek ince plaka spline ve katkı modelleri için örnekler vardır (kendimi tanıdık değilim).
Monica'yı eski durumuna getirin - G. Simpson

13

Natalya Pya'nın son dolandırıcılık paketi ve Pya & Wood'un (2015) yazdığı "Şekil kısıtlamalı katkı modelleri" kağıdına dayanarak Gavin'in mükemmel cevabında bahsedilen sürecin bir parçası çok daha kolay olabilir.

library(scam)
con <- scam(y ~ s(x, k = k, bs = "mpd"), data = df)
plot(con)

Kullanabileceğiniz birkaç bs işlevi vardır - yukarıda "monotonik azalan P-spline" için mpd kullandım, ancak ayrıca veya ayrı ayrı veya monotonik kısıtlamaların yanı sıra konveksliği veya konkavlığı uygulayan işlevlere de sahiptir.

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.