2016-12-14 23 views
0

私は時系列データのスムージングをカスタマイズする際に助けが必要です。以下のコードは、sm.regressionとと関数を使用してデータを平滑化しますが、スムージングの程度はユーザーが制御しません。つまり、関数のパラメータを変更することで、平滑化された曲線が、私の単純なカーネルスムージングコードでスムージングの程度を制御

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'と'黄土 'からあなたが夢見ることができるGAMに使うのはなぜですか? – alistaire

+0

@ ZheyuanLi:ありがとう、私は時間が足りず、R. Thatsの経験がないので、前回の質問を削除し、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パッケージの全体のポイントは、クロスバリデーションの一部です。それを利用しない場合は、Nadaraya-WatsonカーネルエスティメータのRベースのksmoothを使用してください。 Scatter plot kernel smoothing: ksmooth() does not smooth my data at allから詳しく読むことができます。私はsm.regressionと比較しました。

関連する問題