В формулах R, почему я должен использовать функцию I () на степенных членах, например, y ~ I (x ^ 3) - PullRequest
39 голосов
/ 08 ноября 2011

Я пытаюсь разобраться с использованием оператора тильды и связанных с ним функций. Мой первый вопрос: почему для указания арифметических операторов нужно использовать 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)

Мой второй вопрос: возможно, примеры, которые я использовал, слишком просты, но я не понимаю, где на самом деле следует использовать ~.

1 Ответ

46 голосов
/ 08 ноября 2011

Вопрос в том, как интерпретировать формулы.Инфиксные операторы "+", "*", ":" и "^" имеют совершенно другое значение, чем при использовании с числовыми векторами.В формуле тильда отделяет левую сторону от правой.В формулах оператор ^ предназначен для построения взаимодействий таким образом, чтобы x = x^2 = x^3, а не, возможно, ожидаемая математическая сила.(Переменная, взаимодействующая с самим собой, является точно такой же переменной.) Если бы вы набрали (x+y)^2, интерпретатор R сгенерировал бы (для собственного хорошего внутреннего использования) не математическое: x^2 +2xy +y^2, а скорее символическое: x + y +x:y где x:y - это термин взаимодействия.

?formula

Функция I() выполняет преобразование аргумента в «as.is», то есть то, что вы ожидаете.Таким образом, я (x ^ 2) вернул бы вектор значений, возведенных во вторую степень.

~ следует рассматривать как выражение «распределяется как» или «зависит от» при рассмотрении в регрессиифункции.Это подразумевает термин ошибки в описании модели, который обычно помечается как «(Перехват)», и контекст функции и аргументы могут также дополнительно определять функцию связи, такую ​​как log () или logit ().

Символ «+» в формуле на самом деле не добавляет две переменные, а обычно является неявным запросом для вычисления коэффициента (ов) регрессии для этой переменной в контексте остальных переменных, которые находятся наRHS формулы.Функции регрессии используют `model.matrix, и эта функция распознает наличие формул или векторов символов в формуле и создает матрицу, расширяющую уровни дискретных компонентов формулы.

In plot () -Эта функция в основном инвертирует обычный ( x, y ) порядок аргументов, который обычно принимает функция plot.Был написан метод plot.formula, так что формулы можно использовать как более «математический» способ взаимодействия с R. В функциях graphics::plot.formula, curve и lattice и ggplot он определяет, насколько кратнокоэффициенты или числовые векторы отображаются и «огранены».

Позже я узнал, что ~ на самом деле является примитивной функцией с инфиксом (или префиксом), которая создает R-вызов, к которому можно обращаться с помощью операторов извлечения списка.Все это скрыто от обычного пользователя, но это может быть средство, используемое более продвинутыми авторами функций.

Перегрузка оператора "+" обсуждается в комментариях ниже и также выполняется при построении графиков.пакеты: ggplot2 и gridExtra, где он разделяет функции, которые доставляют результаты объекта, поэтому он действует и как сквозной и многоуровневый оператор.Функции агрегирования, которые имеют метод формулы, используют «+» как «расположение» и оператор группировки.

...