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 splines
Paket mit der ns
Funktion 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
.
Antworten:
Wie man die Knoten in R angibt
Die
ns
Funktion generiert eine natürliche Regressions-Spline- Basis bei gegebenem Eingabevektor. Die Knoten können entweder über ein Freiheitsgradargument angegeben werden,df
das eine Ganzzahl annimmt, oder über ein Knotenargument,knots
das einen Vektor annimmt , der die gewünschte Platzierung der Knoten angibt . Beachten Sie, dass in dem Code, den Sie geschrieben habenSie haben nicht fünf Knoten angefordert, sondern einen einzelnen (inneren) Knoten an Position 5 angefordert .
Wenn Sie das
df
Argument verwenden, werden die inneren Knoten basierend auf den Quantilen des Vektors ausgewähltx
. Zum Beispiel, wenn Sie anrufenDann wird die Basis zwei Randknoten und 4 innere Knoten enthalten, die am 20., 40., 60. bzw. 80. Quantil von
x
platziert werden. Die Begrenzungsknoten werden standardmäßig auf die Min- und Max-Werte von gesetztx
.Hier ist ein Beispiel, um die Positionen der Knoten anzugeben
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
ns
es am häufigsten in Verbindung mit verwendet wirdlm
, das implizit einen Intercept einschließt (sofern dies nicht erzwungen wird). Wenn Sieintercept=TRUE
in Ihrem Aufruf zu verwendenns
, stellen Sie sicher, dass Sie wissen, warum Sie dies tun. Wenn Sie dies tun und dannlm
naiv 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.
quelle
x <- 0:100
, die "richtige" Art und Weise, die Haltepunkte zu definieren, ist zu tunknots_x <- quantile(x, probs=c(.2, .35, .5))
, was dann verwendet wirdns(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 demknots
Argument angeben zu müssen , während ich tatsächliche Werte aus demx
Vektor