2

我正在尝试根据我的数据中不同类别的子集创建一系列模型。我不是创建一堆单独的模型对象,而是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()

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

4

1 回答 1

3

沿着线性回归中使用的显式公式

用于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 
于 2013-04-26T05:35:35.890 回答