2015-09-01 32 views
0

我試圖估計一個multinom()模型,然後抓住模型data.frame。如何在函數內的multinom/nnet對象上調用model.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 

當我運行回溯(),然後我得到這樣的:

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

相關問題