Jak wykonać częściową regresję liniową z wieloma nieznanymi węzłami?

14

Czy są jakieś pakiety do częściowej regresji liniowej, które mogą automatycznie wykrywać wiele węzłów? Dzięki. Kiedy korzystam z pakietu strucchange. Nie mogłem wykryć punktów zmiany. Nie mam pojęcia, jak wykrywa punkty zmiany. Na podstawie wykresów widziałem, że jest kilka punktów, które mogą pomóc mi je wybrać. Czy ktoś mógłby podać tutaj przykład?

Honglang Wang
źródło
1
To wydaje się być takie samo pytanie jak stats.stackexchange.com/questions/5700/… . Jeśli różni się w znaczący sposób, daj nam znać, edytując swoje pytanie, aby odzwierciedlić różnice; w przeciwnym razie zamkniemy go jako duplikat.
whuber
1
Zredagowałem pytanie.
Honglang Wang
1
Myślę, że możesz to zrobić jako nieliniowy problem optymalizacji. Wystarczy napisać równanie funkcji, która ma być dopasowana, ze współczynnikami i położeniami węzłów jako parametrami.
mark999
1
Myślę, że segmentedpakiet jest tym, czego szukasz.
AlefSin
1
Miałem identyczny problem, rozwiązałem go z segmentedpakietem R : stackoverflow.com/a/18715116/857416
inny ben

Odpowiedzi:

8

Ogólnie rzecz biorąc, trochę dziwne jest dopasowanie czegoś jako liniowego kawałka. Jednak jeśli naprawdę chcesz to zrobić, algorytm MARS jest najbardziej bezpośredni. Będzie budować funkcję jeden węzeł na raz; a następnie zwykle przycina liczbę węzłów, aby zwalczyć nadmiernie ala drzewa decyzyjne. Możesz uzyskać dostęp do algorytmu MARS w R za pośrednictwem earthlub mda. Ogólnie rzecz biorąc, jest on zgodny z GCV, który nie jest tak daleko od pozostałych kryteriów informacyjnych (AIC, BIC itp.)

MARS tak naprawdę nie zapewni ci „optymalnego” dopasowania, ponieważ węzły są hodowane pojedynczo. Naprawdę trudno byłoby dopasować naprawdę „optymalną” liczbę węzłów, ponieważ możliwe kombinacje umieszczania węzłów szybko by wybuchły.

Ogólnie dlatego ludzie zwracają się w kierunku wygładzania splajnów. Większość wygładzających splajnów ma kształt sześcienny, dzięki czemu można oszukać ludzkie oko, by nie zauważył nieciągłości. Byłoby jednak możliwe wykonanie liniowego wygładzania splajnu. Dużą zaletą wygładzania splajnów jest ich pojedynczy parametr do optymalizacji. To pozwala szybko osiągnąć naprawdę „optymalne” rozwiązanie bez konieczności przeszukiwania mnóstwa permutacji. Jeśli jednak naprawdę chcesz szukać punktów przegięcia i masz wystarczająco dużo danych, aby to zrobić, prawdopodobnie najlepszym rozwiązaniem byłby MARS.

Oto przykładowy kod karanych wygładzaniem liniowym splajnów w R:

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);

Rzeczywiste wybrane węzły niekoniecznie korelują z żadnym prawdziwym punktem przegięcia.

Shea Parkes
źródło
3

Kilka lat temu zaprogramowałem to od zera i mam plik Matlab do wykonywania regresji liniowej na komputerze. Około 1 do 4 punktów przerwania jest obliczeniowo możliwe dla około 20 punktów pomiaru. 5 lub 7 punktów przerwania zaczyna być naprawdę za dużo.

Podejście czysto matematyczne, jak widzę, polega na wypróbowaniu wszystkich możliwych kombinacji, jak sugeruje użytkownik mbq w pytaniu powiązanym z komentarzem pod twoim pytaniem.

Ponieważ wszystkie dopasowane linie są kolejne i przylegają do siebie (bez nakładania się), kombinatoryka podąży za trójkątem Paskal. Gdyby segmenty linii nakładały się między wykorzystanymi punktami danych, uważam, że kombinatoryka podążyłaby za liczbami Stirlinga drugiego rodzaju.

Moim zdaniem najlepszym rozwiązaniem jest wybór kombinacji dopasowanych linii, która ma najniższe odchylenie standardowe wartości korelacji R ^ 2 dopasowanych linii. Spróbuję wyjaśnić na przykładzie. Pamiętaj jednak, że pytanie, ile punktów przerwania należy znaleźć w danych, jest podobne do pytania „Jak długie jest wybrzeże Wielkiej Brytanii?” jak w jednym z artykułów Benoita Mandelbrotsa (matematyka) na temat fraktali. I istnieje kompromis między liczbą punktów przerwania a głębokością regresji.

Teraz do przykładu.

Załóżmy, że mamy idealne dane w funkcji ( i są liczbami całkowitymi):x x yyxxy

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

Te wartości y mają wykres:

wyidealizowane dane

Który ma wyraźnie dwa punkty przerwania. Dla celów argumentu obliczymy wartości korelacji R ^ 2 (z formułami komórek Excela (europejski styl przecinek-kropka)):

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

dla wszystkich możliwych nie nakładających się kombinacji dwóch dopasowanych linii. Wszystkie możliwe pary wartości R ^ 2 mają wykres:

Wartości R ^ 2

Pytanie brzmi, którą parę wartości R ^ 2 powinniśmy wybrać i jak uogólnić do wielu punktów przerwania, jak podano w tytule? Jednym wyborem jest wybór kombinacji, dla której suma korelacji R-kwadrat jest najwyższa. Kreśląc to, otrzymujemy górną niebieską krzywą poniżej:

suma R do kwadratu i odchylenie standardowe R do kwadratu

Niebieska krzywa, suma wartości R-kwadrat, jest najwyższa pośrodku. Jest to lepiej widoczne z tabeli o wartości jako najwyższej wartości. Jednak moim zdaniem minimum czerwonej krzywej jest dokładniejsze. To znaczy, minimalne odchylenie standardowe wartości R ^ 2 dopasowanych linii regresji powinno być najlepszym wyborem.1,0455

Regresja liniowa według kawałków - Matlab - wiele punktów przerwania

Mats Granvik
źródło
1

Istnieje całkiem niezły algorytm opisany w Tomé i Miranda (1984) .

Proponowana metodologia wykorzystuje podejście najmniejszych kwadratów do obliczenia najlepszego ciągłego zestawu linii prostych, które pasują do danego szeregu czasowego, z zastrzeżeniem szeregu ograniczeń dotyczących minimalnej odległości między punktami przerwania i minimalnej zmiany trendu w każdym punkcie przerwania.

Kod i GUI są dostępne zarówno w Fortran, jak i IDL na ich stronie internetowej: http://www.dfisica.ubi.pt/~artome/linearstep.html

arkaia
źródło
0

... przede wszystkim musisz to zrobić iteracyjnie i pod pewnymi kryteriami informacyjnymi, takimi jak AIC AICc BIC Cp; ponieważ można uzyskać „idealne” dopasowanie, jeśli liczba węzłów K = liczba punktów danych N, ok. ... najpierw wstaw K = 0; oszacuj L = K + 1 regresji, oblicz na przykład AICc; następnie załóż minimalną liczbę punktów danych w oddzielnym segmencie, powiedzmy L = 3 lub L = 4, ok ... wstaw K = 1; zacznij od L-tych danych jako pierwszego węzła, oblicz SS lub MLE, ... i krok po kroku następny punkt danych jako węzeł, SS lub MLE, aż do ostatniego węzła na danych N-L; wybierz układ z najlepszym dopasowaniem (SS lub MLE) oblicz AICc ... ... wstaw K = 2; ... użyj wszystkich poprzednich regresji (to jest ich SS lub MLE), ale krok po kroku podziel jeden segment na wszystkie możliwe części ... wybierz układ z najlepszym dopasowaniem (SS lub MLE) oblicz AICc ... jeśli ostatni AICc występuje wyżej niż poprzedni: zatrzymaj iteracje! To optymalne rozwiązanie zgodnie z kryterium AICc, ok

Maciek
źródło
AIC, BIC nie mogą być używane, ponieważ są karane za dodatkowe parametry, co oczywiście nie ma miejsca w tym przypadku.
HelloWorld,
0

Kiedyś natknąłem się na program o nazwie Joinpoint . Na swojej stronie internetowej mówią, że pasuje to do modelu punktów łączenia, w którym „kilka różnych linii jest połączonych razem w„ punktach połączenia ”. I dalej: „Użytkownik podaje minimalną i maksymalną liczbę punktów łączenia. Program rozpoczyna się od minimalnej liczby punktów łączenia (np. 0 punktów łączenia, co jest linią prostą) i sprawdza, czy więcej punktów łączenia jest statystycznie znaczących i należy je dodać do modelu (do tej maksymalnej liczby). ”

NCI używa go do modelowania trendów wskaźników zachorowań na raka, być może pasuje to również do twoich potrzeb.

psj
źródło
0

Aby dopasować do danych, funkcja kawałkowa:

wprowadź opis zdjęcia tutaj

a1,a2,p1,q1,p2,q2,p3,q3

wprowadź opis zdjęcia tutaj

Na przykład, przy dokładnych danych dostarczonych przez Mats Granvik, wynik jest następujący:

wprowadź opis zdjęcia tutaj

Bez rozproszonych danych ten przykład nie jest bardzo znaczący. Inne przykłady z rozproszonymi danymi pokazano w odnośniku.

JJacquelin
źródło
0

Możesz skorzystać z mcppakietu, jeśli znasz liczbę punktów zmiany do wnioskowania. Daje to dużą elastyczność modelowania i wiele informacji o punktach zmiany i parametrach regresji, ale kosztem szybkości.

Witryna mcp zawiera wiele zastosowanych przykładów, np.

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)

Następnie możesz wizualizować:

plot(fit)

wprowadź opis zdjęcia tutaj

Lub podsumuj:

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

Oświadczenie: Jestem programistą mcp.

Jonas Lindeløv
źródło
Użycie słowa „wykryj” w pytaniu wskazuje, że liczba - a nawet istnienie - punktów wymiany nie jest wcześniej znana.
whuber