R中nlme线性混合模型中相互作用显着性的检验

时间:2013-07-22 18:26:39

标签: r mixed-models

我在lme R包中使用nlme函数来测试因子items的级别是否与因子condition的级别有显着的交互。因子condition有两个级别:ControlTreatment,因子items有3个级别:E1,...,E3。我使用以下代码:

f.lme = lme(response ~ 0 + factor(condition) * factor(items), random = ~1|subject)

其中subject是随机效应。这样,当我跑:

summary(f.lme)$tTable

我将得到以下输出:

factor(condition)Control  
factor(condition)Treatment  
factor(items)E2
factor(items)E3
factor(condition)Treatment:factor(items)E2
factor(condition)Treatment:factor(items)E3

Value, Std.Error, DF, t-value, p-value列一起使用。我有两个问题:

  1. 如果我想比较ControlTreatment,我是否应该在estimable()中使用gmodels函数并对(-1,1,0,0,0,0)进行对比

  2. 我对items的{​​{1}}级别E1, E2, E3的级别是否有所不同感兴趣,所以我对交互条件是否重要感兴趣(只需检查condition列??):

    p-value

  3. 但是,如何判断factor(condition)Treatment:factor(items)E2 factor(condition)Treatment:factor(items)E3是否重要?它没有显示在摘要输出中,我认为它与R中使用的对比度有关...非常感谢!

3 个答案:

答案 0 :(得分:5)

我恭敬地不同意@ sven-hohenstein

  

在R中,分类变量的默认编码是治疗对比度编码。在治疗对比中,第一级是参考水平。将所有剩余因子水平与参考水平进行比较。

首先,此处使用零截距... ~ 0 + ...指定固定效果。这意味着condition编码不再是contr.treatment。如果我没有弄错的话,ControlTreatment的主要影响现在可以解释为它们各自偏离群体的意思......

  

在您的模型中,要素项目有三个级别:E1,E2和E3。两个对比测试了(a)E2和E1,以及(b)E3和E1之间的差异。这些对比的主要影响是对因子条件的控制水平进行估计,因为这是该因子的参考类别。

...当items的值达到E1的参考水平时!因此:

  • 主要效果Control = Control:E1次观察偏离项E1的平均值。
  • 主要效果Treatment = Treatment:E1次观察偏离项E1的平均值。
  • 主要效果E2 = Control:E2次观察偏离项E2的平均值。
  • 主要效果E3 = Control次观察偏离项E3的平均值。
  • 互动Treatment:E2 = Treatment:E2次观察偏离项目E2的平均值
  • 互动Treatment:E3 = Treatment:E3次观察偏离项E3的平均值。

感谢指向estimable的指针,我之前没有尝试过。对于自定义对比,我来自multcomp包中的(ab)using glht

答案 1 :(得分:5)

您需要先解决有关互动的第二个问题。您当然可以像Jan van der Laan的答案那样设置似然比检验。您也可以直接在适合的lme对象上使用anova。有关详细信息,请参阅anova.lme的帮助页面。

在解释系数方面,我经常发现有时需要制作组均值的汇总表,以便适当地确定模型中哪个系数的线性组合代表每个组。我将在你的问题中展示拦截移除的一个例子,虽然我发现一旦我在模型中有两个因素,这很少帮助我弄清楚我的系数。这是我对Orthodont数据集(我决定平衡)的意思的一个例子:

require(nlme)

# Make dataset balanced
Orthodont2 = Orthodont[-c(45:64),]
# Factor age
Orthodont2$fage = factor(Orthodont2$age)

# Create a model with an interaction using lme; remove the intercept
fit1 = lme(distance ~ Sex*fage - 1, random = ~1|Subject, data = Orthodont2)
summary(fit1)

以下是估计的固定效果。但是这些系数中的每一个代表什么呢?

Fixed effects: distance ~ Sex * fage - 1 
                     Value Std.Error DF  t-value p-value
SexMale          23.636364 0.7108225 20 33.25213  0.0000
SexFemale        21.181818 0.7108225 20 29.79903  0.0000
fage10            0.136364 0.5283622 61  0.25809  0.7972
fage12            2.409091 0.5283622 61  4.55954  0.0000
fage14            3.727273 0.5283622 61  7.05439  0.0000
SexFemale:fage10  0.909091 0.7472171 61  1.21664  0.2284
SexFemale:fage12 -0.500000 0.7472171 61 -0.66915  0.5059
SexFemale:fage14 -0.818182 0.7472171 61 -1.09497  0.2778

汇总群体意味着有助于解决这个问题。

require(plyr)
ddply(Orthodont2, .(Sex, age), summarise, dist = mean(distance) )

     Sex fage     dist
1   Male    8 23.63636
2   Male   10 23.77273
3   Male   12 26.04545
4   Male   14 27.36364
5 Female    8 21.18182
6 Female   10 22.22727
7 Female   12 23.09091
8 Female   14 24.09091

请注意,第一个固定效应系数,称为SexMale,是8岁男性的平均距离。固定效应SexFemale是8岁女性平均距离。这些是最容易看到的(我总是从简单的开始),但其余的并不是很难搞清楚。 10岁男性的平均距离是第一个系数加上第三个系数(fage10)。 10岁女性的平均距离是系数SexFemalefage10SexFemale:fage10的总和。其余的则遵循相同的路线。

一旦您知道如何为群组创建系数的线性组合,您就可以使用estimable来计算任何感兴趣的比较。当然,这里有一些关于主效应,相互作用的统计证据,离开交互的理论原因等等的警告。这是由您决定的。但是,如果我在模型中离开交互(请注意,没有关于交互的统计证据,请参阅anova(fit1)),但又希望比较MaleFemale的总体平均值,I会写出以下系数的线性组合:

# male/age group means
male8 = c(1, 0, 0, 0, 0, 0, 0, 0)
male10 = c(1, 0, 1, 0, 0, 0, 0, 0)
male12 = c(1, 0, 0, 1, 0, 0, 0, 0)
male14 = c(1, 0, 0, 0, 1, 0, 0, 0)

# female/age group means
female8 = c(0, 1, 0, 0, 0, 0, 0, 0)
female10 = c(0, 1, 1, 0, 0, 1, 0, 0)
female12 = c(0, 1, 0, 1, 0, 0, 1, 0)
female14 = c(0, 1, 0, 0, 1, 0, 0, 1)

# overall male group mean
male = (male8 + male10 + male12 +male14)/4
# overall female group mean
female = (female8 + female10 + female12 + female14)/4

require(gmodels)
estimable(fit1, rbind(male - female))

您可以检查整体组,这意味着要确保正确地进行系数的线性组合。

ddply(Orthodont2, .(Sex), summarise, dist = mean(distance) )

     Sex     dist
1   Male 25.20455
2 Female 22.64773

答案 2 :(得分:3)

测试互动是否重要的​​常用方法是进行似然比检验(例如,见discussion on R-Sig-ME)。

要做到这一点,你还必须估算一个没有互动的模型,你还必须使用method="ML"

f0 = lme(response ~ 0 + factor(condition) * factor(items),
    random = ~1|subject, method="ML")
f1 = lme(response ~ 0 + factor(condition) + factor(items),
    random = ~1|subject, method="ML")

然后,您可以使用anova进行比较:

anova(f0, f1)

另见this blog post