首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么gam::step.gam返回带前向选择的NULL?

为什么gam::step.gam返回带前向选择的NULL?
EN

Stack Overflow用户
提问于 2017-01-03 21:57:27
回答 1查看 879关注 0票数 1

我有一个很大的广义加法模型(GAM),它是由10K观测值和100个变量组成的。通过前向逐步选择建立模型,得到一个类为"NULL“的对象。为什么会这样,我该如何解决呢?

代码语言:javascript
复制
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中安装mydata的代码是:

代码语言:javascript
复制
library(gam)

#Identify numerical variables, but exclude the integer response.
numbers = sapply(mydata, class) %in% c("integer", "numeric")  
numbers[match("Response", names(mydata))] = FALSE 

#Identify factor variables.
factors = sapply(mydata, class) == "factor"

#Create a formula to feed into gam function.
myformula = paste0(paste0("Response ~ ", 
                          paste0("s(", names(mydata)[numbers], ", df=4)", collapse = " + ")
                          ),
                   " + ",
                   paste0(paste0(names(mydata)[factors], collapse = " + ")))

mygam = gam(as.formula(myformula), family = "binomial", mydata)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-23 16:54:04

我怀疑问题在于mygam对象。

解释

如果您阅读help(step.gam),它在对scope参数的解释中包含了以下段落:

所提供的模型‘object’被用作起始模型,因此每个术语公式中的一个术语必须出现在“公式(对象)”中。这也意味着“公式(对象)”中没有包含在任何术语公式中的任何术语都将被迫出现在所考虑的每个模型中。函数‘gam.scope’有助于为大型模型生成范围参数。

本质上,这意味着传递给step.gam函数的第一个参数(在本例中为mygam)将有一个公式,该公式将用作逐步过程的起始模型。

因为这里我们有逐步前进的--它不能从完整的模型开始,因为在这种情况下没有什么可添加的了。

探索“守则”

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

代码语言:javascript
复制
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。

解决方案

鉴于以上所述,解决方案是在使用正向选择方法时,不要从完整的公式开始。在这里演示时,我将使用纯拦截模型作为启动模型:

代码语言:javascript
复制
library(gam)
load(url("https://github.com/cornejom/DataSets/raw/master/mydata.Rdata"))
mygam <- gam(Response ~ 1, family = "binomial", mydata)

最后一行是唯一需要进行的更改。其他所有内容都与原来的帖子相同:

代码语言:javascript
复制
myscope <- gam.scope(mydata, response = 3, arg = "df=4")
mygam.step <- step.gam(mygam, myscope, direction = "forward")

现在这个程序起作用了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41453033

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档