Mój problem : Niedawno spotkałem statystykę, który poinformował mnie, że splajny są przydatne tylko do eksploracji danych i podlegają nadmiernemu dopasowaniu, a zatem nie są przydatne w przewidywaniu. Wolał odkrywać za pomocą prostych wielomianów ... Ponieważ jestem wielkim fanem splajnów, a to wbrew mojej intuicji, jestem zainteresowany ustaleniem, jak ważne są te argumenty, a jeśli jest duża grupa anty-splajn- działacze tam?
Tło : Kiedy tworzę modele, staram się podążać za Frankiem Harrella, Strategie modelowania regresji (1). Twierdzi, że ograniczone splajny sześcienne są ważnym narzędziem do badania zmiennych ciągłych. Argumentuje również, że wielomiany słabo modelują pewne relacje, takie jak progi, logarytmika (2). Do przetestowania liniowości modelu sugeruje test ANOVA dla splajnu:
Zaszufladkowałem się za przeplatanie splajnami, ale nie znalazłem zbyt wiele przydatności (oprócz ogólnych ostrzeżeń o nie używaniu zbyt wielu węzłów). Na tym forum wydaje się preferowane modelowanie splajnu, Kolassa , Harrell , Gung .
Znalazłem jeden post na blogu o wielomianach, diabełu nadmiernego dopasowania, który mówi o przewidywaniu wielomianów. Post kończy się następującymi komentarzami:
W pewnym stopniu przykłady tu przedstawione są oszukiwaniem - wiadomo, że regresja wielomianowa jest wysoce niesolidna. Znacznie lepiej w praktyce jest używać splajnów niż wielomianów.
Teraz skłoniło mnie to do sprawdzenia, w jaki sposób splajny będą działać na przykładzie:
library(rms)
p4 <- poly(1:100, degree=4)
true4 <- p4 %*% c(1,2,-6,9)
days <- 1:70
set.seed(7987)
noise4 <- true4 + rnorm(100, sd=.5)
reg.n4.4 <- lm(noise4[1:70] ~ poly(days, 4))
reg.n4.4ns <- lm(noise4[1:70] ~ ns(days,4))
dd <- datadist(noise4[1:70], days)
options("datadist" = "dd")
reg.n4.4rcs_ols <- ols(noise4[1:70] ~ rcs(days,5))
plot(1:100, noise4)
nd <- data.frame(days=1:100)
lines(1:100, predict(reg.n4.4, newdata=nd), col="orange", lwd=3)
lines(1:100, predict(reg.n4.4ns, newdata=nd), col="red", lwd=3)
lines(1:100, predict(reg.n4.4rcs_ols, newdata=nd), col="darkblue", lwd=3)
legend("top", fill=c("orange", "red","darkblue"),
legend=c("Poly", "Natural splines", "RCS - ols"))
Daje następujący obraz:
Podsumowując, nie znalazłem wiele, co przekonałoby mnie do ponownego rozważenia splajnów, czego mi brakuje?
- FE Harrell, Strategie modelowania regresji: Z zastosowaniem modeli liniowych, regresji logistycznej i analizy przeżycia, przedruk miękkiej okładki w twardej oprawie, wydanie 1. 2001. Springer, 2010.
- FE Harrell, KL Lee i BG Pollock, „Modele regresji w badaniach klinicznych: określanie związków między predyktorami a odpowiedzią”, JNCI J Natl Cancer Inst, vol. 80, nr 15, s. 1198–1202, październik 1988 r.
Aktualizacja
Komentarze sprawiły, że zastanawiam się, co dzieje się w zakresie danych, ale z niewygodnymi krzywymi. W większości sytuacji nie wychodzę poza granice danych, jak pokazuje powyższy przykład. Nie jestem pewien, czy to kwalifikuje się jako prognoza ...
W każdym razie oto przykład, w którym tworzę bardziej złożoną linię, której nie można przetłumaczyć na wielomian. Ponieważ większość obserwacji znajduje się w centrum danych, próbowałem to również zasymulować:
library(rms)
cmplx_line <- 1:200/10
cmplx_line <- cmplx_line + 0.05*(cmplx_line - quantile(cmplx_line, .7))^2
cmplx_line <- cmplx_line - 0.06*(cmplx_line - quantile(cmplx_line, .3))^2
center <- (length(cmplx_line)/4*2):(length(cmplx_line)/4*3)
cmplx_line[center] <- cmplx_line[center] +
dnorm(6*(1:length(center)-length(center)/2)/length(center))*10
ds <- data.frame(cmplx_line, x=1:200)
days <- 1:140/2
set.seed(1234)
sample <- round(rnorm(600, mean=100, 60))
sample <- sample[sample <= max(ds$x) &
sample >= min(ds$x)]
sample_ds <- ds[sample, ]
sample_ds$noise4 <- sample_ds$cmplx_line + rnorm(nrow(sample_ds), sd=2)
reg.n4.4 <- lm(noise4 ~ poly(x, 6), data=sample_ds)
dd <- datadist(sample_ds)
options("datadist" = "dd")
reg.n4.4rcs_ols <- ols(noise4 ~ rcs(x, 7), data=sample_ds)
AIC(reg.n4.4)
plot(sample_ds$x, sample_ds$noise4, col="#AAAAAA")
lines(x=ds$x, y=ds$cmplx_line, lwd=3, col="black", lty=4)
nd <- data.frame(x=ds$x)
lines(ds$x, predict(reg.n4.4, newdata=ds), col="orange", lwd=3)
lines(ds$x, predict(reg.n4.4rcs_ols, newdata=ds), col="lightblue", lwd=3)
legend("bottomright", fill=c("black", "orange","lightblue"),
legend=c("True line", "Poly", "RCS - ols"), inset=.05)
To daje następujący wykres:
Aktualizacja 2
Od tego postu opublikowałem artykuł, który analizuje nieliniowość ze względu na wiek na dużym zestawie danych. Suplement porównuje różne metody i napisałem o nim post na blogu .
źródło
Odpowiedzi:
Nadmierne dopasowanie wynika z dopuszczenia zbyt dużej klasy modeli. Jest to nieco trudne w przypadku modeli z ciągłymi parametrami (takimi jak splajny i wielomiany), ale jeśli zdyskretyzujesz parametry na pewną liczbę różnych wartości, zobaczysz, że zwiększenie liczby węzłów / współczynników zwiększy wykładniczo liczbę dostępnych modeli . Dla każdego zestawu danych jest splajn i wielomian, który jest dokładnie dopasowany, o ile pozwalasz na wystarczającą liczbę współczynników / węzłów. Może być tak, że splajn z trzema węzłami jest większy niż wielomian z trzema współczynnikami, ale nie jest to uczciwe porównanie.
Jeśli masz niską liczbę parametrów i duży zestaw danych, możesz być całkiem pewny, że nie jesteś przeregulowany. Jeśli chcesz wypróbować większą liczbę parametrów, możesz spróbować przeprowadzić krzyżową weryfikację w zestawie testów, aby znaleźć najlepszą liczbę, lub możesz zastosować kryterium takie jak Minimalna długość opisu .
EDYCJA : Zgodnie z żądaniem w komentarzach, przykład zastosowania MDL. Najpierw musisz poradzić sobie z faktem, że Twoje dane są ciągłe, więc nie mogą być reprezentowane w skończonym kodzie. Dla uproszczenia podzielimy przestrzeń danych na pola boczne i zamiast opisywać punkty danych, opiszemy pola, do których należą dane. Oznacza to, że tracimy trochę dokładności, ale możemy uczynić dowolnie małym, więc nie ma to większego znaczenia.ϵϵ ϵ
Teraz zadaniem jest opisanie zestawu danych tak zwięźle, jak to możliwe za pomocą jakiegoś wielomianu. Najpierw opiszemy wielomian. Jeśli jest to wielomian n-tego rzędu, wystarczy przechowywać współczynniki (n + 1). Ponownie musimy zdyskretować te wartości. Następnie musimy najpierw zapisać wartość w kodowaniu bez prefiksu (więc wiemy, kiedy przestać czytać), a następnien + 1n n+1 wartości parametrów. Dzięki tym informacjom odbiorca naszego kodu może przywrócić wielomian. Następnie dodajemy resztę informacji wymaganych do przechowywania zestawu danych. Dla każdego punktu danych podajemy wartość x, a następnie ile pól w górę lub w dół punkt danych leży poza wielomianem. Obie wartości przechowujemy w kodowaniu bez prefiksów, dzięki czemu krótkie wartości wymagają kilku bitów i nie będziemy potrzebować ograniczników między punktami. (Możesz skrócić kod dla wartości x, przechowując tylko przyrosty między wartościami)
Podstawowym punktem jest tutaj kompromis. Jeśli wybiorę wielomian rzędu (jak f (x) = 3,4), wówczas model jest bardzo prosty do przechowywania, ale dla wartości y zasadniczo przechowuję odległość do średniej. Więcej współczynników daje mi lepiej dopasowany wielomian (a zatem krótsze kody dla wartości y), ale muszę wydać więcej bitów na opisanie modelu. Model, który daje najkrótszy kod dla twoich danych, najlepiej pasuje do kryterium MDL.
(Należy pamiętać, że jest to znane jako „surowy MDL” i można wprowadzić pewne udoskonalenia w celu rozwiązania różnych problemów technicznych).
źródło
Statystycy od wieków spierają się o dopasowanie wielomianowe, a z mojego doświadczenia wynika, że:
Splajny to w zasadzie szereg różnych równań poskładanych razem, co ma tendencję do zwiększania dokładności interpolowanych wartości kosztem możliwości rzutowania poza zakres danych. Jest to w porządku, jeśli wiesz, że Twoje dane są czyste i pochodzą ze spójnego źródła i jeśli próbujesz opisać prawdopodobieństwo obecności różnych wartości w swoim zakresie wartości. Jednak zwykle nie dowiadujemy się zbyt wiele o teoretycznych podstawach napędzających nasze dane, ponieważ nowy splajn rozpoczyna się, gdy stary splajn przestaje dokładnie opisywać dane. To sprawia, że przewidywanie wartości poza naszymi danymi jest prawie bezwartościowe.
Teraz splajny nie są pod tym względem wyjątkowe. Funkcje wielomianowe faktycznie cierpią z powodu tego samego problemu, jeśli po prostu dopasowujemy dane i nie używamy teoretycznych ram do wyboru zmiennych. Ci, którzy mają dobrze uformowaną teorię, sterującą zmiennymi, które pozwalają zmieniać, i o ile bardziej ufają zdolności złożonej funkcji wielomianowej do ekstrapolacji prognoz poza dane.
Jednak wielu statystyk pracuje z danymi bez pomocy wcześniej ustalonych ram teoretycznych, co popycha niektórych ludzi do prostych wielomianów. Powodują, że mniej elastyczna funkcja, która pasuje do danych, jest bardziej prawdopodobne, aby dokładnie przewidzieć wartości poza danymi, ponieważ funkcja ta jest mniej podatna na anomalie w danych. Podczas gdy rozmawiałem na ten temat z ludźmi, którzy wolą proste wielomiany, nigdy nie miałem poczucia grupy anty-splajnowej. To bardziej przypomina proste wielomiany, które sprawiają, że niektórzy statystycy czują się bardziej komfortowo, unikając przeregulowania.
Zrzeczenie się
Osobiście nie używam splajnów ani prostych wielomianów z większością moich danych, ponieważ pracuję w polu z wieloma wcześniej ustalonymi ramami teoretycznymi. Ponadto zwykle obserwowałem gromadzenie danych i mogę dobrze zrozumieć, co było przyczyną wyników. W takim przypadku buduję raczej algorytm logiczny i testuję jego sprawność, zamiast testować sprawność funkcji wielomianowej. Możesz dodać to ziarno soli do mojej odpowiedzi.
źródło