Ответ 1
I
изолирует или изолирует содержимое I( ... )
от взгляда кода разбора формулы R. Это позволяет стандартным операторам R работать так, как если бы вы использовали их вне формулы, а не обрабатывались как специальные операторы формулы.
Например:
y ~ x + x^2
означает, что для R означает "дать мне:
-
x
= основной эффектx
и -
x^2
= основной эффект и взаимодействие второго порядкаx
",
не предполагаемый 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
в формуле, и нет ничего, чтобы пересечь x
, чтобы получить взаимодействия второго порядка в термине x^2
.
Чтобы получить обычный оператор, вам нужно использовать 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
.)
В вашем примере -
, когда он используется в формуле, указывает на удаление члена из модели, где вы хотели бы, чтобы -
имел обычный двоичный оператор значение вычитания:
> 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)
является вектором длины и 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....
Следовательно, если вы хотите использовать оператор, который имеет особое значение в формуле, но вам нужно его не-формульное значение, вам нужно обернуть элементы операции в I( )
.
Прочтите ?formula
больше для специальных операторов и ?I
для получения более подробной информации о самой функции и ее другом основном прецеденте в кадрах данных (с которой начинается бит бит AsIs
, если вы интересно).