2016-04-25 25 views
5

Ich habe eine Kernfunktion wie folgt:Wie extrapoliere ich über die x Punkte hinaus, die an "ksmooth" übergeben wurden?

x <- 1:100 
y <- rnorm(100, mean=(x/2000)^2) 
plot(x,y) 
kernel <- ksmooth(x,y, kernel="normal", bandwidth=10) 
print(kernel$y) 

Wenn ich versuche, außerhalb des Bereichs der x-Werte an einem Punkt vorherzusagen, wird es mir NaN geben, weil sie über die Daten zu extrapolieren versucht:

x <- 1:100 
y <- rnorm(100, mean=(x/2000)^2) 
plot(x,y) 
kernel <- ksmooth(x,y, kernel="normal", bandwidth=10, x.points=c(130)) 
print(kernel$y) 

> print(kernel$y) 
[1] NA 

Selbst wenn ich range.x ändert sich nicht rühren:

x <- 1:100 
y <- rnorm(100, mean=(x/2000)^2) 
plot(x,y) 
kernel <- ksmooth(x,y, kernel="normal", bandwidth=10, range.x=c(1,200) , x.points=c(130)) 
print(kernel$y) 

> print(kernel$y) 
[1] NA 

Wie erhalte ich die ksmooth Funktion Extrapolieren über die Daten hinaus? Ich weiß, das ist eine schlechte Idee in der Theorie, aber in der Praxis kommt dieses Problem die ganze Zeit auf.

+0

Ich nehme an, eine Nebenfrage wäre: * Was bedeutet 'range.x'? * Die Dokumentation scheint anzuzeigen, dass es" der Bereich von Punkte in der Ausgabe abgedeckt werden. " Aber es scheint hier keinen Einfluss auf die Ausgabe zu haben? – Hunle

+1

Haben Sie stattdessen bkde2D {KernSmooth} in Erwägung gezogen? Standardmäßig extrapoliert dies das 1,5-fache der Bandbreite in jeder Richtung. Extrapoliere weiter auf deine Gefahr hin und vergewissere dich, dass du verstehst, was du tust und welche Einschränkungen es gibt. Wenn Sie wirklich extrapolieren müssen, sollten Sie vielleicht überlegen, die Daten an ein Modell anzupassen, das einen Bezug zur Realität hat und eine vernünftigere Grundlage für die Extrapolation bildet. – dww

+0

Ich werde es versuchen. Das Problem ist, dass es wirklich schwierig ist, irgendeine Art von Kreuzvalidierung durchzuführen, wenn keine Extrapolation stattfindet, denn jedes Mal, wenn ich die k-te Falte in Zug und Test aufspalte, liegen einige der Testbeispiele zwangsläufig außerhalb des Bereichs von die Trainingsbeispiele. Bin ich der Einzige, der dadurch frustriert ist? – Hunle

Antwort

2

Ihrer Seite Frage zu beantworten, auf den Code von ksmooth suchen, ist range.x nur verwendet, wenn x.points nicht vorgesehen ist, so dass erklärt, warum Sie es verwendet nicht sehen. Lassen Sie uns in ksmooth den Code anschauen:

function (x, y, kernel = c("box", "normal"), bandwidth = 0.5, 
    range.x = range(x), n.points = max(100L, length(x)), x.points) 
{ 
    if (missing(y) || is.null(y)) 
     stop("numeric y must be supplied.\nFor density estimation use density()") 
    kernel <- match.arg(kernel) 
    krn <- switch(kernel, box = 1L, normal = 2L) 
    x.points <- if (missing(x.points)) 
     seq.int(range.x[1L], range.x[2L], length.out = n.points) 
    else { 
     n.points <- length(x.points) 
     sort(x.points) 
    } 
    ord <- order(x) 
    .Call(C_ksmooth, x[ord], y[ord], x.points, krn, bandwidth) 
} 

Daraus können wir sehen, dass wir nicht x.points benötigen, um sicherzustellen, dass range.x verwendet wird. Wenn Sie Folgendes ausführen:

x <- 1:100 
y <- rnorm(100, mean=(x/2000)^2) 
plot(x,y) 
kernel <- ksmooth(x,y, kernel="normal", bandwidth=10, range.x=c(1,200)) 
plot(kernel$x, kernel$y) 

Jetzt werden Sie sehen, dass Ihr Kernel über 100 bewertet wird (obwohl nicht bis zu 200). Wenn Sie den Bandbreite-Parameter erhöhen, können Sie noch weiter von 100 entfernt werden.