当我估计一个模型,它在两个变量之间存在交互作用,而这些变量不作为独立变量进入模型,并且当这些变量之一是虚拟(“逻辑”类)变量时,R 会“翻转虚拟变量的符号” . 也就是说,当虚拟变量为 FALSE 时,它报告交互项系数的估计,而不是当它为 TRUE 时。下面是一个例子:
data(trees)
trees$dHeight <- trees$Height > 76
trees$cGirth <- trees$Girth - mean(trees$Girth)
lm(Volume ~ Girth + Girth:dHeight, data = trees) # estimate is for Girth:dHeightTRUE
lm(Volume ~ Girth + cGirth:dHeight, data = trees) # estimate is for cGirth:dHeightFALSE
Run Code Online (Sandbox Code Playgroud)
为什么最后一行中的回归对交互作用的估计dHeight是 FALSE 而不是 TRUE?(当 dHeight 为 TRUE 时,我希望 R 报告估计值。)
这不是一个大问题,但我想更好地理解为什么 R 正在做它正在做的事情。我知道relevel()和contrasts(),但我看不出它们在这里会有所作为。
是dHeight。logical 在model此强制为一个因子,并且级别按字典顺序排序(即 F 在 T 之前)。
正如 @hongooi 的回答中所述,您无法估计 4 个参数,因此 R 会按照术语出现的顺序来拟合这些术语(FALSE before TRUE)
如果您想首先强制R拟合该TRUE值,您可以将模型拟合到!dHeight
lm(formula = Volume ~ Girth + cGirth:!dHeight, data = trees)
Run Code Online (Sandbox Code Playgroud)
请注意,这!dHeightFALSE相当于dHeightTRUE
您还会注意到,在这个简单的情况下,您只需更改系数上的符号,因此适合哪个模型并不重要。
编辑一个更好的方法
R 可以认识到cGirth和Girth是共线的,因此我们可以记住a/b展开为a + a:b
lm(formula = Volume ~ Girth + cGirth/dHeight, data = trees)
Coefficients:
(Intercept) Girth cGirth cGirth:dHeightTRUE
-27.198 4.251 NA 1.286
Run Code Online (Sandbox Code Playgroud)
这为系数提供了易于解释的名称,并且R显然无法返回系数cGirth
R当它们都是作为“主效应”或独立项的模型时,可以看出Girth和是共线的。cGirth
没有办法R能够判断拟合时Girth + cGirth:dHeight和cGirth共Girth线的情况,并且考虑到dHeight我们希望cGirthdHeightTRUE成为您拟合的系数是合乎逻辑的。(如果您确实愿意,您可以编写自己的公式解析器来执行此操作)
另一种适合您想要的模型并且没有任何共线项的方法是使用
lm(formula = Volume ~ Girth + I(cGirth*dHeight), data = trees)
Run Code Online (Sandbox Code Playgroud)
强制转换dHeight为数字 ( TRUE becomes 1)。
编辑以强调这一点。
当你适合的时候~Girth + Girth:dHeight
Girth你所说的是+ 调整有一个主要影响dHeight。R 将因子的第一水平视为参考水平。的斜率dHeightFALSE只是 的值Girth,然后您可以调整何时dHeight == TRUE(周长:dHeightTRUE)。
当你拟合时~Girth + cGirth:dHeight——R没有一个读心解析器可以告诉给定的cGirth和Girth是共线的,当你拟合这两个术语的交互时,它会假设第二个级别dHeight现在是参考级别)
想象一下,如果你有一个与以下完全无关的变量Girth
例如
set.seed(1)
trees$cG <- runif(nrow(trees))
Run Code Online (Sandbox Code Playgroud)
然后当你拟合时Girth + cG:dHeight,你会得到4个估计参数
lm(formula = Volume ~ Girth + cG:dHeight, data = trees)
Call:
lm(formula = Volume ~ Girth + cG:dHeight, data = trees)
Coefficients:
(Intercept) Girth cG:dHeightFALSE cG:dHeightTRUE
-31.79645 4.79435 -5.92168 0.09578
Run Code Online (Sandbox Code Playgroud)
这是明智的。
当R处理时Girth + cGirth:dHeight,它将展开(首先是因子的第一级)1 + Girth + cGirth:dHeightFALSE + cGirth:dHeightTRUE——并且会发现它无法估计所有 4 个参数,并且将估计前 3 个参数。