Beachten Sie, dass von R-3.4.0 (2017-04-21), smooth.spline
direkte Spezifikation von λ
durch ein neu hinzugefügtes Argument lambda
akzeptiert werden kann. Aber es wird immer noch während der Schätzung in das interne spar
konvertiert werden. Die folgende Antwort ist also nicht betroffen.
Parameter λ
/spar
liegt in der Mitte der Glättesteuer
Glätte durch Glättungsparameter λ
gesteuert Glättung. smooth.spline()
verwendet einen internen Glättungsparameter spar
anstatt λ
:
spar = s0 + 0.0601 * log(λ)
Solche Logarithmus-Transformation erforderlich ist, um unbeschränkte Minimierung zu tun, wie GCV/CV. Der Benutzer kann spar
angeben, um indirekt λ
anzugeben. Wenn spar
linear wächst, wird λ
exponentiell wachsen. Daher ist es selten notwendig, einen großen spar
Wert zu verwenden.
der Freiheitsgrad df
wird auch in Bezug auf λ
definiert:
wo X
die Modellmatrix mit B-Spline-Basis und S
ist die Strafe Matrix.
Sie können einen Scheck über ihre Beziehungen mit Ihren Daten-Set haben:
spar <- seq(1, 2.5, by = 0.1)
a <- sapply(spar, function (spar_i) unlist(smooth.spline(x, y, all.knots=TRUE, spar = spar_i)[c("df","lambda")]))
Lassen Sie uns Skizze df ~ spar
, λ ~ spar
und log(λ) ~ spar
:
par(mfrow = c(1,3))
plot(spar, a[1, ], type = "b", main = "df ~ spar",
xlab = "spar", ylab = "df")
plot(spar, a[2, ], type = "b", main = "lambda ~ spar",
xlab = "spar", ylab = "lambda")
plot(spar, log(a[2,]), type = "b", main = "log(lambda) ~ spar",
xlab = "spar", ylab = "log(lambda)")
Notiere die radikale Wachstum von λ
mit spar
, die lineare Beziehung zwischen log(λ)
und spar
, und die relativ glatte Beziehung zwischen df
und spar
.
smooth.spline()
passend Iterationen für spar
Wenn wir den Wert manuell von spar
, wie angeben, was wir in den sapply()
haben, wird keine Pass Iterationen für die Auswahl spar
getan; ansonsten muss smooth.spline()
eine Anzahl von spar
Werten durchlaufen. Wenn wir
- angeben
cv = TRUE/FALSE
, Fitting Iterationen zielt darauf ab, CV/GCV-Score zu minimieren;
- angeben
df = mydf
, passt Iterationen zu minimieren (df(spar) - mydf)^2
.
Minimierung von GCV ist einfach zu folgen. Wir kümmern uns nicht um den GCV-Score, aber kümmern Sie sich um die entsprechenden spar
. Im Gegenteil, wenn wir (df(spar) - mydf)^2
minimieren, interessiert uns oft der df
Wert am Ende der Iteration und nicht spar
! Wenn wir jedoch bedenken, dass dies ein Minimierungsproblem ist, können wir niemals garantieren, dass der endgültige df
unserem Zielwert mydf
entspricht.
Warum setzen Sie df = 3
, aber df = 9.864?
Das Ende der Iteration erhalten, könnte entweder impliziert ein Minimum schlagen oder Such Grenze erreicht oder die maximale Anzahl von Iterationen erreicht.
Wir sind weit von der maximalen Iterationsgrenze entfernt (Standard 500); Aber wir treffen nicht das Minimum. Nun, wir könnten die Grenze erreichen.
Konzentrieren Sie sich nicht auf df
, denken Sie an spar
.
smooth.spline(x, y, all.knots=TRUE, df=3)$spar # 1.4999
Nach ?smooth.spline
, standardmäßig smooth.spline()
sucht spar
zwischen [-1.5, 1.5]
. Das heißt, wenn Sie df = 3
setzen, endet die Minimierung an der Suchgrenze, anstatt df = 3
zu treffen.
Sehen Sie sich noch einmal unser Diagramm der Beziehung zwischen df
und spar
an. Aus der Abbildung sieht es so aus, dass wir in der Nähe von 2 einen Wert von spar
benötigen, um df = 3
zu ergeben.
Lassen Sie uns die Verwendung control.spar
Argument:
fit <- smooth.spline(x, y, all.knots=TRUE, df=3, control.spar = list(high = 2.5))
# Smoothing Parameter spar= 1.859066 lambda= 0.9855336 (14 iterations)
# Equivalent Degrees of Freedom (Df): 3.000305
Jetzt sehen Sie, beenden Sie mit df = 3
auf. Und wir brauchen eine spar = 1.86
.
einen besseren Vorschlag: nicht all.knots = TRUE
Schauen Verwenden Sie, haben Sie 1000 Daten. Mit all.knots = TRUE
werden Sie 1000 Parameter verwenden.Mit df = 3
zu enden bedeutet, dass 997 von 1000 Parametern unterdrückt werden. Stellen Sie sich vor, wie groß ein λ
also spar
Sie brauchen!
Verwenden Sie stattdessen den penimierten Regressions-Spline. Unterdrückende 200 Parameter 3 ist auf jeden Fall viel einfacher:
fit <- smooth.spline(x, y, nknots = 200, df=3) ## using 200 knots
# Smoothing Parameter spar= 1.317883 lambda= 0.9853648 (16 iterations)
# Equivalent Degrees of Freedom (Df): 3.000386
Nun beenden Sie mit df = 3
ohne spar
Kontrolle.
Haben Sie die Möglichkeit in Betracht gezogen, dass die von Ihnen bereitgestellten Freiheitsgrade ein Ziel sind, das der Algorithmus (neben anderen Kriterien) zu optimieren versucht, und das ist einfach so nah wie der Algorithmus? – joran