我有一个大的广义加法模型(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
答案 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
)中是否存在尚未出现在您的模型中的潜在变量(items
,trial
)。如果你没有 - 循环跳过。
因为在你的情况下循环从不执行它不会形成返回对象,并且过程返回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")
现在程序有效。