Использование ~ (тильда) в языке программирования R


187

Я видел в руководстве по моделированию регрессии следующую команду:

myFormula <- Species ~ Sepal.Length + Sepal.Width + Petal.Length + Petal.Width

Что именно делает эта команда, и какова роль ~(тильды) в команде?


Хотите поделиться ссылкой на учебник? Звучит интересно.
cheesus

1
@cheeesus ... Я изучал e-data data mining в R с помощью тематических исследований ... там можно найти еще много таких интересных примеров.
Анкита

Ответы:


193

Дело в правой части <-является formulaобъектом. Он часто используется для обозначения статистической модели, где слева от ~ответа находится ответ, а справа ~- объясняющие переменные. Таким образом, на английском языке вы бы сказали что-то вроде «Вид зависит от длины чашелистика, ширины чашечки, длины лепестка и ширины лепестка» .

myFormula <-Часть этой строки сохраняет формулу в объекте называется , myFormulaтак что вы можете использовать его в других частях R кода.


Другие распространенные виды использования формул в R

latticeПакет использует их , чтобы задать переменные для построения графика . Пакет использует их , чтобы указать панели для черчения . Пакет использует их для нестандартных evaulation .
ggplot2
dplyr


1
Для немного более обширного обсуждения: stackoverflow.com/questions/8055508/the-tilde-operator-in-r/…
IRTFM

Раздел «Формулы» lazyevalвиньетки дает хорошее представление о том, что такое формула
RobinL

82

R определяет оператор ~(тильда) для использования в формулах. Формулы имеют всевозможное применение, но, пожалуй, наиболее распространенным является регрессия:

library(datasets)
lm( myFormula, data=iris)

help("~")или help("formula")научит вас больше.

@Spacedman охватил основы. Давайте обсудим, как это работает.

Во-первых, будучи оператором, обратите внимание, что это по сути ярлык функции (с двумя аргументами):

> `~`(lhs,rhs)
lhs ~ rhs
> lhs ~ rhs
lhs ~ rhs

Это может быть полезно для использования, например, в applyсемейных командах.

Во-вторых, вы можете манипулировать формулой в виде текста :

oldform <- as.character(myFormula) # Get components
myFormula <- as.formula( paste( oldform[2], "Sepal.Length", sep="~" ) )

В-третьих, вы можете управлять им как списком :

myFormula[[2]]
myFormula[[3]]

Наконец, есть несколько полезных трюков с формулами (см. help("formula")Подробнее):

myFormula <- Species ~ . 

Например, приведенная выше версия совпадает с исходной версией, поскольку точка означает «все переменные, которые еще не используются». Он просматривает файл data.frame, который вы используете в своем возможном вызове модели, видит, какие переменные существуют в data.frame, но явно не упомянуты в вашей формуле, и заменяет точку этими отсутствующими переменными.


Спасибо за ответ @ Ари Б. Фридман, но последняя строка немного неоднозначна, где вы говорите, что точка означает «все переменные, которые еще не используются». Если бы вы могли проиллюстрировать это дальше.
Анкита

9
@Ankita, «еще не использованный» в данном контексте означает не упомянутый. В Species~., вид является единственной переменной, которая была использована. Следовательно, это зависит от каждой другой переменной в data.frame.
x4nd3r

Я не понимаю myFormula <- Species ~ . . Когда точка все еще будет заменена переменными из data.frame? Не могли бы вы привести пример
srghma
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.