1

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)

これはスコーピングの問題ですか?回避策はありますか?

4

1 に答える 1

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

nnet_7.3-8R バージョン 3.1.2、、およびでテスト済みMASS_7.3-35

于 2015-09-01T19:52:44.653 に答える