我不确定置信区间是否smooth.spline
像那些表格lowess
那样具有“不错的”置信区间。但我从CMU 数据分析课程中找到了一个代码示例,用于制作贝叶斯引导置信区间。
以下是使用的函数和示例。主要功能是spline.cis
第一个参数是数据框,其中第一列是x
值,第二列是y
值。另一个重要参数是B
指示要执行的引导复制次数。(有关详细信息,请参阅上面链接的 PDF。)
# Helper functions
resampler <- function(data) {
n <- nrow(data)
resample.rows <- sample(1:n,size=n,replace=TRUE)
return(data[resample.rows,])
}
spline.estimator <- function(data,m=300) {
fit <- smooth.spline(x=data[,1],y=data[,2],cv=TRUE)
eval.grid <- seq(from=min(data[,1]),to=max(data[,1]),length.out=m)
return(predict(fit,x=eval.grid)$y) # We only want the predicted values
}
spline.cis <- function(data,B,alpha=0.05,m=300) {
spline.main <- spline.estimator(data,m=m)
spline.boots <- replicate(B,spline.estimator(resampler(data),m=m))
cis.lower <- 2*spline.main - apply(spline.boots,1,quantile,probs=1-alpha/2)
cis.upper <- 2*spline.main - apply(spline.boots,1,quantile,probs=alpha/2)
return(list(main.curve=spline.main,lower.ci=cis.lower,upper.ci=cis.upper,
x=seq(from=min(data[,1]),to=max(data[,1]),length.out=m)))
}
#sample data
data<-data.frame(x=rnorm(100), y=rnorm(100))
#run and plot
sp.cis <- spline.cis(data, B=1000,alpha=0.05)
plot(data[,1],data[,2])
lines(x=sp.cis$x,y=sp.cis$main.curve)
lines(x=sp.cis$x,y=sp.cis$lower.ci, lty=2)
lines(x=sp.cis$x,y=sp.cis$upper.ci, lty=2)
这给出了类似的东西
实际上,看起来可能有一种更参数化的方法来使用折刀残差计算置信区间。此代码来自Smooth.spline 的 S+ 帮助页面
fit <- smooth.spline(data$x, data$y) # smooth.spline fit
res <- (fit$yin - fit$y)/(1-fit$lev) # jackknife residuals
sigma <- sqrt(var(res)) # estimate sd
upper <- fit$y + 2.0*sigma*sqrt(fit$lev) # upper 95% conf. band
lower <- fit$y - 2.0*sigma*sqrt(fit$lev) # lower 95% conf. band
matplot(fit$x, cbind(upper, fit$y, lower), type="plp", pch=".")
这导致
就gam
置信区间而言,如果您阅读print.gam
帮助文件,则有一个se=
默认参数,TRUE
文档说
当 TRUE(默认)上线和下线添加到 2 个标准误差的 1-d 图中,高于和低于绘制的平滑估计值,而对于 2-d 图,+1 和 -1 标准误差的表面是等高线和覆盖在等高线图上进行估计。如果提供了正数,则在计算标准误差曲线或曲面时,该数字乘以标准误差。另请参阅下面的阴影。
所以可以通过调整这个参数来调整置信区间。(这将在print()
通话中。)