web-dev-qa-db-ja.com

R線形回帰式の大文字の「I」はどういう意味ですか?

この質問に対する答えを見つけることができませんでした。主な理由は、スタンドアロンの文字(「I」など)で何かをグーグルすると問題が発生するためです。

このようなモデルで「私」は何をしますか?

data(rock)
lm(area~I(peri - mean(peri)), data = rock)

以下が機能しないことを考慮してください。

lm(area ~ (peri - mean(peri)), data = rock)

そしてそれthisは機能します:

rock$peri - mean(rock$peri)

これを自分で研究する方法に関するキーワードも非常に役立ちます。

20
Nancy

Iisolatesまたはinsulates Rの式解析コードの注視からのI( ... )の内容。これにより、標準のR演算子は、特別な数式演算子として扱われるのではなく、数式の外部で使用した場合と同じように機能します。

例えば:

_y ~ x + x^2
_

rにとって、「私にくれ」という意味です。

  1. x = xの主な効果、および
  2. _x^2_ = x "の主効果と2次交互作用"、

意図されたxx- squaredではありません:

_> model.frame( y ~ x + x^2, data = data.frame(x = rnorm(5), y = rnorm(5)))
           y           x
1 -1.4355144 -1.85374045
2  0.3620872 -0.07794607
3 -1.7590868  0.96856634
4 -0.3245440  0.18492596
5 -0.6515630 -1.37994358
_

これは、_^_で説明されているように、_?formula_が数式の特殊な演算子であるためです。 xの主な効果はすでに数式のx項に含まれており、_x^2_項の2次相互作用を取得するためにxと交差するものがないため、モデルフレームにxのみを含めることになります。 。

通常の演算子を取得するには、I()を使用して、呼び出しを式コードから分離する必要があります。

_> model.frame( y ~ x + I(x^2), data = data.frame(x = rnorm(5), y = rnorm(5)))
            y          x       I(x^2)
1 -0.02881534  1.0865514 1.180593....
2  0.23252515 -0.7625449 0.581474....
3 -0.30120868 -0.8286625 0.686681....
4 -0.67761458  0.8344739 0.696346....
5  0.65522764 -0.9676520 0.936350....
_

(最後の列は正しいですが、クラスAsIsであるため、奇妙に見えます。)

あなたの例では、数式で使用される場合の_-_は、モデルからの項のremovalを示します。ここで、_-_に通常の二項演算子の意味を持たせたい減算

_> model.frame( y ~ x - mean(x), data = data.frame(x = rnorm(5), y = rnorm(5)))
Error in model.frame.default(y ~ x - mean(x), data = data.frame(x = rnorm(5),  : 
  variable lengths differ (found for 'mean(x)')
_

mean(x)が長さ1のベクトルであり、model.frame()が他の変数の長さと一致しないことを正しく示しているため、これは失敗します。これを回避する方法はI()です。

_> model.frame( y ~ I(x - mean(x)), data = data.frame(x = rnorm(5), y = rnorm(5)))
           y I(x - mean(x))
1  1.1727063   1.142200....
2 -1.4798270   -0.66914....
3 -0.4303878   -0.28716....
4 -1.0516386   0.542774....
5  1.5225863   -0.72865....
_

したがって、数式で特別な意味を持つ演算子を使用したいが、そのnon-formulaの意味が必要な場合は、演算の要素をI( )でラップする必要があります。 。

特別な演算子の詳細については_?formula_を、関数自体の詳細については_?I_をお読みくださいおよびデータフレーム内の他の主なユースケース(ここでAsIsビット興味がある場合は、から発生します)。

28
Gavin Simpson

From the docs:

機能Iには2つの主な用途があります。

  • 関数data.frame内。 data.frameの呼び出しでオブジェクトをI()で囲むことによってオブジェクトを保護すると、文字ベクトルの因子への変換と名前の削除が禁止され、行列が単一の列として挿入されるようになります。また、データフレームに追加されるオブジェクト、またはas.data.frameを介してデータフレームに変換されるオブジェクトを保護するためにも使用できます。

この点に対処するには:

df1 <- data.frame(stringi = I("dog"))
df2 <- data.frame(stringi = "dog")

str(df1)
str(df2)
  • 関数式で。そこでは、「+」、「-」、「*」、「^」などの演算子の数式演算子としての解釈を禁止するために使用されるため、算術演算子として使用されます。これは、terms.formulaによってシンボルとして解釈されます。

この点に対処するには:

lm(mpg ~ disp + drat, mtcars)
lm(mpg ~ I(disp + drat), mtcars)

二行目。 disp + dratの文字通りの合計である「新しい予測子を作成します」

1
Andre Elrico