如何在函数中的multinom / nnet对象上调用model.frame()?

时间:2015-09-01 19:28:00

标签: r scope multinomial nnet

我正在尝试估计一个multinom()模型,然后获取模型data.frame。

在功能之外,这很好用。但是当我尝试在函数内执行此操作时,data.frame()步骤会抛出错误。

下面是应该隔离问题的示例代码:

library(MASS)
library(nnet)

# create data
df <- survey
df$Exer  <- relevel(df$Exer, ref="None")    

# estimate within wrapper function -- throws error
estimator <- function(fmla, data){  
  mod1 <- multinom(fmla, data)  
  mod1$mod <- model.frame(mod1,data)
  return(mod1)
}
x <- estimator(Exer~Sex+Smoke+Age, data=df)

最后一行产生了这个:

 Error in stats::model.frame(formula = fmla, data = data) : 
  object 'fmla' not found  

当我运行traceback()时,我得到了这个:

6: stats::model.frame(formula = fmla, data = data)
5: eval(expr, envir, enclos)
4: eval(oc, env)
3: model.frame.multinom(mod1, data)
2: model.frame(mod1, data) at #3
1: estimator(Exer ~ Sex + Smoke + Age, data = df)

这是一个范围问题吗?有变通方法吗?

1 个答案:

答案 0 :(得分:0)

公式跟踪创建它们的环境。当公式具有与数据不同的环境时,并非所有函数都表现良好。可能的解决方法是

estimator <- function(fmla, data){  
  environment(fmla)<-environment()
  mod1 <- multinom(fmla, data)  
  mod1$mod <- model.frame(mod1,data)
  return(mod1)
}
x <- estimator(Exer~Sex+Smoke+Age, data=df)

我们明确地将公式的环境更改为本地函数环境。这给了我

# weights:  21 (12 variable)
initial  value 258.173888 
iter  10 value 215.870042
final  value 215.611365 
converged

使用R版本3.1.2,nnet_7.3-8MASS_7.3-35

进行测试