この質問に対する答えを見つけることができませんでした。主な理由は、スタンドアロンの文字(「I」など)で何かをグーグルすると問題が発生するためです。
このようなモデルで「私」は何をしますか?
data(rock)
lm(area~I(peri - mean(peri)), data = rock)
以下が機能しないことを考慮してください。
lm(area ~ (peri - mean(peri)), data = rock)
そしてそれthisは機能します:
rock$peri - mean(rock$peri)
これを自分で研究する方法に関するキーワードも非常に役立ちます。
I
isolatesまたはinsulates Rの式解析コードの注視からのI( ... )
の内容。これにより、標準のR演算子は、特別な数式演算子として扱われるのではなく、数式の外部で使用した場合と同じように機能します。
例えば:
_y ~ x + x^2
_
rにとって、「私にくれ」という意味です。
x
= x
の主な効果、およびx^2
_ = x
"の主効果と2次交互作用"、意図されたx
とx
- 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
ビット興味がある場合は、から発生します)。
From the docs:
機能Iには2つの主な用途があります。
この点に対処するには:
df1 <- data.frame(stringi = I("dog"))
df2 <- data.frame(stringi = "dog")
str(df1)
str(df2)
この点に対処するには:
lm(mpg ~ disp + drat, mtcars)
lm(mpg ~ I(disp + drat), mtcars)
二行目。 disp + drat
の文字通りの合計である「新しい予測子を作成します」