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

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

Проблема в том, как интерпретируются формулы. В формуле тильда отделяет левую сторону от правой стороны. В формулах оператор ^ предназначен для построения взаимодействий, так что 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) вернет вектор значений, поднятых до второй мощности.

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

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

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

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