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