Parçalı bir doğrusal fonksiyondan verilerdeki değişim noktasını bulma


10

Selamlar,

Gözlenen alanın boyutunu ve büyük patlamadan bu yana geçen süreyi belirlemeye yardımcı olacak araştırmalar yapıyorum. Umarım yardımcı olabilirsiniz!

Üzerinde iki doğrusal regresyon gerçekleştirmek istediğim parçalı doğrusal bir işleve uygun veri var. Eğim ve kesişimin değiştiği bir nokta var ve bu noktayı bulmak için (bir program yazmam) gerekiyor.

Düşünceler?


3
Çapraz yayınlama politikası nedir? Aynı soru math.stackexchange.com'da da soruldu: math.stackexchange.com/questions/15214/…
mpiktas

Bu durumda basit doğrusal olmayan en küçük kareler yapmakta sorun nedir? Açık bir şey mi kaçırıyorum?
grg s

Değişim noktası parametresine göre hedef fonksiyonunun türevinin oldukça pürüzsüz olduğunu söyleyebilirim
Andre Holzner

Eğim o kadar değişecek ki, doğrusal olmayan en küçük kareler kısa ve kesin olmayacaktı. Bildiğimiz, iki veya daha fazla doğrusal modelimiz olduğu için bu iki modeli çıkarmak için grev yapmalıyız.
HelloWorld

Yanıtlar:


1

mcpPaket yapabilirsiniz. Verilerinizin

İlk olarak, bazı verileri simüle edelim:

df = data.frame(x = 1:100,
                y = c(rnorm(40, 10 + (1:40)*0.5),
                      rnorm(60, 10 + 40*0.5 -8 + (1:60)*0.2)))

Şimdi, değişiklik noktasını 40'ta (ve parametre değerlerinde) aşağıdakileri kullanarak kurtarabilir miyiz bakalım mcp:

model = list(
  y ~ 1 + x,  # linear segment
  ~ 1 + x  # another linear segment
)
library(mcp)
fit = mcp(model, df)

Çizin. Gri çizgiler uyumdan rastgele çekilir ve eğilimi yakaladığını gösterir. Mavi eğri, tahmini değişiklik noktası konumudur:

resim açıklamasını buraya girin

Tek tek parametre tahminlerini görelim. int_kesme işaretleri, x_x üzerindeki eğimlerdir ve cp_değişiklik noktalarıdır:

summary(fit)

Population-level parameters:
    name  mean lower upper Rhat n.eff
    cp_1 40.48 40.02 41.00    1  2888
   int_1 11.12  9.11 13.17    1   778
   int_2 21.72 20.09 23.49    1   717
 sigma_1  3.23  2.76  3.69    1  5343
     x_1  0.46  0.36  0.54    1   724
     x_2  0.21  0.16  0.26    1   754

Feragatname: Ben geliştiricisiyim mcp.


8

R paket yapılandırması size yardımcı olabilir. Skeçe bakın, benzer sorunların nasıl çözüleceği hakkında güzel bir genel bakış var.


6

Puan sayısı çok büyük değilse, tüm olasılıkları deneyebilirsiniz. Diyelim ki puanlarXben=(xben,yben) nerede ben=1,..,N-. Bundan sonra,j itibaren 2 için N--2 ve ikisine de iki çizgi sığdır {X1,...,Xj} ve {X(j+1),...,XN-}. Sonunda senj her iki hat için kare kalıntıların toplamı minimumdur.


Basit ama etkili önerinizi temel alarak bir yanıt gönderdim.
HelloWorld

5

Bu (çevrimdışı) bir değişiklik noktası algılama sorunudur. Bizim önceki tartışma dergi makaleleri ve R koduna başvurular sağlar. İlk önce Barry ve Hartigan'ın "ürün bölümü modeline" bakın, çünkü eğimdeki değişiklikleri idare eder ve etkili uygulamalara sahiptir.


3

Ayrıca bölümlere ayrılmış paket geçmişte benzer problemler konusunda bana yardımcı oldu.


Ne yazık ki, paket kırılma noktası için bir başlangıç ​​değerine ihtiyaç duyar.
HelloWorld

Ayrıca, segmentedsegmentler arasındaki kesişim-değişikliklerini modelleyemez - sadece ilk segment için bir kesişim.
Jonas Lindeløv

2

Tüm olasılıkları arayan MBQ'nun cevabı üzerine inşa ettim. Ayrıca, bunu:

  • Katsayıların önemli olduğundan emin olmak için iki parçalı modelin önemini kontrol edin
  • Tam model için kare artıkların toplamı arasındaki farkı kontrol edin
  • Modelimi görsel olarak onayla (saçma bir şey olmadığından emin ol)

Önemini neden kontrol etmeliyim? Çünkü parçalı modellerden herhangi biri verilere çok kötü uyuyorsa minimum SSE'ye sahip olan nokta anlamsızdır. Bu, eğimlerin değiştiği net bir kesme noktası olmadan yüksek derecede ilişkili iki değişken için olabilir.

Bu basit yaklaşımı kolay bir test senaryosuyla kontrol edelim:

x <- c(-50:50)
y <- abs(x)
plot(x,y,pch=19)

resim açıklamasını buraya girin

Kesme noktası sıfırdır. Aşağıdaki R komut dosyasını kullanın:

f <- function(x, y)
{
    d <- data.frame(x=x, y=y)
    d <- d[order(x),]
    r <- data.frame(k=rep(0,length(x)-4), sums=rep(0,length(x)-4))

    plm <- function(i)
    {
        d1 <- head(d,i)
        d2 <- tail(d,-i)

        # Make sure we've divided the region perfectly        
        stopifnot(nrow(d1)+nrow(d2) == nrow(d))

        m1 <- lm(y~x, data=d1)
        m2 <- lm(y~x, data=d2)

        r <- list(m1, m2)
        r
    }

    lapply(2:(nrow(d)-3), function(i)
    {
        r$k[i-2] <<- d[i,]$x

        # Fit two piecewise linear models
        m <- plm(i)

        # Add up the sum of squares for residuals
        r$sums[i-2] <<- sum((m[[1]]$residuals)^2) + sum((m[[2]]$residuals)^2)
    })

    b <- r[which.min(r$sums),]    
    b
}

Olası tüm kombinasyonlar için parçalı doğrusal modelleri takın:

f(x,y)
   k sums
   0    0

İki optimal model için katsayıları kontrol edersek, bunlar çok önemli olacaktır. R2 değerleri de çok yüksek olacaktır.

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.