带R的某些特殊点的超边界插值和外推

带R的某些特殊点的超边界插值和外推,r,interpolation,spline,smoothing,extrapolation,R,Interpolation,Spline,Smoothing,Extrapolation,我有一个数据集 x=c(1600L, 1650L, 1675L, 1700L, 1725L, 1775L, 1800L, 1825L, 1850L, 1875L, 1880L, 1885L, 1900L, 1920L, 1925L, 1930L, 1935L, 1940L, 1945L, 1950L, 1955L, 1960L, 1965L, 1975L, 1980L, 1985L, 1990L, 1995L, 2000L, 2005L, 2010L, 2015L, 2020L, 2025

我有一个数据集

x=c(1600L, 1650L, 1675L, 1700L, 1725L, 1775L, 1800L, 1825L, 1850L, 
1875L, 1880L, 1885L, 1900L, 1920L, 1925L, 1930L, 1935L, 1940L, 
1945L, 1950L, 1955L, 1960L, 1965L, 1975L, 1980L, 1985L, 1990L, 
1995L, 2000L, 2005L, 2010L, 2015L, 2020L, 2025L, 2030L, 2035L, 
2040L, 2045L, 2050L, 2055L, 2060L, 2065L, 2070L, 2075L, 2080L, 
2085L, 2090L, 2095L, 2100L, 2105L, 2110L, 2115L, 2120L, 2125L, 
2130L, 2135L, 2140L, 2145L, 2150L, 2155L, 2160L, 2165L, 2170L, 
2175L, 2180L, 2185L, 2190L, 2195L, 2200L, 2225L, 2250L, 2275L, 
2300L, 2325L, 2350L, 2400L)

y= c(0.294529, 0.285516, 0.240616, 0.275107, 0.275033, 0.236293, 
0.240515, 0.229588, 0.20417, 0.20361, 0.203624, 0.204582, 0.195379, 
0.187396, 0.185315, 0.182648, 0.18076, 0.178717, 0.176931, 0.173805, 
0.171352, 0.169856, 0.170566, 0.166413, 0.164074, 0.162457, 0.160333, 
0.158291, 0.156577, 0.154371, 0.152205, 0.150303, 0.148391, 0.146455, 
0.144258, 0.142454, 0.139729, 0.137987, 0.135529, 0.133566, 0.131664, 
0.129607, 0.127761, 0.125352, 0.123669, 0.121388, 0.119598, 0.117541, 
0.11575, 0.113464, 0.111405, 0.109566, 0.107747, 0.105732, 0.104137, 
0.102337, 0.100538, 0.099007, 0.097542, 0.096187, 0.095008, 0.094473, 
0.094044, 0.093378, 0.093201, 0.093218, 0.093572, 0.094112, 0.094962, 
0.102078, 0.111409, 0.120824, 0.128211, 0.137644, 0.144049, 0.16133
)
我试着用R中的样条插值x上y的函数,并在x的边界之前和之后用一系列数字以相等的间距返回一些特定的点。所以我写:

fineX <- seq(min(x)-500, max(x)+500 , 1)
interp <- spline(x,y , xout= fineX , method = c("natural"))

但这种方法的外推是愚蠢的,如下图所示:

plot(fineX, interp$y)

在插值中,x=2000之前的函数明显减少,但可以看到x=1600之前的外推变为增加

smooth.spline
函数提供了更好的结果,但它不允许我选择我想要的
xout
点(或者我不知道如何选择!)


我该怎么做才能使一个好的插值(非线性)超出x的边界,并得到我需要的
xout
点?

这是一个与编程问题一样的统计问题(如果不是更多的话)

首先,你根据什么标准来判断什么是好的推断

第二,如果你相信你的自然插值在x=1600到x=1700的范围内,我不明白为什么外推显然是不好的?如下图所示,如果您相当确定数据中几乎没有噪音,或者如果您的底层数据生成在某种意义上具有“惯性”(您不提供数据实际是什么的上下文),那么这看起来并不是非常疯狂


至于以更客观的方式选择
span
,我想您可以交叉验证,并通过更客观的度量选择最适合的

你能提供一些玩具数据吗?粘贴例如
dput(x)
dput(y)
。您是否尝试过使用
linear=FALSE
extrap=TRUE
interp
函数?@AndersEllernBilgrau很抱歉,我是一个初学者,不理解什么是dput()。你是说我共享数据文件?假设数据包含一个包含100个观察值的变量x和一个包含100个观察值的变量y。是的,如果对x和y变量运行dput(),您可以轻松地将输出复制粘贴到post中(这样我们就可以将其复制到R会话中)。或者以其他方式分享。@AndersEllernBilgrau我编辑了这篇文章并添加了数据点。谢谢你提供了这么好的解释。这些数据是针对期权市场的。我试图用执行价格推断隐含波动率。因此,数据非常嘈杂,负外推导致我的风险中性分布变为负,这是错误的。这个答案大大改善了结果,但对于一些到期日,我仍然有消极的反应;所以,恐怕我帮不了你更多。如果你提供一个失败的例子。
plot(fineX, interp$y)
fineX <- seq(min(x)-50, max(x)+50 , 1)
interp <- spline(x, y ,xout = fineX , method = "natural")
plot(x,y, xlim = range(fineX), ylim = range(interp$y))
lines(interp)
s <- fineX > max(x) | fineX < min(x)
points(fineX[s], interp$y[s], pch = 3, cex = .7, col = "red")
abline(v = range(x), col = "red")
low <- loess(y ~ x, span = 0.2, control = loess.control(surface = "direct"))
res <- predict(low, newdata = fineX)
lines(fineX, res, col = "blue", lwd = 3)
points(fineX[s], res[s], col = "green", cex = .6, pch = 3)