在使用 lm() 时控制交互项中虚拟变量的值(TRUE 或 FALSE)

use*_*473 5 r

当我估计一个模型,它在两个变量之间存在交互作用,而这些变量不作为独立变量进入模型,并且当这些变量之一是虚拟(“逻辑”类)变量时,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(),但我看不出它们在这里会有所作为。

mne*_*nel 3

dHeightlogical​ 在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 可以认识到cGirthGirth是共线的,因此我们可以记住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:dHeightcGirthGirth线的情况,并且考虑到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没有一个读心解析器可以告诉给定的cGirthGirth是共线的,当你拟合这两个术语的交互时,它会假设第二个级别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 个参数。