您要做的是为回归创建一个包装函数。理想情况下,您应该对此进行编程,以便该函数可以接收任意数据集和指定的响应变量、控制变量和其他模型项,然后生成所有感兴趣的模型。
通常我们希望用户输入不带引号的变量名,并且我们使用deparse(substitute(...)) 将此输入的名称提取为“未计算的表达式”。对于回归中的其他模型项,由于可以有任意多个,因此合理的输入应该是字符向量列表。当您创建包装函数时,它通常会为感兴趣的模型构造一个“内部调用”,这可能与这些模型的标准调用不同。因此,您通常还需要修改模型的调用,使它们看起来像标准调用。所以,使用这种语法,你会写这样的东西:
myreg <- function(response, control, other.terms = NULL, data) {
#Get variable names and other terms
DATA.NAME <- deparse(substitute(data))
RESPONSE.NAME <- deparse(substitute(response))
CONTROL.NAME <- deparse(substitute(control))
if (is.null(other.terms)) {
OTHER <- vector(mode = 'list', length = 1) } else {
OTHER <- other.terms }
#Set formula and model objects
m <- length(OTHER)
FORMULAE <- vector(mode = 'list', length = m)
MODELS <- vector(mode = 'list', length = m)
names(MODELS) <- sprintf('MODEL%s', 1:m)
FORM <- paste(RESPONSE.NAME, '~', CONTROL.NAME)
#Fit models
for (i in 1:m) {
#Set the formula
if (is.null(OTHER[[i]])) {
FORMULAE[[i]] <- FORM } else {
FORMULAE[[i]] <- paste(FORM, '+', paste(OTHER[[i]], collapse = '+')) }
#Fit the model and substitute the call
MODELS[[i]] <- lm(formula(FORMULAE[[i]]), data = data)
CALL <- paste0('lm(formula = ', FORMULAE[[i]], ', data = ', DATA.NAME, ')')
MODELS[[i]]$call <- parse(text = CALL)[[1]] }
#Return the models
MODELS }
然后,您可以使用该函数生成具有指定变量的多个回归模型列表。这是一个示例,您生成了三个不同的模型,每个模型都具有相同的响应和控制变量,但模型中的附加项不同:
(MODELS <- myreg(response = hp,
control = cyl,
other.terms = list('mpg', 'wt', c('mpg', 'wt')),
data = mtcars))
$MODEL1
Call:
lm(formula = hp ~ cyl + mpg, data = mtcars)
Coefficients:
(Intercept) cyl mpg
54.067 23.979 -2.775
$MODEL2
Call:
lm(formula = hp ~ cyl + wt, data = mtcars)
Coefficients:
(Intercept) cyl wt
-51.81 31.39 1.33
$MODEL3
Call:
lm(formula = hp ~ cyl + mpg + wt, data = mtcars)
Coefficients:
(Intercept) cyl mpg wt
115.66 25.03 -4.22 -12.13