我需要帮助自定义平滑到我的时间序列数据。下面的代码使用sm.regression
和approx
函数来平滑数据,但平滑程度不是用户控制的,即通过更改函数参数,我希望能够控制平滑曲线是否跟随基础数据更多密切或不密切。
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 :(得分: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
进行了比较。