假设我们有以下型号:
set.seed(1)
d <- data.frame(a = gl(4, 1, 64), a4 = sample(4, 64, TRUE),
x = rnorm(64), y = rnorm(64))
l <- lm(y ~ a4 + a * x, d)
对于互动x:a
,我将得到3个系数x:a2, x:a3, x:a4
。我现在想确定哪些系数是与此交互相关的相应主效应,即x, a2, a3
和a4
。
我的想法是在交互上使用strsplit
并检索相应的主效果:
(atoms <- strsplit(names(coef(l))[7:9], ":"))
# [[1]]
# [1] "a2" "x"
# [[2]]
# [1] "a3" "x"
# [[3]]
# [1] "a4" "x"
到目前为止一切顺利。但是现在我想获得相应主效应的价值。虽然这对于x, a2, a3
来说是直截了当的(因为这些是唯一的名称),但我很难看到如何使用a4
执行此操作:
lapply(atoms, function(.) coef(l)[.])
# [[1]]
# a2 x
# 0.3630732 0.2136751
# [[2]]
# a3 x
# 0.04153299 0.21367510
# [[3]]
# a4 x
# 0.04765737 0.21367510
a4
的结果是错误的,因为它是与变量a4
相关联的主效应,而不是因子4
的虚拟编码因子a
。
所以,我展示的模型是R中的有效模型,但系数的名称是模糊的。那么有什么其他方法可以在交互系数和相应的主效应之间进行正确的映射吗?
答案 0 :(得分:1)
您可以使用assign
对象的lm
组件:
l$assign
[1] 0 1 2 2 2 3 4 4 4
这会将系数映射到扩展公式a4 + a + x + a:x
。
有关help("model.matrix")
组件的文档,请参阅assign
。
修改强>
要扩展我的答案,您可以这样做:
terms <- labels(terms(l))
coef(l)[l$assign %in% which(terms %in% strsplit("a:x", ":", fixed = TRUE)[[1]])]
# a2 a3 a4 x
#0.36307321 0.04153299 0.23383125 0.21367510