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

Control the degree of smoothing in my simple kernel smoothing code

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

如有任何帮助,我们将不胜感激。

谢谢。

关于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 核估计器。您可以从 阅读更多相关信息。我确实在那里与 sm.regression 进行了比较。