2012-03-14 11 views
8

モデルを作成するために使用される式を抽出する必要のある多くのモデルタイプの関数を作成しています。これを行うための柔軟な方法はありますか?例:モデルから式を抽出するR

x <- rnorm(10) 
y <- rnorm(10) 
z <- rnorm(10) 
equation <- z ~ x + y 
model <- lm(equation) 

私がしなければならないのは、一度モデルに渡された数式オブジェクト「方程式」を抽出することです。

答えて

12

あなたがで欲しいものを得ることができます:

model$call 
# lm(formula = formula) 

そして、あなたは私が見つけたものを見たい場合は、次に使用:

str(model) 

をあなたは「式」の(悪い選択を通過したので、名前を呼ぶ環境)から、あなたが渡したオブジェクトから抽出する必要があるかもしれません:

@JPM acはよりコンパクトな方法を提供しました:formula(model)。また、formula.lm関数で使用されるメカニズムを検討する価値があります。 formulaという名前の関数は汎用で、どのようなS3メソッドが定義されているかはmethods(formula)です。 formula.lm方法は、その端部にアスタリスクを持っている、あなたはgetAnywhere `でそれをラップする必要があるので:

> getAnywhere(formula.lm) 
A single object matching ‘formula.lm’ was found 
It was found in the following places 
    registered S3 method for formula from namespace stats 
    namespace:stats 
with value 

function (x, ...) 
{ 
    form <- x$formula 
    if (!is.null(form)) { 
     form <- formula(x$terms) 
     environment(form) <- environment(x$formula) 
     form 
    } 
    else formula(x$terms) 
} 
<bytecode: 0x36ff26158> 
<environment: namespace:stats> 

だから、「式」という名前のリスト項目を抽出するために「$」を使用してではなく、呼び出しからそれを引っ張っています。 $ formulaアイテムが見つからない場合(あなたの場合)、それはformula.defaultと呼んでいると思われるformula(x$terms)で置き換えられ、その関数の操作を見ると、オブジェクトの環境を調整するように見えます。

+0

お返事ありがとうございます - 実際に式オブジェクト "数式"にアクセスするにはどうすればいいですか?私がinfo < - model $ callを試してみると、info $ formulaがシンボルオブジェクト "formula"を与えてくれます。 – mike

+0

私は 'model $ call [[2]]ではなく' as.list(model $ call)$ formula'を提案します。 – flodel

+0

@mike:あなたが何を求めているのか分かりません。あなたはあなたの数式 "式"と呼ぶことを決めた後、それを名前付き引数として "lm"に渡しました。 'fortunes :: fortune(" dog ")はここにはっきりと当てはまります。 –

3

lmオブジェクトを作成した呼び出しがmodel$callに届きますが、その呼び出しにモデル式としてオブジェクト自体が含まれていると、数式ではなくオブジェクト名が取得されます。

評価されたオブジェクト、つまり数式自体は、model$terms(どのように扱われたかに関する補助情報の束とともに)でアクセスすることができます。これはlmへの呼び出しの詳細にかかわらず動作するはずです。

関連する問題