Control the degree of smoothing in my simple kernel smoothing code

409 views Asked by At

I need help in customizing the smoothing to my time series data. The code below smooths the data using sm.regression and approx functions, but the degree of smoothing is not user controlled, i.e. By changing function parameters I want the ability to control whether the smoothed curve follows the underlying data more closely or less closely.

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

Any help would be appreciated.

Thanks.

1

There are 1 answers

0
Zheyuan Li On BEST ANSWER

There are not many questions regarding the sm package. Perhaps it is not widely used nowadays, but I still remember playing with it a lot when doing my MRes degree.

You can't control smoothness because you are using cross-validation for auto-selection of smoothing parameter. Just get rid of the h.select line and pass h as an argument of your function.

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

The whole point of sm package on kernel smoothing and / or kernel density estimation, is the cross-validation part. If you don't utilize it, you can just use ksmooth from R base for Nadaraya-Watson kernel estimator. You may read more about it from Scatter plot kernel smoothing: ksmooth() does not smooth my data at all. I did made a comparison with sm.regression there.