2017-05-30 7 views
1

Rでformulaをテストして、ユーザーがformulaで代行受信を指定したかどうかを確認したいとします。現在私はこのために関数termsを使用しています。私は、所望の出力不一致の式を確認する方法R

terms(y ~ x)  #found an intercept 
terms(y ~ 1 + x) #found an intercept 
terms(y ~ 0 + x) #found no intercept 
terms(y ~ -1 + x) #found no intercept 

を取得しかし場合には、ユーザが矛盾入力を与える次のような場合において、Iは、インターセプトの仕様約termsから(IMO任意)結果を得ます。私が実際に欲しい

terms(y ~ -1 + 1 + x) #found an intercept 
terms(y ~ 1 - 1 + x) #found no intercept 
terms(y ~ 0 + 1 + x) #found an intercept 
terms(y ~ 1 + 0 + x) #found no intercept 

は、これらの場合にエラーまたは警告をスローするtermsです。これはtermsで可能ですか?(正規表現などを介して) "手動で"一貫性のチェックを行う必要がありますか?

答えて

1

foは切片がある場合ので、これはエラーを生成する

さもなければ
has_intercept <- attr(terms(fo), "intercept") 

をインターセプトし、0を持っている場合、これは1になります。

if (has_intercept) stop("Intercept is not allowed") 

当該矛盾発言についてそれが動作する方法は、左から右に行き、最後に遭遇したものを使用するように思われます。例えば、y ~ 0 + 1 + xはインターセプトを持ち、y ~ 1 + 0 + xはありません。

一貫性を保つために、通常は自分のルールを作り直すのではなく、Rのルールに従うのが最良です。

+0

ありがとう@ g-grothendieck、私は厳しくなりたくはありませんが、あなたの答えは私の質問に答えることができません(そして、新しい洞察を与えません)。私は矛盾をチェックしたいと思います。これが問題の核心です。しかし、私は自分のルールを考慮しないようにあなたのアドバイスを取る。 – Qaswed

+0

しかし、矛盾はありません。あなたはそれがどのように動作するかを理解すると、そのようなことがあるという疑問の仮定は間違っています。 –

+0

@Qaswed G.Grothendieckが言っているように、矛盾はなく、 'R'は' y〜1 + x'と同様に 'y〜0 + 1 + x'を' lm'、 'glm'すべて同じでなければならないようなものです。 – Consistency

関連する問題