2016-12-22 14 views
4

Rの式構文では、時折、ユーザーはインターセプトを持つ非常に単純なモデルを指定します。モデル式にインターセプトだけがあるかどうかを判断するもっとも簡単な方法

fit = lm(Response ~ 1, data) 

これらのモデルは、より複雑なモデルと比較して簡素化を可能にします。 lm(Response ~ A + B + A:B, ...)と私は方程式のRHSが1と他の言葉しか含んでいないときに検出する簡単な方法を持っていたいと思います。テキストの操作は可能ですが、R formulaクラスまたは他のメソッドを使用してこれを行う他の方法はありますか?

+0

質問は私には明らかです。 –

答えて

6

答えは、おそらく標準的な答えですが、あなたはまた、式のLHSをドロップすると、~1に対してそれをテストするためにサブセットを使用することができます。

fit = lm(Response ~ 1, data=data.frame(Response=1:10)) 
identical(formula(fit)[-2],~1) 
  • これは、両面式
  • を想定しています
  • サブセットを理解するには、2面演算式をバイナリ演算として扱い、(~,Response,1)の構文木として格納する必要があります。最初の要素は演算子、2番目の要素は最初の引数(LHS) 、右の要素はsですecond議論(RHS)。 [-2]は2番目の要素を削除し、その式を片面式にします。 G.Grothendieck @

は0で応答変数を上書きするupdateを使用して、コメントでやや少ないハックバリアント(式オブジェクトの内部構造を知っているか理解する必要はありません)を提供しています:

identical(update(formula(fit), 0 ~ .), 0 ~ 1) 
+0

私は本当にこれが好きです。代わりに 'as.character(formula(Response〜1))[3] ==" 1 "'ですが、私はあなたが少しきれいだと思います。 – evolvedmicrobe

+3

ここでは、LHSを0 (0〜1)、(0〜1)を更新します。 –

7

最も簡単な方法は

names(coef(fit)) 

これだけのショー "(インターセプト)" の場合で、あなたは知っています。


もう1つの方法は、「用語」オブジェクトをチェックすることです。実際、これはlmから独立しています。式を作成します。

f <- Response ~ 1 

次に、terms(f)は "terms"オブジェクトを作成します。その後、lmObjectがこれを継承します。

チェックアウト

attr(terms(fit), "intercept") 
## to use formula only without actually fitting a model, do 
## attr(terms(f), "intercept") 

これが1であれば、あなたはインターセプトを持っています。 0の場合、あなたはそれを持っていません。 0よりも大きい、あなたが他の共変量を持っている場合は

さて、

length(attr(terms(fit), "term.labels")) 
## to use formula only without actually fitting a model, do 
## attr(terms(f), "terms.labels") 

をチェックしてください。 0の場合、ビンゴ。 terms