Knoten setzen in natürlichen kubischen Splines in R

23

Ich habe Daten mit vielen korrelierten Features und möchte zunächst die Features mit einer reibungslosen Basisfunktion reduzieren, bevor ein LDA ausgeführt wird. Ich versuche, natürliche kubische Splines im splinesPaket mit der nsFunktion zu verwenden. Wie ordne ich die Knoten zu?

Hier ist der grundlegende R-Code:

library(splines)
lda.pred <- lda(y ~ ns(x, knots=5))

Aber ich habe keine Ahnung, wie ich die Knoten wählen soll ns.

Belmont
quelle
3
Fragen Sie, wie die Knoten in (dh über Argumente an ns ), oder nach Strategien, um zu entscheiden, wo die Knoten platziert werden sollen? R
Kardinal
1
Siehe Harrell, Regression Strategies 2015, für eine gute Diskussion darüber, wo die Knoten zu platzieren sind (es spielt keine Rolle, also sind Quantile so gut wie alles - Ausnahmen sind, wenn Sie stichhaltige Gründe für die Annahme haben, dass sich das Verhalten irgendwann ändert) und Anzahl der Knoten (3, 4 oder 5 je nach N)
Statistik

Antworten:

40

Wie man die Knoten in R angibt

Die nsFunktion generiert eine natürliche Regressions-Spline- Basis bei gegebenem Eingabevektor. Die Knoten können entweder über ein Freiheitsgradargument angegeben werden, dfdas eine Ganzzahl annimmt, oder über ein Knotenargument, knotsdas einen Vektor annimmt , der die gewünschte Platzierung der Knoten angibt . Beachten Sie, dass in dem Code, den Sie geschrieben haben

library(splines)
lda.pred <- lda(y ~ ns(x, knots=5))

Sie haben nicht fünf Knoten angefordert, sondern einen einzelnen (inneren) Knoten an Position 5 angefordert .

Wenn Sie das dfArgument verwenden, werden die inneren Knoten basierend auf den Quantilen des Vektors ausgewählt x. Zum Beispiel, wenn Sie anrufen

ns(x, df=5)

Dann wird die Basis zwei Randknoten und 4 innere Knoten enthalten, die am 20., 40., 60. bzw. 80. Quantil von xplatziert werden. Die Begrenzungsknoten werden standardmäßig auf die Min- und Max-Werte von gesetzt x.

Hier ist ein Beispiel, um die Positionen der Knoten anzugeben

x <- 0:100
ns(x, knots=c(20,35,50))

Wenn Sie stattdessen anrufen ns(x, df=4), erhalten Sie 3 interne Knoten an den Standorten 25, 50 bzw. 75.

Sie können auch angeben, ob Sie einen Abfangbegriff wünschen. Normalerweise wird dies nicht angegeben, da nses am häufigsten in Verbindung mit verwendet wird lm, das implizit einen Intercept einschließt (sofern dies nicht erzwungen wird). Wenn Sie intercept=TRUEin Ihrem Aufruf zu verwenden ns, stellen Sie sicher, dass Sie wissen, warum Sie dies tun. Wenn Sie dies tun und dann lmnaiv aufrufen , wird die Entwurfsmatrix am Ende einen Rangmangel aufweisen.

Strategien zum Platzieren von Knoten

Knoten werden am häufigsten an Quantilen platziert, wie das Standardverhalten von ns. Die Intuition ist, dass Sie, wenn viele Daten dicht beieinander gruppiert sind, möglicherweise mehr Knoten benötigen, um potenzielle Nichtlinearitäten in dieser Region zu modellieren. Dies bedeutet jedoch nicht, dass dies entweder (a) die einzige Wahl oder (b) die beste Wahl ist.

Andere Entscheidungen können natürlich getroffen werden und sind domänenspezifisch. Wenn Sie sich die Histogramme und Dichteschätzungen Ihrer Prädiktoren ansehen, erhalten Sie möglicherweise Hinweise darauf, wo Knoten erforderlich sind, es sei denn, Ihre Daten enthalten eine "kanonische" Auswahl.

In Bezug auf die Interpretation von Regressionen möchte ich darauf hinweisen, dass Sie zwar mit der Knotenplatzierung "herumspielen" können, sich jedoch darüber im Klaren sein sollten, dass Sie dafür eine Modellauswahlstrafe erleiden, die Sie sorgfältig auswerten und etwaige Schlussfolgerungen wie folgt anpassen sollten Ergebnis.

Kardinal
quelle
Vorausgesetzt x <- 0:100, die "richtige" Art und Weise, die Haltepunkte zu definieren, ist zu tun knots_x <- quantile(x, probs=c(.2, .35, .5)), was dann verwendet wird ns(x, knots=knots_x), um 3 interne Knoten an den Stellen 25, 50 bzw. 75 zu definieren. Was mich bei der Antwort verwirrt hat, war, dass ich erwartet hatte, die gewünschten Quantile in dem knotsArgument angeben zu müssen , während ich tatsächliche Werte aus dem xVektor
eingeben musste
Analyse von Gesundheitsumfragen, von Edward L. Korn, Barry I. Graubard, S.98, dass Durrleman und Simon (1989) (0.05.0.50.0.95) für natürliche Splines empfehlen
Chris