web-dev-qa-db-ja.com

Rの式で、y〜I(x ^ 3)のようなべき項でI()関数を使用する必要があるのはなぜですか

チルダ演算子と関連する関数の使用について頭を悩ませようとしています。私の最初の質問は、算術演算子を指定するために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番目の質問は、おそらく私が使ってきた例は単純すぎますが、~は実際に使用する必要があります。

41
ChrisW

ここでの問題は、数式の解釈方法です。中置演算子「+」、「*」、「:」、および「^」は、数値ベクトルで使用する場合とはまったく異なる意味を持ちます。数式では、チルダが左側と右側を区切ります。式では、_^_演算子は、おそらく予想される数学的な力ではなく、x = _x^2_ = _x^3_となるように相互作用を構築します。 (それ自体と相互作用する変数は、同じ変数です。)_(x+y)^2_と入力した場合、Rインタプリタは(独自の適切な内部使用のために)数学的なものではなく、_x^2 +2xy +y^2_を生成します。シンボリック:_x + y +x:y_ここで_x:y_は相互作用用語です。

_?formula
_

I()関数は、引数を「as.is」に変換します。したがって、I(x ^ 2)は2乗した値のベクトルを返します。

_~_は、回帰関数で見たときに「として配布されている」または「に依存している」と言って考えるべきです。一般的に「(インターセプト)」とラベル付けされるモデル記述のエラー用語を意味し、関数コンテキストと引数は、log()またはlogit()などのリンク関数をさらに決定する場合もあります。

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

Plot()-ting関数では、基本的に、プロット関数が通常とる引数の通常の_( x, y )_順序を逆にします。 Rと通信するより「数学的な」モードとして式を使用できるように記述されたplot.formulaメソッドがありました。_graphics::plot.formula_、curve、および 'lattice'および 'ggplot'関数で、複数の因子または数値ベクトルがどのように表示され、「ファセット化」されるかを管理します。

_~_は、実際にはリスト抽出演算子でアクセスできるR '呼び出し'を作成する中置(またはプレフィックス)プリミティブ関数であることを学びました。これらはすべて一般的なユーザーには表示されませんが、より高度な機能の作成者が使用する機能です。

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

48
42-