R 为什么gam::step.gam使用正向选择返回NULL?
我有一个大型广义加性模型(GAM),由10K个观测值和大约100个变量组成。使用正向逐步选择构建模型会导致类为“NULL”的对象。为什么会这样?我该如何解决R 为什么gam::step.gam使用正向选择返回NULL?,r,gam,R,Gam,我有一个大型广义加性模型(GAM),由10K个观测值和大约100个变量组成。使用正向逐步选择构建模型会导致类为“NULL”的对象。为什么会这样?我该如何解决 library(gam) load(url("https://github.com/cornejom/DataSets/raw/master/mydata.Rdata")) load(url("https://github.com/cornejom/DataSets/raw/master/mygam.Rdata")) myscope &
library(gam)
load(url("https://github.com/cornejom/DataSets/raw/master/mydata.Rdata"))
load(url("https://github.com/cornejom/DataSets/raw/master/mygam.Rdata"))
myscope <- gam.scope(mydata, response = 3, arg = "df=4") #Target var in 3rd col.
mygam.step <- step.gam(mygam, myscope, direction = "forward")
mygam.step
NULL
我怀疑问题出在
mygam
对象上
解释
如果您阅读了帮助(step.gam)
它在范围
参数的解释中有以下段落:
提供的模型“对象”用作起始模型,
因此,有一项要求,即
术语公式必须出现在“公式(对象)”中。这也
表示不包含“公式(对象)”中的任何术语
在任何术语中,公式都将被迫出现在
每种模型都经过了考虑。函数“gam.scope”很有用
用于为大型模型生成范围参数
本质上,这表示传递给step.gam
函数的第一个参数(mygam
在本例中)将有一个公式,该公式将用作逐步过程的起始模型
因为这里我们有一步一步地向前推进,它不能从完整的模型开始,因为在这种情况下,没有什么可以添加的了
探索代码
如果我们看一下代码,这个想法就会得到加强。step.gam
函数的代码有一个循环,该循环在选择forward时运行
if (forward) {
trial <- items
trial[i] <- trial[i] + 1
if (trial[i] <= term.lengths[i] && !get.visit(trial,
visited)) {
visited <- cbind(visited, trial)
tform.vector <- form.vector
tform.vector[i] <- scope[[i]][trial[i]]
form.list = c(form.list, list(list(trial = trial,
form.vector = tform.vector, which = i)))
}
}
最后一行是需要进行的唯一更改。其他内容与原始帖子中的内容相同:
myscope <- gam.scope(mydata, response = 3, arg = "df=4")
mygam.step <- step.gam(mygam, myscope, direction = "forward")
myscope我认为这可能与使用唯一值数量不足的变量来满足样条线表示中要求的自由度有关。因此,我从step.gam
的scope参数中删除了这些只有不到15个唯一值的变量。。。但是得到了同样的结果。可能需要从对gam
的原始调用中删除它们。如果是这样的话,没有收到某种类型的警告是令人惊讶的(就像在mgcv包中所做的那样)。
library(gam)
load(url("https://github.com/cornejom/DataSets/raw/master/mydata.Rdata"))
mygam <- gam(Response ~ 1, family = "binomial", mydata)
myscope <- gam.scope(mydata, response = 3, arg = "df=4")
mygam.step <- step.gam(mygam, myscope, direction = "forward")