【发布时间】:2016-03-21 23:40:34
【问题描述】:
我想自动确定lm 中的哪些系数属于一个因子。所以假设我有以下模型:
d <- data.frame(a = gl(4, 2, 16), b = gl(2, 1, 16),
x = runif(16), y = runif(16), Y = runif(16))
l1 <- lm(Y ~ a + b + x + y, data = d)
l2 <- lm(Y ~ x + y, data = d)
那么第一个模型的系数名称如下:
names(coef(l1))
# [1] "(Intercept)" "a2" "a3" "a4" "b2"
# [6] "x" "y"
现在理想情况下,我想要一个函数告诉我a2, a3, a4和b2是虚拟编码因子的系数。
对于不包含任何因子的模型(如l2),输出应为NULL。
我查看了str(l1),发现有一个插槽xlevels(如果模型中存在因子)。我可以使用names(l1$xlevels) 来获取模型中所有因子的列表,然后在系数名称上使用grep:
names(coef(l1))[unlist(sapply(names(l1$xlevels), function(.) grep(., names(coef(l1)))))]
# [1] "a2" "a3" "a4" "b2"
但在我看来,这似乎是一个非常肮脏的解决方法,并且一旦我的模型中有相似的名称就不会起作用:
d$a4 <- runif(16)
l3 <- update(l1, . ~ . + a4, data = d)
names(coef(l3))[unlist(sapply(names(l3$xlevels), function(.) grep(., names(coef(l3)))))]
# [1] "a2" "a3" "a4" "a4" "b2"
此外,更改默认对比度将更改我模型中虚拟系数的名称,因此即使是处理系数名称的最精细策略也可能行不通。
长话短说:如何获得属于某个因子的所有系数的列表?
【问题讨论】:
-
l3$assign将能够显示组以区分两个"a4"系数。