Birden fazla bilinmeyen düğüm ile parçalı doğrusal regresyon nasıl yapılır?


14

Çoklu düğümleri otomatik olarak algılayabilen parçalı doğrusal regresyon yapmak için herhangi bir paket var mı? Teşekkürler. Yapısal paketini kullandığımda. Değişim noktalarını tespit edemedim. Değişim noktalarını nasıl tespit ettiği hakkında hiçbir fikrim yok. Parsellerden, onları seçmeme yardımcı olabileceğim birkaç nokta olduğunu görebiliyordum. Burada bir örnek verilebilir mi?


1
Bu istatistik.stackexchange.com/questions/5700/… ile aynı soru gibi görünüyor . Önemli bir şekilde farklıysa, lütfen sorunuzu farklılıkları yansıtacak şekilde düzenleyerek bize bildirin; aksi takdirde, kopya olarak kapatacağız.
whuber

1
Soruyu düzenledim.
Honglang Wang

1
Bunu doğrusal olmayan bir optimizasyon problemi olarak yapabileceğinizi düşünüyorum. Sadece monte edilecek fonksiyonun denklemini, katsayılar ve düğüm yerleri ile parametreler olarak yazınız.
mark999

1
Bence segmentedpaket aradığınız şey.
AlefSin

1
Aynı sorun yaşadım, R'nin segmentedpaketiyle
farklı bir ben

Yanıtlar:


8

Misiniz MARS uygulanabilir? R'nin earthonu uygulayan paketi var.


8

Genel olarak, bir şeyi parça-bilge doğrusal olarak sığdırmak istemek biraz tuhaf. Ancak, bunu gerçekten yapmak istiyorsanız, MARS algoritması en doğrudan olanıdır. Her seferinde bir düğüm olan bir işlev oluşturacaktır; ve daha sonra aşırı uydurma ala karar ağaçlarıyla savaşmak için düğüm sayısını geri alır. MARS algotitmasına R ile earthveya üzerinden erişebilirsiniz mda. Genel olarak, şu ana kadar diğer bilgi kriterlerinden (AIC, BIC vb.) Kaldırılmayan GCV'ye uygundur.

Düğümler her seferinde bir tane yetiştirildiği için MARS size gerçekten "optimum" bir uyum vermeyecektir. Düğüm yerleşimlerinin olası permütasyonları hızla patlayacağından, gerçekten "optimal" bir düğüm sayısına uymak gerçekten zor olurdu.

Genellikle, bu nedenle insanlar spline'ları yumuşatmaya yönelirler. Çoğu düzleştirici spline kübiktir, böylece bir insan gözünü süreksizliklerin eksikliğini kandırabilirsiniz. Bununla birlikte, doğrusal bir düzeltme spline yapmak oldukça mümkün olacaktır. Yivleri düzleştirmenin en büyük avantajı, optimize edilecek tek parametreleridir. Bu, permütasyonlar arasında arama yapmak zorunda kalmadan gerçekten "optimal" bir çözüme hızlı bir şekilde ulaşmanızı sağlar. Ancak, gerçekten bükülme noktaları aramak istiyorsanız ve bunu yapmak için yeterli veriye sahipseniz, MARS gibi bir şey muhtemelen en iyi bahistir.

R'deki cezalandırılmış doğrusal düzleştirme spline'ları için bazı örnek kod:

require(mgcv);data(iris);
gam.test <- gam(Sepal.Length ~ s(Petal.Width,k=6,bs='ps',m=0),data=iris)
summary(gam.test);plot(gam.test);

Bununla birlikte, seçilen gerçek düğümlerin herhangi bir gerçek bükülme noktası ile ilişkili olması gerekmez.


3

Bunu birkaç yıl önce sıfırdan programladım ve bilgisayarımda parça halinde doğrusal regresyon yapmak için bir Matlab dosyam var. Yaklaşık 20 ölçüm noktası için yaklaşık 1 ila 4 kesme noktası hesaplanabilir. 5 veya 7 kesme noktası gerçekten çok fazla olmaya başlar.

Gördüğüm gibi saf matematiksel yaklaşım, sorunuzun altındaki yorumda bağlantılı soruda mbq kullanıcısı tarafından önerilen tüm olası kombinasyonları denemektir.

Takılan hatların hepsi ardışık ve bitişik (çakışma yok) olduğundan, birleştiriciler Paskal üçgenini takip edecektir. Hat bölümleri tarafından kullanılan veri noktaları arasında çakışmalar olsaydı, birleştiricilerin bunun yerine ikinci tür Stirling numaralarını izleyeceğine inanıyorum.

Aklımdaki en iyi çözüm, takılan hatların R ^ 2 korelasyon değerlerinin en düşük standart sapmasına sahip takılan hatların kombinasyonunu seçmektir. Bir örnekle açıklamaya çalışacağım. Verilerde kaç kırılma noktası bulunması gerektiğini sormanın, "Britanya sahili ne kadar sürer?" Sorusunu sormaya benzer olduğunu unutmayın. Benoit Mandelbrots'un (matematikçi) fraktallarla ilgili makalelerinde olduğu gibi. Ve kırılma noktası sayısı ile regresyon derinliği arasında bir denge vardır.

Şimdi örneğe bakalım.

Varsayalım ki bir fonksiyonu olarak mükemmel verisine sahibiz ( ve tamsayılardır):yxxy

xyR2line1R2line2sumofR2valuesstandarddeviationofR2111,0000,04001,04000,6788221,0000,01181,01180,6987331,0000,00041,00040,7067441,0000,00311,00310,7048551,0000,01351,01350,6974661,0000,02381,02380,6902771,0000,02771,02770,6874881,0000,02221,02220,6913991,0000,00931,00930,700410101,0001,9781,0000,70711190,97090,02710,99800,66731280,89510,11391,00900,55231370,77340,25581,02920,36591460,61340,43211,04550,12811550,43210,61341,04550,12821640,25580,77331,02910,36591730,11390,89511,00900,55231820,02720,97080,99800,667219101,0001,0000,70712020,00941,0001,00940,70042130,02221,0001,02220,69142240,02781,0001,02780,68742350,02391,0001,02390,69022460,01361,0001,01360,69742570,00321,0001,00320,70482680,00041,0001,00040,70682790,01181,0001,01180,698728100,041,0001,040,6788

Bu y değerleri şu grafiğe sahiptir:

idealize edilmiş veri

Açıkça iki kırılma noktası var. Argüman olarak R ^ 2 korelasyon değerlerini (Excel hücre formülleriyle (Avrupa nokta-virgül stili)) hesaplayacağız:

=INDEX(LINEST(B1:$B$1;A1:$A$1;TRUE;TRUE);3;1)
=INDEX(LINEST(B1:$B$28;A1:$A$28;TRUE;TRUE);3;1)

iki takılmış hattın çakışan olası tüm kombinasyonları için . Olası tüm R ^ 2 değer çiftlerinin grafiği vardır:

R ^ 2 değerleri

Soru, hangi çift R ^ 2 değerini seçmeliyiz ve başlıkta istendiği gibi birden fazla kırılma noktasına nasıl genelleme yapabiliriz? Bir seçenek, R-kare korelasyonunun toplamının en yüksek olduğu kombinasyonu seçmektir. Bunu çizerken, aşağıdaki üst mavi eğriyi elde ederiz:

R kare toplamı ve R kare standart sapması

R kare değerlerinin toplamı olan mavi eğri, ortadaki en yüksek değerdir. Bu, en yüksek değer olarak değerine sahip tablodan daha açık bir şekilde görülebilir . Bununla birlikte, kırmızı eğrinin minimumunun daha doğru olduğunu düşünüyorum. Yani, takılan regresyon hatlarının R ^ 2 değerlerinin standart sapmasının minimum değeri en iyi seçim olmalıdır.1,0455

Parça bilge doğrusal regresyon - Matlab - çoklu kırılma noktaları


1

Tomé ve Miranda'da (1984) açıklanan oldukça hoş bir algoritma var .

Önerilen metodoloji, kesme noktaları arasındaki minimum mesafe ve her kesme noktasındaki minimum eğilim değişikliği üzerindeki bir takım kısıtlamalara tabi olarak, belirli bir zaman serisine uyan en iyi sürekli düz çizgi kümesini hesaplamak için en küçük kareler yaklaşımını kullanır.

Kod ve GUI, Fortran ve IDL'de web sitelerinden edinilebilir: http://www.dfisica.ubi.pt/~artome/linearstep.html


0

... her şeyden önce bunu iterasyonlarla ve AIC AICc BIC Cp gibi bazı bilgilendirici kriterler altında yapmanız gerekir; çünkü "ideal" bir uyum elde edebilirsiniz, eğer düğüm sayısı K = veri noktası sayısı N ise, tamam. ... önce K = 0; L = K + 1 regresyonlarını tahmin edin, örneğin AICc'yi hesaplayın; ayrı bir segmentte minimum sayıda veri noktası olduğunu varsayın, diyelim ki L = 3 veya L = 4, tamam ... koymak K = 1; ilk düğüm olarak L-th verilerinden başlayın, SS veya MLE'yi hesaplayın ... ve bir sonraki veri noktasını bir düğüm, SS veya MLE olarak adım adım N-L verilerindeki son düğüme kadar; AICc'yi hesaplamak için en uygun (SS veya MLE) düzenlemeyi seçin ... ... koymak K = 2; ... önceki tüm regresyonları kullanın (SS veya MLE'dir), ancak tek bir segmenti olası tüm parçalara adım adım bölün ... AICc'yi hesaplamak için en uygun (SS veya MLE) düzenlemeyi seçin ... Son AICc bir öncekinden daha büyükse: yinelemeleri durdurun! Bu AICc kriteri altında en uygun çözümdür, tamam


AIC, BIC kullanılamaz, çünkü ekstra parametreler için cezalandırılırlar, bu durum burada böyle değildir.
HelloWorld

0

Bir keresinde Joinpoint adlı bir programla karşılaştım . Web sitelerinde "birleşme noktalarında birkaç farklı çizginin birbirine bağlandığı" bir birleşim noktası modeline uyduğunu söylüyorlar. Ve ayrıca: "Kullanıcı minimum ve maksimum birleşme noktası sayısını sağlar. Program, minimum birleşme noktası sayısıyla (örn. Düz bir çizgi olan 0 birleşme noktası) başlar ve daha fazla birleşim noktasının istatistiksel olarak anlamlı olup olmadığını ve modele eklenmesi gerekip gerekmediğini test eder. (bu maksimum sayıya kadar). "

NCI bunu kanser oranlarının trend modellemesi için kullanıyor, belki de ihtiyaçlarınıza uygun.


0

Verilere parçalı bir fonksiyon sığdırmak için:

resim açıklamasını buraya girin

burada yaklaşık olarak hesaplanacak bilinmeyen parametrelerdir, çok basit bir yöntem vardır (yinelemeli değil, ilk tahmin yok, herhangi bir matematik bilgisayar dilinde kodlanması kolay). Sayfa 29'da verilen teori: https://fr.scribd.com/document/380941024/Regression-par-morceaux-Piecewise-Regression-pdf ve sayfa 30:a1,a2,p1,q1,p2,q2,p3,q3

resim açıklamasını buraya girin

Örneğin, Mats Granvik tarafından sağlanan kesin verilerle sonuç şöyledir:

resim açıklamasını buraya girin

Dağınık veri olmadan, bu örnek çok anlamlı değildir. Dağılmış verilere sahip diğer örnekler, başvurulan makalede gösterilmiştir.


0

mcpÇıkarılacak değişiklik noktalarının sayısını biliyorsanız , paketi kullanabilirsiniz . Mükemmel modelleme esnekliği ve değişim noktaları ve regresyon parametreleri hakkında çok fazla bilgi verir, ancak hız pahasına.

Mcp web sitesi birçok uygulamalı örnek içerir, ör.

library(mcp)

# Define the model
model = list(
  response ~ 1,  # plateau (int_1)
  ~ 0 + time,    # joined slope (time_2) at cp_1
  ~ 1 + time     # disjoined slope (int_3, time_3) at cp_2
)

# Fit it. The `ex_demo` dataset is included in mcp
fit = mcp(model, data = ex_demo)

Ardından şunları görselleştirebilirsiniz:

plot(fit)

resim açıklamasını buraya girin

Veya özetleyin:

summary(fit)

Family: gaussian(link = 'identity')
Iterations: 9000 from 3 chains.
Segments:
  1: response ~ 1
  2: response ~ 1 ~ 0 + time
  3: response ~ 1 ~ 1 + time

Population-level parameters:
    name match  sim  mean lower  upper Rhat n.eff
    cp_1    OK 30.0 30.27 23.19 38.760    1   384
    cp_2    OK 70.0 69.78 69.27 70.238    1  5792
   int_1    OK 10.0 10.26  8.82 11.768    1  1480
   int_3    OK  0.0  0.44 -2.49  3.428    1   810
 sigma_1    OK  4.0  4.01  3.43  4.591    1  3852
  time_2    OK  0.5  0.53  0.40  0.662    1   437
  time_3    OK -0.2 -0.22 -0.38 -0.035    1   834

Yasal Uyarı: Ben mcp geliştiricisiyim.


Sorudaki "algıla" nın kullanılması, değişiklik noktalarının sayısını - hatta varlığını - önceden bilinmediğini gösterir.
whuber
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.