控制我的简单内核平滑代码中的平滑程度

时间:2016-12-14 03:53:05

标签: r regression smoothing

我需要帮助自定义平滑到我的时间序列数据。下面的代码使用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)
    }

任何帮助都将不胜感激。

感谢。

1 个答案:

答案 0 :(得分:3)

关于sm包的问题不多。也许它现在还没有被广泛使用,但我仍然记得在获得硕士学位时经常使用它。

您无法控制平滑度,因为您正在使用交叉验证来自动选择平滑参数。只需摆脱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进行了比较。