2015-09-01 1 views
0

J'essaie d'estimer un modèle multinom(), puis de récupérer le modèle data.frame.Comment appelez-vous model.frame() sur un objet multinom/nnet dans une fonction?

En dehors d'une fonction, cela fonctionne correctement. Mais quand j'essaie de le faire dans une fonction, l'étape data.frame() renvoie une erreur.

est un exemple de code ci-dessous qui devrait isoler le problème:

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) 

La dernière ligne produit ceci:

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

Quand je lance retraçage(), je puis obtenir ceci:

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) 

Est-ce un problème de portée? Y a-t-il des solutions de rechange?

Répondre

0

Les formules suivent l'environnement dans lequel elles sont créées. Toutes les fonctions ne se comportent pas bien lorsque les formules ont des environnements différents des données. Un travail autour possible serait

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) 

où nous changeons explicitement l'environnement de la formule à l'environnement de la fonction locale. Cela me donne

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

Testé avec la version R 3.1.2, nnet_7.3-8 et MASS_7.3-35

+0

Merci, cela fonctionne très bien. Je vais devoir lire sur les environnements pour mieux le comprendre. Si vous connaissez de bons tutoriels, ressources, etc (au-delà du code source R/documentation) s'il vous plaît faites le moi savoir. – Chris