2016-12-14 57 views
0

我需要幫助定製我的時間序列數據的平滑。下面的代碼使用sm.regressionapprox函數平滑數據,但平滑程度不受用戶控制,即通過更改函數參數,我希望能夠控制平滑曲線更緊密還是更不緊密地跟隨底層數據。控制我的簡單內核平滑代碼中的平滑度

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

任何幫助,將不勝感激。

謝謝。

+0

'sm.regression'從哪裏來?爲什麼不使用R的'smooth.spline'和'loess'中許多已有的平滑選項到你可以夢想的任何GAM? – alistaire

+0

@ZheyuanLi:謝謝,我的時間不夠,對R沒有經驗。所以我刪除了我以前的問題,編輯它以儘可能清楚地知道我對R的有限瞭解。 – user1517108

回答

3

關於sm包的問題並不多。也許它現在沒有被廣泛使用,但我仍然記得在做我的MRes學位時玩了很多。

您無法控制平滑度,因爲您正在使用交叉驗證來自動選擇平滑參數。只要擺脫h.select行並通過h作爲您的函數的參數。

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

sm包上核平滑和/或核密度估計的整點,是交叉驗證部分。如果你不使用它,你可以使用來自R base的ksmooth作爲Nadaraya-Watson核估計器。您可以從Scatter plot kernel smoothing: ksmooth() does not smooth my data at all瞭解更多關於它的信息。我在那裏做了一個比較sm.regression