混合模型中协变量的正确语法,或者 lme/lmer 中的星号与斜线
Correct syntax for covariate in mixed models, or, asterisk vs. slash in lme/lmer
我正在对依赖于体型的生态数据进行回归分析,即体型应该是一个协变量。所以,我有两个分类变量,一个是连续变量。此外,两个随机效应(空间块结构,嵌套在其中的实验单元 - 都是分类的)。我正在使用 lme
和 lmer
,我的模型看起来像这样(在 lmer
-语法中):
dep-var ~ fix-var1(cat) * fix-var2(cat) * covariate(cont) + (1|block/exp-unit)
有人建议对 ANCOVA 模型使用斜杠 /
而不是星号 *
,因此公式看起来像
dep-var ~ fix-var1 * fix-var2 / covariate + (1|block/exp-unit)
然而,这给了我完全不同的输出,突然交互作用变得显着,主效应消失了。我无法找到有关这些运算符的使用之间的确切区别的详细信息。
谁能赐教吗?
与许多与 R 中模型公式的解释相关的问题一样,这个问题并不特定于混合模型,而是普遍适用于 R 的公式扩展机制。
在解释公式时弄清楚 R 在做什么的一个好方法是使用 model.matrix()
(它构建了 R 用来拟合模型的基础模型矩阵)并查看列名输出。
这是一个 2x2 因子设计的例子,加上一个协变量:
dd <- expand.grid(fv1=c("a","b"),
fv2=c("A","B"))
dd$covar <- 1:4
你的第一种方式:
colnames(model.matrix(~fv1*fv2*covar,dd))
## [1] "(Intercept)" "fv1b" "fv2B" "covar" "fv1b:fv2B"
## [6] "fv1b:covar" "fv2B:covar" "fv1b:fv2B:covar"
一共有8个参数((截距+斜率)x 2级fv1
x 2级fv2
)。模型参数化为(a,A)的截距((Intercept)
);根据因素 (b, B) 及其相互作用的截距差异; (a,A) 的斜率 (covar
);以及根据因素及其相互作用的斜率差异。
如果我们改用 / 会怎样?
colnames(model.matrix(~fv1*fv2/covar,dd))
## [1] "(Intercept)" "fv1b" "fv2B" "fv1b:fv2B" "fv1a:fv2A:covar"
## [6] "fv1b:fv2A:covar" "fv1a:fv2B:covar" "fv1b:fv2B:covar"
截距的参数化看起来相同,但斜率的参数化估计每个因子组合的单独斜率,而不是估计 (a,A) 的斜率和 b 的斜率与该基线的差异, B 及其相互作用。这很可能不是您想要的,除非您想针对零基线测试各个斜率(而不是测试跨因子组合的斜率之间的差异)。
如果您改为将模型指定为 ~(fv1*fv2)/covar
,则截距和斜率参数都会扩展为因子组合估计值,而不是因子间差异估计值。
colnames(model.matrix(~(fv1*fv2)/covar,dd))
## [1] "(Intercept)" "fv1b"
## [3] "fv2B" "fv1b:fv2B"
## [5] "fv1a:fv2A:covar" "fv1b:fv2A:covar"
## [7] "fv1a:fv2B:covar" "fv1b:fv2B:covar"
我正在对依赖于体型的生态数据进行回归分析,即体型应该是一个协变量。所以,我有两个分类变量,一个是连续变量。此外,两个随机效应(空间块结构,嵌套在其中的实验单元 - 都是分类的)。我正在使用 lme
和 lmer
,我的模型看起来像这样(在 lmer
-语法中):
dep-var ~ fix-var1(cat) * fix-var2(cat) * covariate(cont) + (1|block/exp-unit)
有人建议对 ANCOVA 模型使用斜杠 /
而不是星号 *
,因此公式看起来像
dep-var ~ fix-var1 * fix-var2 / covariate + (1|block/exp-unit)
然而,这给了我完全不同的输出,突然交互作用变得显着,主效应消失了。我无法找到有关这些运算符的使用之间的确切区别的详细信息。
谁能赐教吗?
与许多与 R 中模型公式的解释相关的问题一样,这个问题并不特定于混合模型,而是普遍适用于 R 的公式扩展机制。
在解释公式时弄清楚 R 在做什么的一个好方法是使用 model.matrix()
(它构建了 R 用来拟合模型的基础模型矩阵)并查看列名输出。
这是一个 2x2 因子设计的例子,加上一个协变量:
dd <- expand.grid(fv1=c("a","b"),
fv2=c("A","B"))
dd$covar <- 1:4
你的第一种方式:
colnames(model.matrix(~fv1*fv2*covar,dd))
## [1] "(Intercept)" "fv1b" "fv2B" "covar" "fv1b:fv2B"
## [6] "fv1b:covar" "fv2B:covar" "fv1b:fv2B:covar"
一共有8个参数((截距+斜率)x 2级fv1
x 2级fv2
)。模型参数化为(a,A)的截距((Intercept)
);根据因素 (b, B) 及其相互作用的截距差异; (a,A) 的斜率 (covar
);以及根据因素及其相互作用的斜率差异。
如果我们改用 / 会怎样?
colnames(model.matrix(~fv1*fv2/covar,dd))
## [1] "(Intercept)" "fv1b" "fv2B" "fv1b:fv2B" "fv1a:fv2A:covar"
## [6] "fv1b:fv2A:covar" "fv1a:fv2B:covar" "fv1b:fv2B:covar"
截距的参数化看起来相同,但斜率的参数化估计每个因子组合的单独斜率,而不是估计 (a,A) 的斜率和 b 的斜率与该基线的差异, B 及其相互作用。这很可能不是您想要的,除非您想针对零基线测试各个斜率(而不是测试跨因子组合的斜率之间的差异)。
如果您改为将模型指定为 ~(fv1*fv2)/covar
,则截距和斜率参数都会扩展为因子组合估计值,而不是因子间差异估计值。
colnames(model.matrix(~(fv1*fv2)/covar,dd))
## [1] "(Intercept)" "fv1b"
## [3] "fv2B" "fv1b:fv2B"
## [5] "fv1a:fv2A:covar" "fv1b:fv2A:covar"
## [7] "fv1a:fv2B:covar" "fv1b:fv2B:covar"