首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >AIC()和模型$aic在mgcv::gam()中给出了不同的结果

AIC()和模型$aic在mgcv::gam()中给出了不同的结果
EN

Stack Overflow用户
提问于 2021-02-26 08:41:48
回答 1查看 378关注 0票数 2

我使用mgcv:: GAM ()对一个gam进行空间平滑的拟合,类似于这个例子 (data 这里)中的模型。我发现使用AIC(model)给出了与model$aic不同的结果。为什么会这样呢?哪个是对的?

代码语言:javascript
运行
复制
library('mgcv')

galveston <- read.csv('gbtemp.csv')
galveston <- transform(galveston,
                   datetime = as.POSIXct(paste(DATE, TIME),
                                         format = '%m/%d/%y %H:%M', tz = "CDT"))
galveston <- transform(galveston,
                   STATION_ID = factor(STATION_ID),
                   DoY = as.numeric(format(datetime, format = '%j')),
                   ToD = as.numeric(format(datetime, format = '%H')) +
                       (as.numeric(format(datetime, format = '%M')) / 60))

knots <- list(DoY = c(0.5, 366.5))
M <- list(c(1, 0.5), NA)
m <- bam(MEASUREMENT ~
         s(ToD, k = 10) +
         s(DoY, k = 30, bs = 'cc') +
         s(YEAR, k = 30) +
         s(LONGITUDE, LATITUDE, k = 100, bs = 'ds', m = c(1, 0.5)) +
         ti(DoY, YEAR, bs = c('cc', 'tp'), k = c(15, 15)) +
         ti(LONGITUDE, LATITUDE, ToD, d = c(2,1), bs = c('ds','tp'), 
            m = M, k = c(20, 10)) +
         ti(LONGITUDE, LATITUDE, DoY, d = c(2,1), bs = c('ds','cc'),
            m = M, k = c(25, 15)) +
         ti(LONGITUDE, LATITUDE, YEAR, d = c(2,1), bs = c('ds','tp'),
            m = M, k = c(25, 15)),
data = galveston, method = 'fREML', knots = knots,
nthreads = 4, discrete = TRUE)

AIC(m)
[1] 57073.08

m$aic
[1] 57053.21

请注意,我给出的示例使用bam()而不是gam(),但结果是相同的。

我无法用一个更简单的模型(例如来自这里的模型)来复制这个模型:

代码语言:javascript
运行
复制
set.seed(2) 
dat <- gamSim(1,n=400,dist="normal",scale=2)
b <- gam(y~s(x0)+s(x1)+s(x2)+s(x3),data=dat)

AIC(b)
[1] 1696.143

b$aic
[1] 1696.143
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-26 18:10:00

这一差异是因为存储在$aic中的是作为自由度的,因为AIC中的复杂性校正是模型的有效自由度。这已被证明是过于自由或保守,并可能导致AIC总是选择更复杂的模型或更简单的模型,这取决于是否使用边缘或条件的AIC。

有纠正这种行为的方法,mgcv实现了Wood等人(2016)的方法,其中对自由度进行了修正。这是通过logLik.gam()函数完成的,该函数由AIC.gam()调用。这也解释了不同之处,因为$aic是标准的AIC,没有应用校正,而IIRC是GAM对象的一个组件,它大大早于Wood等人(2016年)的工作。

至于为什么不能用简单的示例复制这一点,这是因为校正要求使用fit的组件,这些组件只有在method用于fit的时候才可用(包括"fREML" for bam(),而不是使用扩展的Fellner Schall或BFGS优化器时:

代码语言:javascript
运行
复制
> library('mgcv')
Loading required package: nlme
This is mgcv 1.8-34. For overview type 'help("mgcv-package")'.
> set.seed(2) 
> dat <- gamSim(1,n=400,dist="normal",scale=2)
Gu & Wahba 4 term additive model
> b <- gam(y~s(x0)+s(x1)+s(x2)+s(x3),data=dat, method = 'REML')
> AIC(b)
[1] 1698.504
> b$aic
[1] 1696.894

其中,method的默认用法是使用GCV。

参考文献

伍德,S.N.,Pya,N.,S fken,B.,2016年。一般光滑模型的平滑参数与模型选择。J. Am状态。Assoc.111,1548-1563https://doi.org/10.1080/01621459.2016.1180986

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66382627

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档