R 通过glm()以编程方式将family=传递给步骤()

R 通过glm()以编程方式将family=传递给步骤(),r,glm,R,Glm,我试图通过模拟演示不同模型和功能选择技术的性能,因此我希望通过编程方式将各种参数传递给glm() 在?glm下,我们看到(斜体): 系列:模型中使用的误差分布和链接功能的说明。对于glm,这可以是一个字符串,用于命名 族函数、族函数或调用族函数的结果。对于glm.fit,仅支持第三个选项。(有关族函数的详细信息,请参见族。) 问题是,当我随后在生成的模型上调用step()时,似乎存在范围问题,family=参数不再被识别 下面是一个简单的例子: getCoef <- function(fo

我试图通过模拟演示不同模型和功能选择技术的性能,因此我希望通过编程方式将各种参数传递给
glm()

?glm
下,我们看到(斜体):

系列:模型中使用的误差分布和链接功能的说明。对于glm,这可以是一个字符串,用于命名 族函数、族函数或调用族函数的结果。对于glm.fit,仅支持第三个选项。(有关族函数的详细信息,请参见族。)

问题是,当我随后在生成的模型上调用
step()
时,似乎存在范围问题,
family=
参数不再被识别

下面是一个简单的例子:

getCoef <- function(formula, 
                family = c("gaussian", "binomial"),
                data){

  model_fam <- match.arg(family, c("gaussian", "binomial"))

  fit_null <- glm(update(formula,".~1"), 
                   family = model_fam, 
                   data = data)

  message("So far so good")

  fit_stepBIC <- step(fit_null, 
                      formula, 
                      direction="forward",
                      k = log(nrow(data)),
                      trace=0)

  message("Doesn't make it this far")

  fit_stepBIC$coefficients
}

# returns error 'model_fam' not found 
getCoef(Petal.Length ~ Petal.Width + Species, family = "gaussian", data = iris)

传递此参数的最自然方式是什么,以便逐步识别?我知道的一个可能的解决方法是通过if-then else以
model\u fam

为条件使用显式姓氏调用
glm()
,我认为以下基于
eval
bquote
的解决方案可能会解决您的问题

我还安装了R-Version3.2.4,我得到的错误与您从代码中得到的错误完全相同。下面的解决方案使它在我的计算机上工作

getCoef <- function(formula, 
                family = c("gaussian", "binomial"),
                data){

    model_fam <- match.arg(family, c("gaussian", "binomial"))

    fit_null <- eval(bquote(
        glm(update(.(formula),".~1"), 
            family = .(model_fam), 
            data = .(data))))

    message("So far so good")

    fit_stepBIC <- step(fit_null, 
                        formula, 
                        direction="forward",
                        k = log(nrow(data)),
                        trace=0)

    message("Doesn't make it this far")

    fit_stepBIC$coefficients
}

# returns error 'model_fam' not found 
 getCoef(formula = Petal.Length ~ Petal.Width + Species,
        family = "gaussian",
        data = iris)

So far so good
Doesn't make it this far
      (Intercept) Speciesversicolor  Speciesvirginica       Petal.Width 
         1.211397          1.697791          2.276693          1.018712   

getCoef问题在于
step
最终调用了
model.frame
model.frame
在一个特殊的环境(即定义公式的环境)中计算术语对象。这通常是调用
getCoef
的环境。但是在这个环境中,
model\u fam
不存在,因为它是在
getCoef
中定义的。解决这个问题的一个方法是添加

environment(formula) <- environment()

环境(公式)我无法复制它。我没有找到
object-fit\u-stepAIC
,但是如果我把它改成
fit\u-stepAIC
,效果很好。@ErnestA哎呀,这是复制它时的一个输入错误,挂断on@ErnestA-那么在运行上述脚本时不会出现上述错误?@C8H10N402没有错误,我得到了系数值。也许可以尝试在clean R会话中运行它,看看错误是否消失。@ErnestA感谢您的时间——我仍然在clean会话中收到错误(用信息更新)。你在R3.2.4上吗?我认为操作系统与此无关……所以基本上,
eval
是在
getCoef
环境中强制求值?与在
步骤中发生的惰性计算相反
?这就是我的问题所在吗?我认为第一种方法的问题是组件
fit\u null$call
给出了
glm(公式=update(公式,“.~1”)、family=model\u fam,data=data)
bquote
插入我们需要的参数值,
eval
是必需的,因为
步骤
不会自动计算引用的表达式。我不太确定所有的技术细节,但我发现引用往往能解决您在案例中遇到的此类问题。我认为欧内斯塔的回答解决了问题。分析得不错。如果在使用
选项(error=recover)
运行后进入评估框架,并查看第7级的
envir
值,则得到:。我使用的是3.3.0版,但R版应该不重要,因为这是预期的结果。
environment(formula) <- environment()
model_fam <- match.arg(family, c("gaussian", "binomial"))