2016-12-14 1 views
0

Ich brauche Hilfe bei der Anpassung der Glättung an meine Zeitreihendaten. Der folgende Code glättet die Daten unter Verwendung der Funktionen sm.regression und approx, aber der Grad der Glättung wird nicht vom Benutzer gesteuert, d. H. Durch Änderung von Funktionsparametern möchte ich steuern können, ob die geglättete Kurve den zugrunde liegenden Daten näher oder weniger nahe kommt.Kontrollieren Sie den Grad der Glättung in meinem einfachen Kernel Smoothing Code

find.extrema <- function(x) 
    { 
     if(is.xts(x)) { 
      y = as.vector(Cl(x)) 
     } else { 
      y = x 
     } 
     n = len(y) 
     t = 1:n 
     h = h.select(t, y, method = 'cv') 
     temp = sm.regression(t, y, h=h, display = 'none') 
     mhat = approx(temp$eval.points, temp$estimate, t, method='linear')$y 
     #mhat = y #to exactly match underlying data 
     return (mhat) 
    } 

Jede Hilfe wäre willkommen.

Danke.

+0

Woher kommt 'sm.regression'? Warum verwenden Sie nicht eine der vielen R-Optionen von 'smooth.spline' und' löß' für alle GAMs, die Sie sich ausdenken können? – alistaire

+0

@ZheyuanLi: Danke, mir ging die Zeit knapp, und habe keine Erfahrung in R. Deshalb habe ich meine vorherige Frage gelöscht, bearbeitet, um es so klar wie möglich zu machen, mit meiner begrenzten Kenntnis von R. – user1517108

Antwort

3

Es gibt nicht viele Fragen zum sm Paket. Vielleicht ist es heutzutage nicht weit verbreitet, aber ich erinnere mich noch daran, dass ich viel damit gespielt habe, als ich meinen MRes-Abschluss gemacht habe.

Sie können die Glätte nicht steuern, da Sie die Kreuzvalidierung für die automatische Auswahl von Glättungsparametern verwenden. Entfernen Sie einfach die h.select Zeile und übergeben Sie h als Argument Ihrer Funktion.

find.extrema <- function(x, h = NULL) 
{ 
    if(is.xts(x)) { 
     y = as.vector(Cl(x)) 
    } else { 
     y = x 
    } 
    n = len(y) 
    t = 1:n 
    ## if not given, do auto-selection from data 
    if (is.null(h)) h = h.select(t, y, method = 'cv') 
    temp = sm.regression(t, y, h=h, display = 'none') 
    mhat = approx(temp$eval.points, temp$estimate, t, method='linear')$y 
    #mhat = y #to exactly match underlying data 
    return (mhat) 
} 

Der springende Punkt des sm Pakets auf Kernel-Glättung und/oder Kerndichteschätzung ist die Kreuzvalidierung Teil. Wenn Sie es nicht verwenden, können Sie einfach ksmooth von R Basis für Nadaraya-Watson Kernel Estimator verwenden. Sie können mehr darüber von Scatter plot kernel smoothing: ksmooth() does not smooth my data at all lesen. Ich habe dort einen Vergleich mit sm.regression gemacht.

Verwandte Themen