當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。