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