В формулах R, почему я должен использовать функцию I() на степенных членах, например, y ~ I(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) вернул бы вектор значений, возведенных во вторую степень.

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

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

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

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

Другие вопросы по тегам