为什么gam :: step.gam在前向选择时返回NULL?

时间:2017-01-03 21:57:27

标签: 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 <- 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的{​​{1}}的代码是:

mydata

1 个答案:

答案 0 :(得分:1)

我怀疑问题出在mygam对象上。

解释

如果您阅读help(step.gam)scope参数的说明中有此段落:

  

提供的模型“对象”用作起始模型,     因此要求每个术语都有一个术语     术语公式存在于'公式(对象)'中。这也是     意味着'formula(object)'中的任何术语都不包含     在任何一个术语公式中都将被强制存在     考虑的每个模型。函数'gam.scope'很有帮助     用于为大型模型生成范围参数。

实质上,这表示传递给step.gam函数的第一个参数(在这种情况下为mygam)将具有一个公式,该公式将用作逐步过程的起始模型。

由于这里我们逐步前进 - 它无法从完整模型开始,因为在这种情况下,没有什么可以添加。

探索守则

如果我们查看代码,这个想法就会得到加强。 step.gam函数的代码具有此循环,在前向选择的情况下运行。

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)))
    }
}

请注意,仅当内部if语句为TRUE时才执行循环。并且if语句似乎检查您的范围(term.length)中是否存在尚未出现在您的模型中的潜在变量(itemstrial)。如果你没有 - 循环跳过。

因为在你的情况下循环从不执行它不会形成返回对象,并且过程返回NULL。

解决方案

鉴于以上所有 - 解决方案是在使用前向选择方法时不要从完整的公式开始。这里为演示我将使用仅限拦截模型作为起始模型:

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")

现在程序有效。