Что означает прописная буква "I" в формуле линейной регрессии R?

Я не смог найти ответ на этот вопрос, в основном потому, что поиск в Google с помощью отдельного письма (например, "я" ) вызывает проблемы.

Что делает "я" в такой модели?

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

Учитывая, что следующее НЕ работает:

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

и что это работает:

rock$peri - mean(rock$peri)

Любые ключевые слова о том, как исследовать это, также будут очень полезными.

Ответ 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, если вы интересно).