gpt4 book ai didi

r - 如何设置 mgcv 基本尺寸的最小值?

转载 作者:行者123 更新时间:2023-12-02 14:10:08 26 4
gpt4 key购买 nike

使用 mgcv 的惩罚样条,我希望在示例数据中获得 10/年的有效自由度 (EDF)(整个周期为 60)。

library(mgcv)
library(dlnm)
df <- chicagoNMMAPS

df1<-subset(df, as.Date(date) >= '1995-01-01')

mod1 <-gam(resp ~ s(time,bs='cr',k=6*15, fx=F)+ s(temp,k=6, bs='cr') + as.factor(dow)
,family=quasipoisson,na.action=na.omit,data=df1)

在示例数据中,edf 时间测量的时间基本维度为 56.117,每年小于 10。

summary(mod1)


Approximate significance of smooth terms:
edf Ref.df F p-value
s(time) 56.117 67.187 5.369 <2e-16 ***
s(temp) 2.564 3.204 0.998 0.393
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

R-sq.(adj) = 0.277 Deviance explained = 28.2%
GCV score = 1.1297 Scale est. = 1.0959 n = 2192

我将通过提供平滑参数来手动更改 edf a,如下所示

mod1$sp

s(time) s(temp)

23.84809 17.23785

然后我将 sp 输出插入新模型并重新运行它。基本上,我将继续更改 sp,直到获得 60 左右的 edf。我将仅更改时间的平滑参数。

我将从较低的值开始并检查 edf:

mod1a <-gam(resp ~ s(time,bs='cr',k=6*15, fx=F)+ s(temp,k=6, bs='cr') + as.factor(dow) 
,family=quasipoisson,na.action=na.omit,data=df1, sp= c(12.84809, 17.23785
))
summary(mod1a)
# edf 62.997

我必须增加平滑参数一段时间才能将 edf 降低到 60 左右。

mod1b <-gam(resp ~ s(time,bs='cr',k=6*15, fx=F)+ s(temp,k=6, bs='cr') + as.factor(dow) 
,family=quasipoisson,na.action=na.omit,data=df1, sp= c(14.84809, 17.23785
))
summary(mod1b)
edf 61.393 ## EDF still large, thus I have to increase the sp`

mod1c <-gam(resp ~ s(time,bs='cr',k=6*15, fx=F)+ s(temp,k=6, bs='cr') + as.factor(dow)
,family=quasipoisson,na.action=na.omit,data=df1, sp=c(16.8190989, 17.23785))
summary(mod1c)

edf= 60.005 ## This is what I want to obtain as a final model.

如何通过高效的代码实现最终结果?

最佳答案

我不了解您模型的详细信息,但如果您希望最小化(或最大化)配备不同 sp 的模型的 edf optim 会完成这项工作。首先,创建一个函数,在给定不同 sp 值的情况下,仅返回 edf

edf.by.sp<-function(sp) {
model <-gam(resp ~ s(time,bs='cr',k=6*15, fx=F)+ s(temp,k=6, bs='cr') +
as.factor(dow),
family=quasipoisson,
na.action=na.omit,
data=df1,
sp= c(sp, 17.23785) # Not sure if this quite right.
)
abs(summary(model)$s.table['s(time)','edf']-60) # Subtract 60 and flip sign so 60 is lowest.
}

现在,您只需运行 optim 即可最小化 edf:

# You could pick any reasonable starting sp value.
# Many optimization methods are available, but in your case
# they work equally well.
best<-optim(12,edf.by.sp,method='BFGS')$par
best
# 16.82708

并且,当插入该函数时,重新插入,您会得到接近 0(转换前恰好为 60):

edf.by.sp(best) # 2.229869e-06

关于r - 如何设置 mgcv 基本尺寸的最小值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20349601/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com