当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


R NCV 邻域交叉验证


R语言 NCV 位于 mgcv 包(package)。

说明

当拟合中省略数据子集时,NCV 通过优化模型预测数据子集的平均能力来估计平滑参数。通常预测子集是遗漏子集的子集。如果两个子集是相同的单个数据点,并且平均值是所有数据点的平均值,则 NCV 是留一交叉验证。 QNCV 是 NCV 的二次近似,保证对任何族链接组合都是有限的。

详细地说,假设通过最小化惩罚损失来估计模型

其中 是一种损失(例如负对数似然),取决于响应 和参数向量 ,而参数向量又取决于带有系数 的一个或多个平滑线性预测变量的协变量。二次惩罚项惩罚模型复杂性: 是已知矩阵, 是未知平滑参数。给定平滑参数,惩罚损失很容易最小化以估计

还必须估计平滑参数。为此,选择 子集 。通常 的子集(或等于)。令 表示当拟合中省略 索引的点时 的估计值。那么NCV标准

最小化 w.r.t.平滑参数 。如果 则恢复普通的留一交叉验证。例如,该公式涵盖了 Arlot 和 Celisse (2010) 中评论的交叉验证的许多变体。

除了二次损失之外, 无法精确计算,但可以通过从完整数据 估计中采取单个牛顿优化步骤来计算到 精度(固定基础大小),当每个 被删除。这就是mgcv 的作用。牛顿步骤需要在删除每个数据时将完整模型 Hessian 更新为等效模型。这可以以 成本实现,其中 的维度。因此,例如,普通交叉验证标准可以在给定平滑参数的情况下估计模型的 成本下计算。

以这种方式计算的 NCV 分数使用 BFGS quasi-Newton 方法进行优化,适用于平滑参数趋于无穷大可能导致不确定的情况。

时空短程自相关

常规应用问题是,在存在 un-modelled 短程自相关的情况下,平滑参数往往会被低估,因为平滑试图拟合由局部自相关引起的数据中的局部偏移。当存在自相关时,交叉验证将倾向于“拟合噪声”,因为由于相关性,拟合与遗漏数据相关的数据中的噪声的模型也将趋向于紧密拟合遗漏数据中的噪声。也就是说,自相关与避免交叉验证试图实现的过度拟合相悖。

对于短程自相关,可以通过在省略 ‘local’ 邻域中的所有数据时预测每个数据来避免或至少减轻问题。构建邻域是为了最大限度地减少兴趣点与其邻域之外的点之间的 un-modelled 相关性。也就是说,我们设置 ,其中 nei(k) 是点 的邻居的索引。这种方法早已为人所知(例如 Chu 和 Marron,1991 年;Robert 等人,2017 年),但之前对于常规用于平滑参数估计来说过于昂贵。

指定邻域

邻域子集 必须提供给 gam ,并且 nei 参数执行此操作。它是一个包含以下参数的列表。

  • k 是每个邻域要删除的索引向量。

  • m 给出每个邻域的结束位置。因此 nei$k[(nei$m[j-1]+1):nei$m[j]] 给出邻域 j 丢弃的点:即

  • i 是要预测的点索引的向量。

  • mi 给出相应的端点 mi 。因此 nei$i[(nei$mi[j-1]+1):nei$mi[j]] 索引要预测邻域 j 的点:即

  • jackknife 是可选元素。如果提供且TRUE,则方差估计基于原始 Jackkife 估计,如果提供FALSE,则基于标准贝叶斯结果。如果没有提供(通常),则使用考虑邻域结构的估计器,这在很大程度上解释了邻域内存在的任何相关性。如果正在为使用另一种方法进行平滑参数选择的模型计算 NCV,则忽略jackknife

如果nei==NULL(或km 缺失),则使用留一交叉验证。如果提供nei,但未选择 NCV 作为平滑参数估计方法,则仅计算(但未优化)。

数值问题

如果指定的模型中某些系数值 具有非有限似然,则使用单个牛顿步计算的 NCV 准则也可能是非有限的。一个简单的修复方法是将 NCV 标准替换为围绕完整数据拟合的标准的二次近似。二次近似总是有限的。这个'QNCV'对于某些家庭来说是必不可少的,例如gevlss

虽然 NCV 的主序成本与 REML 或 GCV 相同,但实际成本更高,因为主要操作成本在 matrix-vector 中,而不是 matrix-matrix 操作中,因此 BLAS 加速很小。然而,多核计算对于 NCV 来说是值得的。请参阅gam.control 中的选项ncv.threads

例子

require(mgcv)
nei.cor <- function(h,n) { ## construct nei structure
  nei <- list(mi=1:n,i=1:n)
  nei$m <- cumsum(c((h+1):(2*h+1),rep(2*h+1,n-2*h-2),(2*h+1):(h+1)))
  k0 <- rep(0,0); if (h>0) for (i in 1:h) k0 <- c(k0,1:(h+i))
  k1 <- n-k0[length(k0):1]+1
  nei$k <- c(k0,1:(2*h+1)+rep(0:(n-2*h-1),each=2*h+1),k1)
  nei
}
set.seed(1)
n <- 500;sig <- .6
x <- 0:(n-1)/(n-1)
f <- sin(4*pi*x)*exp(-x*2)*5/2
e <- rnorm(n,0,sig)
for (i in 2:n) e[i] <- 0.6*e[i-1] + e[i]
y <- f + e ## autocorrelated data
nei <- nei.cor(4,n) ## construct neighbourhoods to mitigate 
b0 <- gam(y~s(x,k=40)) ## GCV based fit
gc <- gam.control(ncv.threads=2)
b1 <- gam(y~s(x,k=40),method="NCV",nei=nei,control=gc)
## use "QNCV", which is identical here...
b2 <- gam(y~s(x,k=40),method="QNCV",nei=nei,control=gc)
## plot GCV and NCV based fits...
f <- f - mean(f)
par(mfrow=c(1,2))
plot(b0,rug=FALSE,scheme=1);lines(x,f,col=2)
plot(b1,rug=FALSE,scheme=1);lines(x,f,col=2)

作者

Simon N. Wood simon.wood@r-project.org

参考

Chu and Marron (1991) Comparison of two bandwidth selectors with dependent errors. The Annals of Statistics. 19, 1906-1918

Arlot, S. and A. Celisse (2010). A survey of cross-validation procedures for model selection. Statistics Surveys 4, 40-79

Roberts et al. (2017) Cross-validation strategies for data with temporal, spatial, hierarchical, or phylogenetic structure. Ecography 40(8), 913-929.

Wood S.N. (2023) On Neighbourhood Cross Validation. in prep.

相关用法


注:本文由纯净天空筛选整理自R-devel大神的英文原创作品 Neighbourhood Cross Validation。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。