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


R magic 通过 GCV 或 UBRE 进行稳定的多重平滑参数估计


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

说明

通过 GCV 或 UBRE 有效估计具有多重(二次)惩罚的广义岭回归问题中的平滑参数的函数。该函数使用 multi-dimensions 中的牛顿法,并通过最速下降法来迭代调整每个惩罚的平滑参数(一个惩罚的平滑参数可能固定为 1)。

为了获得最大数值稳定性,该方法基于正交分解方法,并尝试使用截断奇异值分解方法来优雅地处理数值秩不足。

用法

magic(y,X,sp,S,off,L=NULL,lsp0=NULL,rank=NULL,H=NULL,C=NULL,
      w=NULL,gamma=1,scale=1,gcv=TRUE,ridge.parameter=NULL,
      control=list(tol=1e-6,step.half=25,rank.tol=
      .Machine$double.eps^0.5),extra.rss=0,n.score=length(y),nthreads=1)

参数

y

是响应数据向量。

X

是模型矩阵(允许的列数多于行数)。

sp

是平滑参数的数组。向量 L%*%log(sp) + lsp0 包含实际乘以 S 中存储的惩罚矩阵的平滑参数的对数(如果 NULL 则将 L 视为恒等式)。任何负的 sp 值都会自动初始化,否则它们将被视为提供起始值。如果 GCV/UBRE 分数的梯度在提供的值处太小,则提供的起始值将重置为默认起始值。

S

是惩罚矩阵的列表。 S[[i]] 是第 i 个惩罚矩阵,但请注意,它不是存储为完整矩阵,而是存储为包括惩罚矩阵的所有非零元素的最小方阵。 S[[i]] 的元素 1,1 占据第 i 个惩罚矩阵的元素 off[i]off[i] 。每个S[[i]] 必须是半正定的。如果没有要估计的平滑参数,则设置为list()

off

是一个数组,指示参数向量中的第一个参数,该参数受到涉及 S[[i]] 的惩罚。

L

是一个矩阵,将 log(sp) 映射到对数平滑参数,该参数实际上乘以 S 的元素定义的惩罚。视为身份,如果 NULL 。请参阅上面sp 下的内容。

lsp0

如果L 不是NULL,则这是从log(sp) 到实际对数平滑参数的线性变换中的常量向量。因此,平滑参数乘以 S[[i]] 的对数由 L%*%log(sp) + lsp0 给出。如果 NULL 则视为 0。

rank

是一个指定惩罚等级的数组。这对于形成罚矩阵的平方根很有用,但不是必需的。

H

是可选的偏移惩罚 - 即平滑参数固定为 1 的惩罚。这对于允许估计过程的正则化、固定平滑惩罚等很有用。

C

是指定拟合问题的任何线性等式约束的可选矩阵。如果 是参数向量,则参数强制满足

w

回归权重。如果这是一个矩阵,则将其视为 y (特别是 )协方差矩阵的逆矩阵的平方根。如果 w 是一个数组,则将其视为该矩阵的对角线,或者只是 y 每个元素的权重。请参阅下面的使用此示例的示例。

gamma

是 GCV 或 UBRE 分数中模型自由度的膨胀因子。

scale

是与 UBRE 一起使用的比例参数。

gcv

如果要使用GCV,则应设置为TRUE,对于UBRE,应设置为FALSE

ridge.parameter

有时对拟合问题应用岭罚分很有用,直接惩罚约束空间中的参数。将此参数设置为大于零的值将导致使用此类惩罚,其大小由参数值给出。

control

是具有以下元素的迭代控制常量列表:

tol

用于判断收敛性的容差。

step.half

如果尝试步骤失败,则该方法会尝试将其减半,最多 step.half 次。

rank.tol

是一个常量,用于测试问题的数值排名缺陷。本质上任何小于 rank_tol 乘以问题的最大奇异值的奇异值都设置为零。

extra.rss

是在计算 GCV、UBRE 和尺度参数估计时添加到残差平方和(平方范数)项的常数。与 n.score 结合使用,这对于处理非常大的数据集的某些方法很有用。

n.score

在 GCV/UBRE 分数计算中用作数据数量的数字:通常是实际数据数量,但有一些处理非常大的数据集的方法可以改变这一点。

nthreads

如果设置为 >1,magic 可以使用多个线程。

细节

该方法是一种计算高效的方法,将 GCV 或 UBRE(通常近似 AIC)应用于以下形式的广义岭回归问题中的平滑参数选择问题:

可能受到约束 是设计矩阵, 参数向量, 数据向量, 权重矩阵, 正半正定系数矩阵,定义带有相关平滑参数的第 i 个罚分 是正半定偏移惩罚矩阵, 是定义问题的任何线性等式约束的系数矩阵。 不必具有完整的列等级。

选择 是为了最小化 GCV 分数:

或 UBRE 分数:

其中 gamma 自由度的膨胀因子(通常设置为 1), scale 尺度参数。 是拟合问题的帽子矩阵(影响矩阵)(即将数据映射到拟合值的矩阵)。分数对平滑参数的依赖性是通过 实现的。

该方法通过牛顿或 日志的最速下降更新进行操作。该方法的一个关键方面是对分数的一阶和二阶导数进行稳定且经济的计算。对数平滑参数。因为 GCV/UBRE 分数与其他分数持平。非常大或非常小 ,获得良好的起始参数非常重要,并且要小心不要进入平滑参数空间的平坦区域。因此,该算法会重新调整任何可能导致 变化超过 5 的牛顿步。仅当 GCV/UBRE 的 Hessian 矩阵为正定时才使用牛顿步,否则使用最速下降。如果牛顿步必须收缩得太远(表明牛顿基础的二次模型很差),则使用类似的最速下降。所有初始最速下降步骤都经过缩放,以便其最大分量为 1。然而,计算步骤时,如果成功,则永远不会扩展(以避免目标的平坦部分),但如果步骤不减少GCV/UBRE 评分,直到他们这样做为止,否则该方向被视为失败。 (给定平滑参数,很容易找到最佳的 参数。)

该方法使用 C 进行编码,并使用 LINPACK 和 LAPACK 例程执行矩阵分解。

该函数返回一个包含以下项目的列表:

b

给定估计的平滑参数的最佳拟合参数。

scale

估计的 (GCV) 或提供的 (UBRE) 尺度参数。

score

最小化的 GCV 或 UBRE 分数。

sp

估计的平滑参数的数组。

sp.full

实际上与 S 的元素相乘的平滑参数数组(如果 LNULL 则与 sp 相同)。这是exp(L%*%log(sp))

rV

参数协方差矩阵的因式分解形式。参数 b 的(贝叶斯)协方差矩阵由 rV%*%t(rV)*scale 给出。

gcv.info

是有关方法性能的信息列表,包含以下元素:

full.rank

问题的表观等级:参数数量减去等式约束的数量。

问题的估计实际等级(在方法的最终迭代时)。

fully.converged

如果该方法通过满足收敛标准而收敛,则为TRUE;如果该方法因未能沿搜索方向降低分数而被覆盖,则为FALSE

hess.pos.def

如果 UBRE 或 GCV 分数的 hessian 矩阵在收敛时是正定的,则为 TRUE

iter

是牛顿/最速下降迭代次数。

score.calls

是必须评估 GCV/UBRE 分数的次数。

rms.grad

是 UBRE/GCV 分数相对于梯度的均方根。平滑参数。

R

来自加权模型矩阵的 QR 分解的因子 R。这是 un-pivoted ,因此列顺序对应于 X 。所以它可能不是上三角形。

请注意,可以使用 magic.post.proc 获得一些进一步有用的量。

例子

## Use `magic' for a standard additive model fit ... 
   library(mgcv)
   set.seed(1);n <- 200;sig <- 1
   dat <- gamSim(1,n=n,scale=sig)
   k <- 30
## set up additive model
   G <- gam(y~s(x0,k=k)+s(x1,k=k)+s(x2,k=k)+s(x3,k=k),fit=FALSE,data=dat)
## fit using magic (and gam default tolerance)
   mgfit <- magic(G$y,G$X,G$sp,G$S,G$off,rank=G$rank,
                  control=list(tol=1e-7,step.half=15))
## and fit using gam as consistency check
   b <- gam(G=G)
   mgfit$sp;b$sp  # compare smoothing parameter estimates
   edf <- magic.post.proc(G$X,mgfit,G$w)$edf # get e.d.f. per param
   range(edf-b$edf)  # compare

## p>n example... fit model to first 100 data only, so more
## params than data...

   mgfit <- magic(G$y[1:100],G$X[1:100,],G$sp,G$S,G$off,rank=G$rank)
   edf <- magic.post.proc(G$X[1:100,],mgfit,G$w[1:100])$edf

## constrain first two smooths to have identical smoothing parameters
   L <- diag(3);L <- rbind(L[1,],L)
   mgfit <- magic(G$y,G$X,rep(-1,3),G$S,G$off,L=L,rank=G$rank,C=G$C)

## Now a correlated data example ... 
    library(nlme)
## simulate truth
    set.seed(1);n<-400;sig<-2
    x <- 0:(n-1)/(n-1)
    f <- 0.2*x^11*(10*(1-x))^6+10*(10*x)^3*(1-x)^10
## produce scaled covariance matrix for AR1 errors...
    V <- corMatrix(Initialize(corAR1(.6),data.frame(x=x)))
    Cv <- chol(V)  # t(Cv)%*%Cv=V
## Simulate AR1 errors ...
    e <- t(Cv)%*%rnorm(n,0,sig) # so cov(e) = V * sig^2
## Observe truth + AR1 errors
    y <- f + e 
## GAM ignoring correlation
    par(mfrow=c(1,2))
    b <- gam(y~s(x,k=20))
    plot(b);lines(x,f-mean(f),col=2);title("Ignoring correlation")
## Fit smooth, taking account of *known* correlation...
    w <- solve(t(Cv)) # V^{-1} = w'w
    ## Use `gam' to set up model for fitting...
    G <- gam(y~s(x,k=20),fit=FALSE)
    ## fit using magic, with weight *matrix*
    mgfit <- magic(G$y,G$X,G$sp,G$S,G$off,rank=G$rank,C=G$C,w=w)
## Modify previous gam object using new fit, for plotting...    
    mg.stuff <- magic.post.proc(G$X,mgfit,w)
    b$edf <- mg.stuff$edf;b$Vp <- mg.stuff$Vb
    b$coefficients <- mgfit$b 
    plot(b);lines(x,f-mean(f),col=2);title("Known correlation")

作者

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

参考

Wood, S.N. (2004) Stable and efficient multiple smoothing parameter estimation for generalized additive models. J. Amer. Statist. Ass. 99:673-686

https://www.maths.ed.ac.uk/~swood34/

也可以看看

magic.post.procgam

相关用法


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