这并不是一个真正的混合模型特定问题:相反,它与 R 从公式构造模型矩阵的方式有关(并且可能与模型比较的逻辑有关)。
让我们把范围缩小到之间的比较
form1 <- ~ psource + cond + psource:cond
和
form2 <- ~ psource + cond + psource:cond - psource
(相当于~cond + psource:cond)。这两个公式给出了等效模型矩阵,即具有相同列数、跨越相同设计空间并给出相同整体拟合优度的模型矩阵。
组成一个最小的数据集进行探索:
dd <- expand.grid(psource=c("A","B"),cond=c("a","b"))
每个公式都有哪些构造变量?
colnames(model.matrix(form1,data=dd))
## [1] "(Intercept)" "psourceB" "condb" "psourceB:condb"
colnames(model.matrix(form2,data=dd))
## [1] "(Intercept)" "condb" "psourceB:conda" "psourceB:condb"
我们得到相同数量的对比。
这个问题有两种可能的反应。
有一种思想流派(以 Nelder、Venables 等为代表:例如,参见 Venables 的著名 (?) 但未发表的 exegeses on linear models,第 5 节或维基百科上的 principle of marginality)说在存在交互项的情况下尝试测试主效应是没有意义的,而这正是您正在尝试做的。
存在 偶尔 的情况(例如,在控制和影响之间的“之前”差异由于实验协议而已知为零的前后控制影响设计中),其中你真的想做这个比较。在这种情况下,您必须制作自己的虚拟变量并将它们添加到您的数据中,例如
## set up model matrix and drop intercept and "psourceB" column
dummies <- model.matrix(form1,data=dd)[,-(1:2)]
## d='dummy': avoid colons in column names
colnames(dummies) <- c("d_cond","d_source_by_cond")
colnames(model.matrix(~d_cond+d_source_by_cond,data.frame(dd,dummies)))
## [1] "(Intercept)" "d_cond" "d_source_by_cond"
这很麻烦。我猜测这很困难的原因是 R 和 S 在它之前的原始作者来自思想流派 #1,并且认为通常当人们试图这样做时这是一个错误;他们并没有让它变得不可能,但他们并没有竭尽全力让它变得容易。