59

チルダ演算子と関連する関数の使用に頭を悩ませようとしています。私の最初の質問は、なぜI()算術演算子を指定するために使用する必要があるのか​​ということです。たとえば、これら2つのプロットは異なる結果を生成します(前者は直線で、後者は予想される曲線です)

x <- c(1:100)
y <- seq(0.1,10,0.1)

plot(y~x^3)
plot(y~I(x^3))

さらに、次の両方のプロットも期待される結果を生成します

plot(x^3, y)
plot(I(x^3), y)

私の2番目の質問は、おそらく私が使用している例は単純すぎるということですが、~実際にどこで使用すべきかわかりません。

4

1 に答える 1

70

チルダ演算子は、実際には、言語オブジェクトの一種である未評価の式を返す関数です。次に、式は、数値オブジェクトを操作する演算子の解釈とは異なる方法で、モデリング関数によって解釈されます。

ここでの問題は、数式、具体的には数式内の「+」、「:」、「^」演算子がどのようpolyに解釈されるかです(補足:正しい統計手順は、数式で高階項を作成しようとするときに関数を使用することです。回帰式。)R式内では、中置演算子「+」、「*」、「:」、および「^」は、数値ベクトルを使用した計算で使用される場合とはまったく異なる意味を持ちます。式では、ティルデ(~)が左側を区切ります。右側から^。and:演算子は、相互作用を構築するために使用されるため、 おそらく予想される数式になるのではなくx= x^2= (それ自体と相互作用する変数はまったく同じ変数です)。x^3(x+y)^2Rインタプリタは、数学x^2 +2xy +y^2的な:ではなく、記号的な:を(それ自体の内部使用のために)生成します。x + y +x:yここで、x:yは主な効果のない交互作用項です。(^は、主な効果と相互作用の両方を提供します。)

?formula

このI()関数は、引数を「as.is」、つまり期待どおりに変換するように機能します。したがって、I(x ^ 2)は、2乗された値のベクトルを返します。

回帰関数で見た~場合、は「として分散されている」または「依存している」と考える必要があります。これ~は、それ自体が中置関数です。コンソールでこれを入力すると、これLHS ~ RHSはほとんど省略形であることがわかります。formula(LHS, RHS)

`~`(LHS,RHS)
#LHS ~ RHS

class( `~`(LHS,RHS) )
#[1] "formula"

identical( `~`(LHS,RHS), as.formula("LHS~RHS") )
#[1] TRUE   # cannot use `formula` since it interprets its first argument

回帰関数では、モデル記述の誤差項は、回帰関数が推定するか、のパラメーターで具体的に要求される形式になりますfamily。基本レベルの平均は、通常、とラベル付けされ(Intercept)ます。関数のコンテキストと引数は、値からlog()やlogit()などのリンク関数をさらに決定することfamilyもできます。また、非正規のファミリー/リンクの組み合わせを持つこともできます。

数式の「+」記号は、実際には2つの変数を追加していませんが、通常、数式のRHSにある残りの変数のコンテキストでその変数の回帰係数を計算するための暗黙の要求です。回帰関数は`model.matrixを使用し、その関数は数式内の因子または文字ベクトルの存在を認識し、数式の離散成分のレベルを拡張する行列を作成します。

plot()-ting関数では、基本的に( x, y )、plot関数が通常取る引数の通常の順序を逆にします。graphics::plot.formula数式をRと通信するためのより「数学的な」モードとして使用できるように、plot.formulaメソッドが作成されました。curve、、、および「lattice」および「ggplot」関数では、複数の因子または数値ベクトルの表示方法を制御します。と「ファセット」。

「+」演算子のオーバーロードについては、以下のコメントで説明されています。また、プロットパッケージであるggplot2とgridExtraでも実行されます。ここで、オブジェクトの結果を提供する関数を分離します。そこでは、パススルーおよび階層化オペレーターとして機能します。一部の集計関数には、「配置」およびグループ化演算子として「+」を使用する数式メソッドがあります。

于 2011-11-08T18:59:09.270 に答える