![](/img/trans.png)
[英]error when fitting random effects model using bam() rather than gam() function in mgcv package, R
[英]Using update() function in conjunction with gam() in new mgcv package
为了测试用于研究物种的七个性别/生命阶段中每个阶段的捕获计数的一系列gam
模型,我使用了一个函数,该函数使用update()
将一系列预测变量迭代替换为基本模型并产生AIC每个得分。 在新的mgcv
软件包中,使用gam
模型实现相同的代码似乎存在问题。 这是要处理的功能性简化数据子集。
repex=structure(list(Day = c(183L, 190L, 197L, 204L, 211L, 218L, 225L,
232L, 239L, 246L, 175L, 182L), M = c(18L, 43L, 22L, 20L,
7L, 1L, 1L, 0L, 0L, 0L, 0L, 17L), Solar = c(77L, 59L, 20L,
55L, -3L, -44L, 13L, 58L, 8L, 6L, -28L, 12L)), .Names = c("Day", "M", "Solar"),
class = "data.frame", row.names = c(NA, -12L))
在我将mgcv
更新为1.8-9之前,该函数以这种形式成功运行(注意,此后我进行了编辑以直接引用变量,而不是附加repex):
MAIC<-function(x){
m<-gam(repex$M~s(repex$Day),data=repex,family=poisson)
m<-update(m,.~.+x)
return(AIC(m))
}
然后,我将生成带有以下内容的AIC分数列表:
lapply(c('Solar'),function(x) MAIC(repex[ , x]))
在将R更新为3.2.3,并将mgcv
更新为1.8-9之后,我运行了上述脚本,并仅使用以下命令测试了该功能:
MAIC(repex$Solar)
并收到此消息:
Error in eval(expr, envir, enclos) : object 'x' not found
我一直在忙着解决这个问题,并确定与某些建议相反,代码行m<-update(m,.~.+x)
基本上没有任何问题。 我简化了上面的MAIC
函数以尝试查找问题的根源,并使用glm()
和lm()
调用通过上述repex数据子集成功运行了它:
MAIC1 <- function(x){
m <- glm(repex$M~repex$Day,data=repex,family=poisson)
m <- update(m,.~.+x)
return(AIC(m))
}
MAIC1(repex$Solar)
MAIC2 <- function(x){
m <- lm(repex$M~repex$Day,data=repex)
m <- update(m,.~.+x)
return(AIC(m))
}
MAIC2(repex$Solar)
但是,当我将模型更改为gam时,会收到上述错误:
MAIC3 <- function(x){
m <- gam(repex$M~s(repex$Day),data=repex)
m <- update(m,.~.+x)
return(AIC(m))
}
MAIC(repex$Solar)
无论如何构建基本游戏,除非除非按以下方式省略update()
,否则都会发生这种情况:
MAIC4<-function(x){
m<-gam(repex$M~s(repex$Day)+x,data=repex)
return(AIC(m))
}
MAIC4(repex$Solar)
我的sessionInfo()
调用带来了:
R version 3.2.3 (2015-12-10)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 7 x64 (build 7601) Service Pack 1
我的ls()
调用带来了:
[1] "MAIC" "MAIC1" "MAIC2" "MAIC3" "MAIC4" "repex"
我的find("x")
调用带来了:
character(0)
最后,我分别通过以下方式交叉检查了MAIC1(repex$Solar)
, MAIC2(repex$Solar)
和MAIC4(repex$Solar)
的AIC得分:
AIC(glm(repex$M~repex$Day+repex$Solar,data=repex,family=poisson))
AIC(lm(repex$M~repex$Day+repex$Solar,data=repex))
AIC(gam(repex$M~s(repex$Day)+repex$Solar,data=repex))
希望这有助于清理问题。
reformulate()
是执行此操作的明智方法:
repex <- data.frame(Day = c(183, 190, 197, 204, 211,
218, 225, 232, 239, 246, 175, 182),
M = c(18, 43, 22, 20, 7, 1, 1, 0, 0, 0, 0, 17),
Solar = c(77, 59, 20, 55, -3, -44, 13, 58,
8, 6, -28, 12))
library(mgcv)
MAIC <- function(x) {
form <- reformulate(c("s(Day)",x),response="M")
m <- gam(form, data=repex,family=poisson)
return(AIC(m))
}
MAIC("Solar")
例如,这使操作列名称向量更容易。
如果您真的想使用“原始”变量名(例如Solar
而不是"Solar"
,则可以使用deparse(substitute())
MAIC2 <- function(x) {
xx <- deparse(substitute(x))
form <- reformulate(c("s(Day)",xx),response="M")
m <- gam(form, data=repex,family=poisson)
return(AIC(m))
}
MAIC2(Solar)
(或者,您可以只写MAIC2 <- function(x) MAIC(deparse(substitute(x)))
...)
如果您真的想使用带有原始变量的update
,则需要更多的魔术...
MAIC3 <- function(x) {
m <- gam(M~s(Day),data=repex,family=poisson)
m2 <- update(m,bquote(.~.+.(substitute(x))))
return(AIC(m2))
}
MAIC3(Solar)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.