2015-09-01 10 views
0

Я пытаюсь оценить модель multinom(), а затем захватить модель data.frame.Как вы называете model.frame() для объекта multinom/nnet внутри функции?

Внешняя функция, это работает нормально. Но когда я пытаюсь сделать это внутри функции, шаг 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 

Когда я бегу отслеживающий(), я тогда получаю это:

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) 

Это обзорный вопрос? Есть ли обходные пути?

ответ

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-8 и MASS_7.3-35

+0

Спасибо, это работает. Мне нужно будет читать среду, чтобы понять ее лучше. Если вы знаете какие-либо хорошие учебные пособия, ресурсы и т. Д. (За исключением исходного кода/документации R), пожалуйста, дайте мне знать. – Chris