В качестве альтернативы вы можете использовать функцию:

линных и повторяющихся моделей я хочу создать «макрос» (так называемый в Stata и там выполняется сglobal var1 var2 ...) который содержитрегрессоры модельной формулы.

Например из

library(car)
lm(income ~ education + prestige, data = Duncan)

Я хочу что-то вроде:

regressors <- c("education", "prestige")
lm(income ~ @regressors, data = Duncan)  

Я мог бы найти этоэтот подход, Но мое приложение на регрессоры не будет работать:

reg = lm(income ~ bquote(y ~ .(regressors)), data = Duncan)

как это меня кидает

Error in model.frame.default(formula = y ~ bquote(.y ~ (regressors)), data =
Duncan,  :  invalid type (language) for variable 'bquote(.y ~ (regressors))'

Даже принятый ответ на тот же вопрос:

lm(formula(paste('var ~ ', regressors)), data = Duncan)

поражает и показывает мне:

Error in model.frame.default(formula = formula(paste("var ~ ", regressors)),
: object is not a matrix`. 

И конечно я попробовалas.matrix(regressors) :)

Итак, что еще я могу сделать?

 jay.sf07 окт. 2017 г., 11:48
Кстати, поскольку мы не должны называть это «макро», как мы называем это в R?
 joran07 окт. 2017 г., 03:11
Просто используйте другой ответ на этот вопрос. Я не уверен, насколько легко будет bquote адаптироваться к переменному числу ковариат.
 jay.sf07 окт. 2017 г., 03:42
@joran: тоже не сработало, я сформулировал сообщение об ошибке в своем вопросе, которое теперь также сделал немного более воспроизводимым.
 Nick Cox11 окт. 2017 г., 10:13
FWIW, используяglobal например, хранение имен переменных часто считается плохим стилем в сообществе Stata. Есть много лучших способов передавать списки имен между программами или командами или другими частями кода по необходимости.
 joran07 окт. 2017 г., 05:35
Несколько примеров ниже того, как работает ответ, на который я ссылался. Не сдавайся так легко! ;)

Ответы на вопрос(2)

Для сценария, который вы описали, гдеregressors находится в глобальной среде, вы можете использовать:

lm(as.formula(paste("income~", paste(regressors, collapse="+"))), data = 
Duncan)

В качестве альтернативы вы можете использовать функцию:

modincome <- function(regressors){
    lm(as.formula(paste("income~", paste(regressors, collapse="+"))), data = 
Duncan)  
}

modincome(c("education", "prestige"))
Решение Вопроса

1) переформулировать

fo <- reformulate(regressors, response = "income")
lm(fo, Duncan)

или, возможно, вы захотите написать последнюю строку, чтобы эта формула выглядела лучше:

do.call("lm", list(fo, quote(Duncan)))

в этом случае строка Call: выводится, как и ожидалось, а именно:

Call:
lm(formula = income ~ education + prestige, data = Duncan)

2) лм (датафрейм)

lm( Duncan[c("income", regressors)] )

Вызов Call: строка выглядит следующим образом:

Call:
lm(formula = Duncan[c("income", regressors)])

но мы можем заставить его выглядеть точно так же, как вdo.call решение в (1) с этим кодом:

fo <- formula(model.frame(income ~., Duncan[c("income", regressors)]))
do.call("lm", list(fo, quote(Duncan)))

3) точка

Альтернатива, аналогичная предложенной @jenesaisquoi в комментариях:

lm(income ~., Duncan[c("income", regressors)])

Подход, обсуждаемый в (2) к Call: output, также работает здесь.

4) фн Предварительное указание функции с помощью fn $ включает интерполяцию строк в ее аргументах. Это решение почти идентично желаемому синтаксису, показанному в вопросе, использующему $ вместо @ для выполнения подстановки, и гибкая подстановка может легко распространяться на более сложные сценарии.quote(Duncan) в коде может быть написано простоDuncan и он все еще будет работать, но вызов: показано вlm вывод будет выглядеть лучше, если вы используетеquote(Duncan).

library(gsubfn)

rhs <- paste(regressors, collapse = "+")
fn$lm("income ~ $rhs", quote(Duncan))

Линия Call: выглядит практически идентичноdo.call Решения выше - отличаются только пробел и кавычки:

Call:
lm(formula = "income ~ education+prestige", data = Duncan)

Если вы хотели абсолютно то же самое, тогда:

fo <- fn$formula("income ~ $rhs")
do.call("lm", list(fo, quote(Duncan)))
 G. Grothendieck07 окт. 2017 г., 12:39
Я добавил информацию о Call: выход для всех решений.
 jay.sf07 окт. 2017 г., 11:15
Из-за самого ясногоCall: Выведите ваш номер один мой. Вероятно, другие решения тоже могут быть улучшены в некотором роде.

Ваш ответ на вопрос