确定哪种主要效应属于哪种相互作用

时间:2016-03-23 11:41:33

标签: r interaction

假设我们有以下型号:

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, a3a4

我的想法是在交互上使用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中的有效模型,但系数的名称是模糊的。那么有什么其他方法可以在交互系数和相应的主效应之间进行正确的映射吗?

1 个答案:

答案 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