如何在函数内的 multinom/nnet 对象上调用 model.frame()?
How do you call model.frame() on a multinom/nnet object within a function?
我正在尝试估计 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)
这是范围界定问题吗?有解决方法吗?
公式跟踪创建它们的环境。当公式具有与数据不同的环境时,并非所有函数都表现良好。一个可能的解决方法是
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-8
和 MASS_7.3-35
进行测试
我正在尝试估计 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)
这是范围界定问题吗?有解决方法吗?
公式跟踪创建它们的环境。当公式具有与数据不同的环境时,并非所有函数都表现良好。一个可能的解决方法是
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-8
和 MASS_7.3-35