Понимание лм и окружающей среды - PullRequest
6 голосов
/ 29 июля 2011

Я выполняю lm() с аргументами formula, data, na.action и weights.Мои веса хранятся в числовой переменной.

  • Когда я задаю формулу в виде символа (то есть formula = "Response~0+."), я получаю сообщение об ошибке, что веса имеют неправильную длину (даже если это так).
  • Когда я указываю формулу без кавычек (т.е. formula = Response~0+.), функция работает нормально.

Я наткнулся на это предложение в документации lm():

Все веса, подмножество и смещение вычисляются так же, как переменные в формуле, то естьсначала в данных, а затем в среде формулы.

Мне трудно это интерпретировать, но я чувствую, что в нем содержится ответ на мой вопрос.

Ответы [ 2 ]

7 голосов
/ 30 июля 2011

Когда вы создаете аргумент, который должен быть формулой, анализатор "пробует это".Он «ожидает», что аргумент будет языковым вызовом в смысле R.Он не ожидает, что это будет символьная строка, разделенная кавычками.Вот почему вы увидите, как люди создают аргументы формулы с помощью paste (.), А затем заканчивают их, помещая строки или, более правильно, «символьный объект» в качестве аргумента as.formula ().То, что возвращается, получило класс «формулы» и режим «вызова»:

> class( as.formula("Y ~ x") )
[1] "formula"
> mode( as.formula("Y ~ x") )
[1] "call"s
> class( "Y ~ x")
[1] "character"
> mode( "Y ~ x")
[1] "character"
6 голосов
/ 30 июля 2011

(Это не имеет ничего общего с реальной проблемой, с которой вы столкнулись, [@DWin обратился к этому, как и комментаторы вашего Q], но в качестве пояснения части документации, которую вы цитируете)

Указанная справочная информация означает, что для поиска ссылок на переменные / объекты в формуле модели используется тот же процесс, что и для поиска переменных / объектов, переданных весам аргументов, подмножеству и т. Д.

R ищетобъекты, на которые есть ссылки в формуле, а также веса аргументов, подмножество и смещение, сначала в объекте данных, а затем в среде формулы (которая обычно является глобальной средой во время интерактивного использования).

Причина, по которойДокументы упоминают об этом явно потому, что lm(), как и во многих функциях R, которые используют интерфейсы модели-модели, используют так называемую стандартную нестандартную оценку.В результате, скажем, один из них предоставляет weights = foo, R не обязательно будет искать объект foo при оценке аргумента.Вместо этого он будет искать объект с именем foo в объекте, указанном в аргументе data, и если он его там не найдет, то в среде, связанной с формулой модели, которая, как уже упоминалось, нене всегда должна быть глобальная среда.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...