Оценивать строки для регрессии

#r #eval #lm #evaluation #expression-evaluation

#r #вычисление #lm #оценка #выражение-вычисление

Вопрос:

Из этих строк

 data = "mtcars"
y    = "mpg"
x    = c("cyl","disp")
  

Я пытаюсь выполнить линейную модель. Я пробовал такие вещи, как

 epp=function(x) eval(parse(text=paste0(x,collapse=" ")))

lm(data=epp(data),epp(y)~epp(x))
# Error in eval(expr, envir, enclos) : object 'cyl' not found
  

где последняя строка должна была быть эквивалентна

 lm(data=mtcars,mpg~cyl disp)
  

Комментарии:

1. Вы получите поток людей, говорящих вам просто не делать этого вообще, если вы не предоставите какой-либо подробный контекст, который, как я предполагаю, включает в себя какое-то приложение, которое запрашивает данные, аргументы x и y у пользователя, а затем запускает линейную модель? Объяснение этого контекста, вероятно, предотвратит недопонимание и, вероятно, приведет к лучшим ответам.

2. @joran Моя цель — создать функцию, которая выполняет пошаговый выбор модели для MCMCglmm.

3. В этом случае кажется ужасно странным, что вы будете передавать символьное представление имени фрейма данных, а не самого объекта.

4. Да, вы подходите для data.frame. Причина заключалась (1) частично в целях обучения и (2) в том, что не нужно было копировать весь data.frame при передаче в функцию (но время копирования в любом случае довольно незначительно). Теперь я изменил это.

Ответ №1:

Это включает в себя две операции, которые обе описаны в нескольких записях SO, которые используют, возможно, по отдельности функции get или as.formula :

 lm(data=get(data), 
   formula=as.formula( paste( y, "~", paste(x, collapse=" ") ) )
  )
  

В обоих случаях вы используете текстовый / символьный объект для возврата языкового объекта. В первом аргументе get возвращает ‘symbol’, который может быть вычислен, а во втором экземпляре as.formula возвращает объект ‘formula’. @blmoore прав, сообщив нам, что lm примет символьный объект, поэтому вызов as.formula здесь не нужен.

Комментарии:

1. Опереди меня в этом! Вы даже можете позволить lm выполнять приведение к формуле из символа

2. @Remi.b: Хранители чистоты R советуют нам избегать использования eval(parse(... , потому что обычно это метод приведения R в режим макрообработки программирования. Кому blmoore : Я не осознавал, что NSE перешел на lm обработку символьных значений, но я думаю, что на самом деле это не создает никакой двусмысленности.