如何将参数作为字符传递给函数中的函数?

时间:2013-04-26 05:27:56

标签: r lapply lm

我正在尝试根据数据中不同类别的子集创建一系列模型。我没有创建一堆单独的模型对象,而是使用lapply()根据我的类别因子的每个级别的子集创建模型列表,如下所示:

test.data <- data.frame(y=rnorm(100), x1=rnorm(100), x2=rnorm(100), category=rep(c("A", "B"), 2))

run.individual.models <- function(x) {
  lm(y ~ x1 + x2, data=test.data, subset=(category==x))
}

individual.models <- lapply(levels(test.data$category), FUN=run.individual.models)
individual.models

# [[1]]

# Call:
# lm(formula = y ~ x1 + x2, data = test.data, subset = (category == 
#     x))

# Coefficients:
# (Intercept)           x1           x2  
#     0.10852     -0.09329      0.11365
# ....

这非常有效,除了模型调用显示subset = (category == x)而不是category == "A"等。这使得将它们用于诊断目的更加困难(很难记住列表中的哪个模型对应于哪个类别)和predict()等功能。

有没有办法将x的实际字符值替换为lm()调用,以便模型不会在调用中使用原始x

1 个答案:

答案 0 :(得分:3)

沿着Explicit formula used in linear regression

的路线

使用bquote构建通话

run.individual.models <- function(x) {
  lmc <- bquote(lm(y ~ x1 + x2, data=test.data, subset=(category==.(x))))
  eval(lmc)
}

individual.models <- lapply(levels(test.data$category), FUN=run.individual.models)
individual.models

[[1]]

Call:
lm(formula = y ~ x1 + x2, data = test.data, subset = (category == 
    "A"))

Coefficients:
(Intercept)           x1           x2  
   -0.08434      0.05881      0.07695  


[[2]]

Call:
lm(formula = y ~ x1 + x2, data = test.data, subset = (category == 
    "B"))

Coefficients:
(Intercept)           x1           x2  
     0.1251      -0.1854      -0.1609