Knoten für ein GAM auswählen

9

Bei der Auswahl einer geeigneten Anzahl von Knoten für ein GAM sollte möglicherweise die Anzahl der Daten und Inkremente auf der x-Achse berücksichtigt werden.

Was ist, wenn wir 100 Inkremente auf der x-Achse mit 1000 Datenpunkten bei jedem Inkrement haben?

Die Info hier sagt:

Wenn sie nicht geliefert werden, werden die Knoten des Splines gleichmäßig über die Kovariatenwerte verteilt, auf die sich der Begriff bezieht: Wenn beispielsweise 101 Daten mit einem 11-Knoten-Spline von x angepasst werden, gibt es bei jedem 10. (geordnet) einen Knoten. x-Wert.

Ein grundlegender Start sollte in diesem Beispiel also 9 Knoten sein? Ich bin mir nur nicht sicher, welcher Knotenbereich für diesen Datensatz geeignet wäre, da es möglich ist, sehr kleine bis sehr große Zahlen anzupassen.

set.seed(1)
dat <- data.frame(y = rnorm(10000), x = 100)

library(ggplot)
ggplot(dat, aes(x = x, y = y)) + 
              geom_point(size= 0.5) +                      
stat_smooth(method = "gam", 
            formula = y ~ s(x, bs = "cs"),k=9, col = "black")

Wenn k = 25 eine nützliche Anpassung liefert, wäre es für diese Daten sinnvoll?

user1320502
quelle

Antworten:

12

Eine viel bessere Option besteht darin, Ihr Modell mit gam () in das mgcv-Paket einzupassen, das eine Methode namens Generalized Cross-Validation (GCV) enthält. GCV wählt automatisch die Anzahl der Knoten für Ihr Modell aus, damit die Einfachheit gegen die Erklärungskraft abgewogen wird. Wenn Sie gam () in mgcv verwenden, schalten Sie GCV ein, indem Sie k auf -1 setzen.

Genau wie dieser:

set.seed(1)
dat <- data.frame(y = rnorm(10000), x = rnorm(10000))

library(mgcv)
G1 <- gam(y ~ s(x, k = -1, bs = "cs"), data = dat)
summary(G1) # check the significance of your smooth term
gam.check(G1) # inspect your residuals to evaluate if the degree of smoothing is good

Um Ihre glatte Linie zu zeichnen, müssen Sie die Modellanpassung extrahieren. Dies sollte den Trick tun:

plot(y~x, data = dat, cex = .1)
G1pred <- predict(G1)
I1 <- order(dat$y)
lines(dat$x, G1pred)

Sie können k auch manuell anpassen und sehen, mit welcher Anzahl von k Sie dem von GCV automatisch festgelegten k-Wert am nächsten kommen.

Ira S.
quelle
Was macht der bs = "cs"Begriff im Spline?
user321627
1
"cs" gibt an, dass die Basis für die Glättung ein kubischer Spline sein soll.
Manuel Bickel
kEntspricht die Angabe nicht der Angabe k=-1?
Nakx
Ich bin mir nicht sicher, ob ich Nakx vollständig verstehe, aber ich werde klarstellen, dass k = -1 es dem Modell ermöglicht, eine optimale Anzahl von Knoten mithilfe der allgemeinen Kreuzvalidierung zu bestimmen. Durch manuelles Anpassen können Sie vergleichen, wie sich die Modellanpassung basierend auf der Anzahl der Knoten ändert. Das kann aufschlussreich sein und dazu beitragen, das Phänomen des Interesses darzustellen.
Ira S
+1 Tolle Antwort! Wie visualisieren Sie, wie sich der Spline herausstellte? Ich meine, der Graph der Koeffizienten?
Erosennin
5

Woher kommt die Idee, dass GCV automatisch die Anzahl der Knoten wählt? Die Anzahl der Knoten (dh die Basisabmessung) ist fest und kann während der Modellanpassung nicht geändert werden. Was der GCV-Score in der Funktion gam () "automatisch" tut, ist nicht die Auswahl der Basisdimension k, wie Ira S sagt, sondern die Auswahl des glatten Niveaus jedes Basis-Splines durch Einführung einer Wigliness-Strafe in den Minimierer oder das Anpassungsziel. Um die Anzahl der Knoten k zu wählen, sollten Sie einen Wert verwenden, der größer ist als die Anzahl der erwarteten Freiheitsgrade. Zitieren der Hilfe von wählen.k: "Die genaue Wahl von k ist im Allgemeinen nicht kritisch: Es sollte so gewählt werden, dass es groß genug ist, dass Sie sicher genug Freiheitsgrade haben, um die zugrunde liegende 'Wahrheit' einigermaßen gut, aber klein genug darzustellen angemessene Recheneffizienz aufrechtzuerhalten ". Erhöhen Sie also k in großen Schritten, bis Sie beispielsweise keine Änderungen in Ihrem Diagramm sehen. Zusammenfassend: Es gibt nichts Besseres als eine "automatische" Wahl für k, wie Ira S sagt, sollte der BenutzerWählen Sie immer einen Wert als Teil des Modelldesigns. Andernfalls passen Sie höchstwahrscheinlich nicht zu Ihrem Modell!

Nukimov
quelle
nur eine weitere Klärungsfrage. In der Paket-mgcv-Vignettendatei heißt es, k sei die Dimension der Basis von Variablen, von denen die Glättung eine Funktion ist. Bei der Verwendung von bs = "cr", den kubischen Regressionssplines, dachte ich, die Dimension der Basis sei 3. Das heißt, k = 3, wenn bs = "cr", habe ich mich geirrt?
vtshen
Fast richtig, aber nicht ganz. Was Sie sagen, wäre wahr, wenn ein Spline aus einem einzelnen Polynom 3. Grades bestehen würde, was nur ein Sonderfall eines Splines ist. Ein Spline ist eine Reihe von verketteten Polynomen (normalerweise mehr als eines). Die Basis-Splines, die zum Aufbau der Glättungs-Splines verwendet werden, bestehen aus vielen Polynomen, die sich auf den Knoten verbinden. Je mehr Knoten Sie haben, desto mehr Freiheitsgrade. Aus diesem Grund hängt k eng mit der Anzahl der Knoten zusammen, die im Buch von Simon Woods ausführlich beschrieben werden.
Nukimov