2016-04-21 15 views
5

Hier entsprechen der Code Ismooth.spline(): angepasste Modell nicht vom Benutzer festgelegten Freiheitsgrad

lief
fun <- function(x) {1 + 3*sin(4*pi*x-pi)} 
set.seed(1) 
num.samples <- 1000 
x <- runif(num.samples) 
y <- fun(x) + rnorm(num.samples) * 1.5 
fit <- smooth.spline(x, y, all.knots=TRUE, df=3) 

Trotz df=3, als ich das angepasste Modell geprüft, war der Ausgang

Call: 
smooth.spline(x = x, y = y, df = 3, all.knots = TRUE) 
Smoothing Parameter spar= 1.499954 lambda= 0.002508571 (26 iterations) 
Equivalent Degrees of Freedom (Df): 9.86422 

Könnte jemand bitte helfen? Vielen Dank!

+0

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

Antwort

4

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:

edf

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)") 

plot

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.