Mein Problem : Ich habe kürzlich einen Statistiker getroffen, der mir mitteilte, dass Splines nur zum Durchsuchen von Daten nützlich sind und einer Überanpassung unterliegen und daher für die Vorhersage nicht hilfreich sind. Er zog es vor, mit einfachen Polynomen zu erforschen ... Da ich ein großer Fan von Splines bin und dies meiner Intuition zuwiderläuft, möchte ich herausfinden, wie gültig diese Argumente sind und ob es eine große Gruppe von Anti-Spline- Aktivisten da draußen?
Hintergrund : Ich versuche, bei der Erstellung meiner Modelle Frank Harrell, Regressionsmodellierungsstrategien (1), zu folgen. Er argumentiert, dass eingeschränkte kubische Splines ein gültiges Werkzeug für die Untersuchung kontinuierlicher Variablen sind. Er argumentiert auch, dass die Polynome nicht in der Lage sind, bestimmte Beziehungen wie Schwellenwerte und Logarithmen zu modellieren (2). Um die Linearität des Modells zu testen, schlägt er einen ANOVA-Test für den Spline vor:
Ich habe wegen Überanpassung mit Splines gegoogelt, fand aber nicht viel hilfreich (abgesehen von allgemeinen Warnungen, dass nicht zu viele Knoten verwendet werden). In diesem Forum scheint es eine Vorliebe für Spline-Modellierung zu geben, Kolassa , Harrell , Gung .
Ich fand einen Blog-Beitrag über Polynome, den Teufel der Überanpassung , der über die Vorhersage von Polynomen spricht. Der Beitrag endet mit diesen Kommentaren:
In gewissem Maße handelt es sich bei den hier vorgestellten Beispielen um Betrug - die polynomiale Regression ist bekanntermaßen äußerst unrobust. In der Praxis ist es viel besser, Splines anstelle von Polynomen zu verwenden.
Dies veranlasste mich nun zu prüfen, wie sich Splines im folgenden Beispiel verhalten würden:
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"))
Gibt das folgende Bild:
Abschließend habe ich nicht viel gefunden, was mich davon überzeugen würde, Splines zu überdenken. Was fehle ich?
- FE Harrell, Regressionsmodellierungsstrategien: Mit Anwendungen auf lineare Modelle, logistische Regression und Überlebensanalyse, Softcover-Nachdruck von Hardcover 1. Aufl. 2001. Springer, 2010.
- FE Harrell, KL Lee und BG Pollock, "Regressionsmodelle in klinischen Studien: Bestimmung der Beziehungen zwischen Prädiktoren und Antwort", JNCI J Natl Cancer Inst, vol. 80, nein. 15, S. 1198–1202, Oktober 1988.
Aktualisieren
Die Kommentare ließen mich fragen, was innerhalb der Datenspanne passiert, aber mit unangenehmen Kurven. In den meisten Situationen überschreite ich nicht die Datengrenze, wie das obige Beispiel zeigt. Ich bin nicht sicher, ob dies als Vorhersage qualifiziert ist ...
Hier ist ein Beispiel, in dem ich eine komplexere Linie erstelle, die nicht in ein Polynom übersetzt werden kann. Da die meisten Beobachtungen im Mittelpunkt der Daten stehen, habe ich auch versucht, dies zu simulieren:
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)
Dies ergibt das folgende Diagramm:
Update 2
Seit diesem Beitrag habe ich einen Artikel veröffentlicht , der sich mit der Nichtlinearität des Alters in einem großen Datensatz befasst. Die Beilage vergleicht verschiedene Methoden und ich habe einen Blog-Beitrag darüber geschrieben .
quelle
Antworten:
Überanpassung entsteht durch das Zulassen einer zu großen Modellklasse. Bei Modellen mit kontinuierlichen Parametern (wie Splines und Polynomen) wird dies etwas schwierig. Wenn Sie jedoch die Parameter in eine Reihe unterschiedlicher Werte zerlegen, wird die Anzahl der verfügbaren Modelle exponentiell erhöht, wenn Sie die Anzahl der Knoten / Koeffizienten erhöhen . Für jeden Datensatz gibt es einen Spline und ein Polynom, die genau passen, solange Sie genügend Koeffizienten / Knoten zulassen. Es kann sein, dass ein Spline mit drei Knoten mehr passt als ein Polynom mit drei Koeffizienten, aber das ist kein fairer Vergleich.
Wenn Sie eine geringe Anzahl von Parametern und einen großen Datenbestand haben, können Sie sich ziemlich sicher sein, dass Sie nicht übermäßig fit sind. Wenn Sie eine höhere Anzahl von Parametern ausprobieren möchten, können Sie versuchen, innerhalb Ihres Testsets eine Kreuzvalidierung durchzuführen, um die beste Anzahl zu finden, oder Sie können ein Kriterium wie die Mindestbeschreibungslänge verwenden .
Der grundlegende Punkt hier ist der Kompromiss. Wenn ich ein Polynom a-Ordnung wähle (wie f (x) = 3,4), ist das Modell sehr einfach zu speichern, aber für die y-Werte speichere ich im Wesentlichen den Abstand zum Mittelwert. Mehr Koeffizienten ergeben ein besser passendes Polynom (und damit kürzere Codes für die y-Werte), aber ich muss mehr Bits für die Beschreibung des Modells aufwenden. Das Modell, mit dem Sie den kürzesten Code für Ihre Daten erhalten, entspricht dem MDL-Kriterium am besten.
(Beachten Sie, dass dies als "Roh-MDL" bezeichnet wird und Sie einige Verbesserungen vornehmen können, um verschiedene technische Probleme zu lösen.)
quelle
Statistiker haben sich schon seit langem über die Polynomanpassung gestritten, und meiner Erfahrung nach kommt es darauf an:
Splines sind im Grunde genommen eine Reihe verschiedener zusammengesetzter Gleichungen, die dazu neigen, die Genauigkeit interpolierter Werte auf Kosten der Fähigkeit zu erhöhen, außerhalb des Datenbereichs zu projizieren. Dies ist in Ordnung, wenn Sie wissen, dass Ihre Daten rein sind und aus einer konsistenten Quelle stammen, und wenn Sie versuchen, die Wahrscheinlichkeit des Vorhandenseins unterschiedlicher Werte innerhalb Ihres Wertebereichs zu beschreiben. In der Regel lernen wir jedoch nicht so viel über die theoretischen Grundlagen, auf denen unsere Daten basieren, da ein neuer Spline beginnt, wenn der alte Spline aufhört, die Daten genau zu beschreiben. Dies macht die Vorhersage von Werten außerhalb unserer Daten nahezu wertlos.
Splines sind in dieser Hinsicht nicht eindeutig. Polynomfunktionen haben tatsächlich das gleiche Problem, wenn wir nur die Daten anpassen und keinen theoretischen Rahmen für die Auswahl der Variablen verwenden. Diejenigen, die eine wohlgeformte Theorie haben, die bestimmt, welche Variablen variiert werden dürfen und um wie viel mehr Vertrauen in die Fähigkeit einer komplexen Polynomfunktion, Vorhersagen außerhalb der Daten zu extrapolieren.
Viele Statistiker arbeiten jedoch ohne Hilfe eines vorher festgelegten theoretischen Rahmens mit Daten, und dies treibt einige Menschen zu einfachen Polynomen. Sie begründen, dass eine weniger flexible Funktion, die zu den Daten passt, Werte außerhalb der Daten mit größerer Wahrscheinlichkeit genau vorhersagt, da es weniger wahrscheinlich ist, dass die Funktion durch Anomalien innerhalb der Daten beeinflusst wird. Während ich mit Leuten darüber gesprochen habe, die einfache Polynome bevorzugen, habe ich nie das Gefühl einer Anti-Spline-Gruppe bekommen. Es fühlt sich eher so an, als würden einige Statistiker durch einfache Polynome das Gefühl haben, Überanpassung zu vermeiden.
Haftungsausschluss
Persönlich neige ich nicht dazu, Splines oder einfache Polynome mit den meisten meiner Daten zu verwenden, da ich in einem Bereich mit vielen vorher festgelegten theoretischen Rahmenbedingungen arbeite. Außerdem habe ich in der Regel die Erfassung der Daten beobachtet und kann einen guten Überblick darüber bekommen, was die Ergebnisse beeinflusst hat. In diesem Fall baue ich eher einen logischen Algorithmus auf und teste die Eignung des Algorithmus, anstatt die Eignung einer Polynomfunktion zu testen. Sie können dieses Salzkorn zu meiner Antwort hinzufügen.
quelle