混合效应模型:比较分组变量各个级别的随机方差分量


14

假设我有参与者,每个参与者给出响应20次,一种情况为10次,另一种情况为10次。我拟合了一个线性混合效应模型,比较了每种情况下的这是一个可重现的示例,使用中的包来模拟这种情况:ÿ ÿNYYlme4R

library(lme4)
fml <- "~ condition + (condition | participant_id)"
d <- expand.grid(participant_id=1:40, trial_num=1:10)
d <- rbind(cbind(d, condition="control"), cbind(d, condition="experimental"))

set.seed(23432)
d <- cbind(d, simulate(formula(fml), 
                       newparams=list(beta=c(0, .5), 
                                      theta=c(.5, 0, 0), 
                                      sigma=1), 
                       family=gaussian, 
                       newdata=d))

m <- lmer(paste("sim_1 ", fml), data=d)
summary(m)

该模型m产生两个固定效应(条件的截距和斜率)和三个随机效应(参与者的随机截距,条件的参与者随机斜率和截距-斜率相关性)。

我想在统计上比较由定义的各组参与者的随机截距方差的大小condition(即,在对照和实验条件下分别计算以红色突出显示的方差分量,然后测试各分量的大小是否存在差异不为零)。我将如何做(最好在R中)?

在此处输入图片说明


奖金

假设该模型稍微复杂一些:参与者各自经历10次刺激,每次20次,一种情况发生10次,另一种情况发生10次。因此,有两组交叉的随机效应:参与者的随机效应和刺激的随机效应。这是一个可重现的示例:

library(lme4)
fml <- "~ condition + (condition | participant_id) + (condition | stimulus_id)"
d <- expand.grid(participant_id=1:40, stimulus_id=1:10, trial_num=1:10)
d <- rbind(cbind(d, condition="control"), cbind(d, condition="experimental"))

set.seed(23432)
d <- cbind(d, simulate(formula(fml), 
                       newparams=list(beta=c(0, .5), 
                                      theta=c(.5, 0, 0, .5, 0, 0), 
                                      sigma=1), 
                       family=gaussian, 
                       newdata=d))

m <- lmer(paste("sim_1 ", fml), data=d)
summary(m)

我想在统计上比较定义的各组之间随机的参与者截距方差的大小condition。我该怎么做,该过程与上述情况有什么不同?


编辑

为了更具体地说明我要寻找的内容,我想知道:

  1. 问题“是否明确定义了一个问题(即,每个条件内的条件均值响应(即,每个条件中的随机截距值)是否彼此之间都大不相同,超出了我们由于采样误差所期望的范围”?甚至在理论上是负责任的)?如果没有,为什么不呢?
  2. 如果对问题(1)的回答为是,我将如何回答?我希望有一个R实现,但我并不依赖于该lme4程序包-例如,该OpenMx程序包似乎具有容纳多组和多级分析的能力(https://openmx.ssri.psu。 edu / openmx-features),这似乎是在SEM框架中应该回答的问题。

1
@MarkWhite,我已根据您的评论更新了问题。我的意思是,我想比较参与者截距在控制条件下做出响应和实验条件下做出响应时的标准偏差。我想这样做统计,即测试如果在拦截的标准偏差的差值为0不同
帕特里克S. Forscher

2
我写了一个答案,但是会睡在上面,因为我不确定它是否很有用。问题归结为我认为没有人能做到您所要求的。拦截的随机效应是参与者处于控制状态时其均值的方差。因此,人们无法在实验条件下查看观测值的方差。截距是在人员级别上定义的,条件是在观察级别上。如果您要比较条件之间的方差,我会考虑条件异方差模型。
马克·怀特

2
我正在研究论文的修订并重新提交,我的参与者对一组刺激做出了回应。每个参与者都受到多种条件的影响,每种刺激都会在多种条件下产生响应-换句话说,我的研究模仿了我在“奖金”说明中描述的设置。在我的一张图表中,似乎参与者的平均反应在其中一种情况下比其他情况具有更大的变异性。审阅者要求我测试是否正确。
Patrick S. Forscher '18年

2
请参阅stats.stackexchange.com/questions/322213,了解如何为分组变量的每个级别使用不同的方差参数设置lme4模型。我不确定如何对两个方差参数是否相等进行假设检验;就我个人而言,我总是喜欢引导对象和刺激来获得置信区间,或者也许要建立某种类似排列(基于重采样)的假设检验。
变形虫说恢复莫妮卡

3
我同意@MarkWhite的评论,即“随机截距方差是否彼此实质性不同...”这个问题充其量是不清楚的,最坏的情况是无意义的,因为该截距必定是指特定组中的Y值(即分组将值分配为0),因此严格地说,在各个分组之间比较“拦截”没有任何意义。我认为,更好的表述您的问题的方法将是:“参与者在条件A与条件B之间的条件均值响应方差是否相等?”
Jake Westfall '18

Answers:


6

有多种方法可以检验这个假设。例如,@ amoeba概述的过程应该起作用。但在我看来,最简单,最便捷的测试方法是使用比较两个嵌套模型的旧的似然比测试。这种方法的唯一可能棘手的部分是知道如何设置一对模型,以便删除单个参数将干净地测试期望的不相等方差假设。下面我解释了如何做到这一点。

简短答案

切换到自变量的对比(总和为零)编码,然后进行似然比测试,将完整模型与强制随机斜率和随机截距之间的相关性为0的模型进行比较:

# switch to numeric (not factor) contrast codes
d$contrast <- 2*(d$condition == 'experimental') - 1

# reduced model without correlation parameter
mod1 <- lmer(sim_1 ~ contrast + (contrast || participant_id), data=d)

# full model with correlation parameter
mod2 <- lmer(sim_1 ~ contrast + (contrast | participant_id), data=d)

# likelihood ratio test
anova(mod1, mod2)

视觉解释/直觉

为了使该答案有意义,您需要对相关参数对观察到的数据意味着什么具有直观的了解。考虑(随机变化的)特定于受试者的回归线。基本上,相关参数控制参与者回归线相对于点而言是“向右扇出”(正相关)还是“向左扇出”(负相关),其中X是您的对比编码独立变量。这些都暗示参与者的条件均值响应中存在不均等的方差。如下图所示:X=0

随机相关

在此图中,我们忽略了在每种情况下对每个受试者的多次观察,而是仅绘制了每个受试者的两个随机平均值,并用一条直线将它们连接起来,表示该受试者的随机斜率。(这是来自10个假设主题的数据,而不是OP中发布的数据。)

在左侧列中,存在很强的负斜率-截距相关性,回归线相对于点呈扇形散布到左侧。正如可以在图中清楚地看到,这会导致更大的方差在受试者的病情随机手段比条件X=0X = 1 X = 1X=1X=1

右侧的列显示了此图案的反向镜像。在这种情况下,与条件相比,条件的受试者随机平均值方差更大。X=1X=1

中间的列显示了当随机斜率和随机截距不相关时会发生什么。这意味着相对于点,回归线向右扇出的数量与向右扇出的数量完全相同。这意味着在两个条件下受试者均值的方差相等。X=0

在这里至关重要的是,我们使用了零和的对比度编码方案,而不是伪代码(即,未将组设置为和)。它是在对比度编码方案,我们有这个关系,其中,所述方差是相同的,当且仅当斜率截距相关为0以下尝试该图来构建直觉:X=0X=1

在此处输入图片说明

该图显示的是两列中完全相同的数据集,但是自变量编码的方式不同。在左侧的列中,我们使用对比代码-这正是第一个图中的情况。在右侧的列中,我们使用伪代码。这改变了拦截的含义-现在,拦截代表了对照组中受试者的预测反应。底部面板显示了此更改的结果,即,即使在深度上数据相同且两种情况下的条件方差都相等,斜率截距相关性也不再接近0。如果这似乎仍然没有多大意义,那么在我之前对这个现象的更多研究中,我可能会对此有所帮助。

证明

令为条件下第个对象的第个响应。(这里我们只有两个条件,因此仅为1或2。)然后可以将混合模型写为 其中是对象的随机截距并具有方差,是对象的随机斜率,并具有方差,是观察级误差项,并且。yijkjikk

yijk=αi+βixk+eijk,
αiσα2βiσβ2eijkcov(αi,βi)=σαβ

我们希望证明

var(αi+βix1)=var(αi+βix2)σαβ=0.

从这个含义的左侧,我们有

var(αi+βix1)=var(αi+βix2)σα2+x12σβ2+2x1σαβ=σα2+x22σβ2+2x2σαβσβ2(x12x22)+2σαβ(x1x2)=0.

零和对比码表示且。然后,我们可以进一步将上面的最后一行缩小为 ,这就是我们想要证明的。(要确定含义的另一个方向,我们可以相反地遵循这些相同的步骤。)x1+x2=0x12=x22=x2

σβ2(x2x2)+2σαβ(x1+x1)=0σαβ=0,

重申一下,这表明如果对独立变量进行了对比(总和为零)编码,则当且仅当随机斜率和随机截距之间的相关性为0时,受试者在各个条件下的随机均值方差相等。从所有这一切得出的结论是,检验的零假设将测试OP描述的等方差的零假设。σαβ=0

如果自变量是伪编码的,则此方法不起作用。具体来说,如果将值和插入上述方程式,则会发现 x1=0x2=1

var(αi)=var(αi+βi)σαβ=σβ22.


这已经是一个了不起的答案,谢谢!我认为这最接近回答我的问题,所以我接受它并给予您赏金(它即将到期),但是如果您有时间和精力,我希望看到一个代数论证。
帕特里克·福舍尔

1
@ PatrickS.Forscher我刚刚添加了一个证据
Jake Westfall

1
@JakeWestfall在我的玩具示例中,受试者在两种情况下的反应都发生了翻转。如果一个对象在条件A下有反应,在条件B 下有,那么当我们使用模型时,该对象的随机拦截的BLUP值是多少?我认为只能是0。如果所有对象的BLUP都等于零,那么随机截距的方差也为零。因此,该模型根本无法适合该玩具示例。相比之下,上面定义的模型过孔将为每个主题有两个BLUP,并且它们很容易是和。我在这里想念什么吗?aa(1 | subject)dummyaa
变形虫说恢复莫妮卡

1
我现在知道您是对的@amoeba,感谢您的解释。我将相应地编辑答案。
Jake Westfall

1
@amoeba是正确的,即使模型中没有相关参数,BLUP也可能相关。但我认为,出于测试目的,该过程仍然可以按预期进行(例如,它具有名义上的1类错误率),因为只有具有相关性参数的模型才能将其合并到似然函数中,并因此“获得信用” 。也就是说,即使在更简单的模型中BLUP相互关联,但就总可能性而言,效果似乎仍然是不相关的,因此LR测试将起作用。我认为:)
杰克·韦斯特伦

6

您可以借助lme4软件包具有功能的估计置信区间来测试模型参数的重要性confint.merMod

引导程序(例如,参见Bootstrap中的Confidence Interval

> confint(m, method="boot", nsim=500, oldNames= FALSE)
Computing bootstrap confidence intervals ...
                                                           2.5 %     97.5 %
sd_(Intercept)|participant_id                         0.32764600 0.64763277
cor_conditionexperimental.(Intercept)|participant_id -1.00000000 1.00000000
sd_conditionexperimental|participant_id               0.02249989 0.46871800
sigma                                                 0.97933979 1.08314696
(Intercept)                                          -0.29669088 0.06169473
conditionexperimental                                 0.26539992 0.60940435 

似然曲线(例如,参见似然曲线和置信区间之间的关系是什么?

> confint(m, method="profile", oldNames= FALSE)
Computing profile confidence intervals ...
                                                          2.5 %     97.5 %
sd_(Intercept)|participant_id                         0.3490878 0.66714551
cor_conditionexperimental.(Intercept)|participant_id -1.0000000 1.00000000
sd_conditionexperimental|participant_id               0.0000000 0.49076950
sigma                                                 0.9759407 1.08217870
(Intercept)                                          -0.2999380 0.07194055
conditionexperimental                                 0.2707319 0.60727448

  • 还有一种方法,'Wald'但这仅适用于固定效果。

  • 包装lmerTest中还存在某种形式的方差(似然比)表达形式,名为ranova。但我似乎无法理解这一点。当零假设(随机效应的零方差)为true时,logLikelihood差异的分布不是卡方分布(可能在参与者和试验的数量很高时,似然比检验可能有意义)。


特定人群的差异

要获得特定组中方差的结果,您可以重新参数化

# different model with alternative parameterization (and also correlation taken out) 
fml1 <- "~ condition + (0 + control + experimental || participant_id) "

我们在数据框中添加了两列(仅当您希望评估不相关的“控制”和“实验性”功能时,才需要对不相关的(0 + condition || participant_id)条件进行评估)

#adding extra columns for control and experimental
d <- cbind(d,as.numeric(d$condition=='control'))
d <- cbind(d,1-as.numeric(d$condition=='control'))
names(d)[c(4,5)] <- c("control","experimental")

现在lmer将给出不同组的方差

> m <- lmer(paste("sim_1 ", fml1), data=d)
> m
Linear mixed model fit by REML ['lmerModLmerTest']
Formula: paste("sim_1 ", fml1)
   Data: d
REML criterion at convergence: 2408.186
Random effects:
 Groups           Name         Std.Dev.
 participant_id   control      0.4963  
 participant_id.1 experimental 0.4554  
 Residual                      1.0268  
Number of obs: 800, groups:  participant_id, 40
Fixed Effects:
          (Intercept)  conditionexperimental  
               -0.114                  0.439 

您可以将配置文件方法应用于这些方法。例如,现在confint给出了控制和实验差异的置信区间。

> confint(m, method="profile", oldNames= FALSE)
Computing profile confidence intervals ...
                                    2.5 %     97.5 %
sd_control|participant_id       0.3490873 0.66714568
sd_experimental|participant_id  0.3106425 0.61975534
sigma                           0.9759407 1.08217872
(Intercept)                    -0.2999382 0.07194076
conditionexperimental           0.1865125 0.69149396

简单

您可以使用似然函数来进行更高级的比较,但是有很多方法可以对这条路进行近似(例如,您可以进行保守的方差分析/ lrt检验,但这就是您想要的吗?)。

在这一点上,这使我想知道这种方差之间的比较(不是很常见)的实际目的是什么。我不知道它是否开始变得太复杂了。为什么方差,而不是之间比率方差之间(其涉及经典的F-分布)?为什么不仅仅报告置信区间?我们需要退后一步,弄清楚应该讲的数据和故事,然后再进入可能是多余而又松散的实际上是主要主题的统计事项和统计注意事项的高级途径。

我想知道是否应该做更多的工作,而不只是简单地陈述置信区间(这实际上可能比假设检验更具说服力。假设检验给出的答案是肯定的,但没有答案,但是没有有关人口实际分布的信息。如果有足够的数据,您可以产生任何细微差异,以报告为重大差异)。我认为,为了更深入地研究该问题(出于任何目的),需要一个更具体的(狭窄定义的)研究问题,以指导数学机制进行适当的简化(即使在可能进行精确计算时,或者它可以通过模拟/引导来近似,即使在某些设置下,它仍然需要一些适当的解释)。与费舍尔的精确测试进行比较,以准确地解决(特定的)问题(关于列联表),

简单的例子

为了提供一个可能的简单示例,我在下面的比较中(通过模拟)显示了一个简单的评估,即基于F检验,通过比较各个均值响应的方差并通过比较来完成两组检验之间的差异。混合模型得出的方差。

对于F检验,我们仅比较两组中个体的值(均值)的方差。这些均值用于条件分布为:j

Y^i,jN(μj,σj2+σϵ210)

如果所有个体和条件的测量误差方差 相等,并且如果两个条件()的方差相等,则方差的比率条件1的40个均值的方差,条件2的40个均值的方差是根据自由度为39和39的分子和分母的F分布进行分布的。σϵσjj={1,2}

您可以在下图的仿真中看到这一点,其中除了基于样本的F分数之外,它还基于模型的预测方差(或平方误差的总和)来计算F分数。

准确性差异示例

使用和对图像进行10000次重复建模。σj=1=σj=2=0.5σϵ=1

您会看到有一些区别。这种差异可能是由于以下事实造成的:混合效应线性模型以不同的方式获得平方误差之和(针对随机效应)。而且这些平方误差项不能(不再)很好地表示为简单的卡方分布,但仍然紧密相关,可以近似。

除了原假设为真时的(小的)差异外,原假设不为真时的情况更为有趣。尤其是。均值分布不仅取决于那些而且还取决于测量误差。在混合效应模型的情况下,该后一个误差被“滤除”,并且期望基于随机效应模型方差的F分数具有更高的功效。σj=1σj=2Y^i,jσjσϵ

权力差异示例

使用,和以10000次重复对图像进行建模。σj=1=0.5σj=2=0.25σϵ=1

因此,基于均值的模型非常精确。但是它的功能不那么强大。这表明正确的策略取决于您的需求。

在上面的示例中,当将右尾边界设置为2.1和3.1时,在方差相等的情况下(10,000个案例中的第103和104个),您将获得大约1%的总体,但是在方差不相等的情况下,这些边界不同很多(给了5334和6716个案例)

码:

set.seed(23432)

# different model with alternative parameterization (and also correlation taken out)
fml1 <- "~ condition + (0 + control + experimental || participant_id) "
fml <- "~ condition + (condition | participant_id)"

n <- 10000

theta_m <- matrix(rep(0,n*2),n)
theta_f <- matrix(rep(0,n*2),n)

# initial data frame later changed into d by adding a sixth sim_1 column
ds <- expand.grid(participant_id=1:40, trial_num=1:10)
ds <- rbind(cbind(ds, condition="control"), cbind(ds, condition="experimental"))
  #adding extra columns for control and experimental
  ds <- cbind(ds,as.numeric(ds$condition=='control'))
  ds <- cbind(ds,1-as.numeric(ds$condition=='control'))
  names(ds)[c(4,5)] <- c("control","experimental")

# defining variances for the population of individual means
stdevs <- c(0.5,0.5) # c(control,experimental)

pb <- txtProgressBar(title = "progress bar", min = 0,
                    max = n, style=3)
for (i in 1:n) {

  indv_means <- c(rep(0,40)+rnorm(40,0,stdevs[1]),rep(0.5,40)+rnorm(40,0,stdevs[2]))
  fill <- indv_means[d[,1]+d[,5]*40]+rnorm(80*10,0,sqrt(1)) #using a different way to make the data because the simulate is not creating independent data in the two groups 
  #fill <- suppressMessages(simulate(formula(fml), 
  #                     newparams=list(beta=c(0, .5), 
  #                                    theta=c(.5, 0, 0), 
  #                                    sigma=1), 
  #                     family=gaussian, 
  #                     newdata=ds))
  d <- cbind(ds, fill)
  names(d)[6] <- c("sim_1")


  m <- lmer(paste("sim_1 ", fml1), data=d)
  m
  theta_m[i,] <- m@theta^2

  imeans <- aggregate(d[, 6], list(d[,c(1)],d[,c(3)]), mean)
  theta_f[i,1] <- var(imeans[c(1:40),3])
  theta_f[i,2] <- var(imeans[c(41:80),3])

  setTxtProgressBar(pb, i)
}
close(pb)

p1 <- hist(theta_f[,1]/theta_f[,2], breaks = seq(0,6,0.06))       
fr <- theta_m[,1]/theta_m[,2]
fr <- fr[which(fr<30)]
p2 <- hist(fr, breaks = seq(0,30,0.06))



plot(-100,-100, xlim=c(0,6), ylim=c(0,800), 
     xlab="F-score", ylab = "counts [n out of 10 000]")
plot( p1, col=rgb(0,0,1,1/4), xlim=c(0,6), ylim=c(0,800), add=T)  # means based F-score
plot( p2, col=rgb(1,0,0,1/4), xlim=c(0,6), ylim=c(0,800), add=T)  # model based F-score
fr <- seq(0, 4, 0.01)
lines(fr,df(fr,39,39)*n*0.06,col=1)
legend(2, 800, c("means based F-score","mixed regression based F-score"), 
       fill=c(rgb(0,0,1,1/4),rgb(1,0,0,1/4)),box.col =NA, bg = NA)
legend(2, 760, c("F(39,39) distribution"), 
       lty=c(1),box.col = NA,bg = NA)
title(expression(paste(sigma[1]==0.5, " , ", sigma[2]==0.5, " and ", sigma[epsilon]==1)))

这很有用,但似乎无法解决有关如何比较两个条件下的方差的问题。
变形虫说恢复莫妮卡

@amoeba我发现这个答案给出了问题的核心(关于测试随机方差成分)。OP确切想要的内容很难在全文中阅读。“随机截距方差”指的是什么?(与拦截有关的复数让我感到困惑),一种可能的情况是使用该模型,sim_1 ~ condition + (0 + condition | participant_id)"在这种情况下,您将参数化成两个参数(每个组一个),而不是两个参数分别用于拦截和一个效果(后者需要合并为组)。
Sextus Empiricus

每个受试者在条件A部分的平均响应,并在某些条件下平均响应B.问题是一个跨学科的变化是否是从B.跨学科的差异不同
阿米巴恢复莫妮卡说,

这不会完成标题“在分组变量的各个级别之间比较随机方差分量”中提出的任务。我注意到问题的正文中有一个令人困惑的错别字,我已经解决了。我还试图进一步澄清问题的措辞。
Patrick S. Forscher '18年

可能可以使用car::linearHypothesisTestmath.furman.edu/~dcs/courses/math47/R/library/car/html/…)回答问题,这使用户可以使用拟合模型测试任意假设。但是,我必须使用@amoeba的方法来获得同一模型拟合模型中的两个随机截距,以便将它们与该函数进行比较。我也不确定该方法的有效性。
Patrick S. Forscher '18年

5

一种相对简单的方法可能是使用常见问题解答中anova所述的似然比测试。lme4

我们从一个完整的模型开始,在该模型中,方差不受约束(即允许两个不同的方差),然后拟合一个假定两个方差相等的约束模型。我们简单地比较他们anova()(请注意,我设置REML = FALSE虽然REML = TRUEanova(..., refit = FALSE)是完全可行的)。

m_full <- lmer(sim_1 ~ condition + (condition | participant_id), data=d, REML = FALSE)
summary(m_full)$varcor
 # Groups         Name                  Std.Dev. Corr  
 # participant_id (Intercept)           0.48741        
 #                conditionexperimental 0.26468  -0.419
 # Residual                             1.02677     

m_red <- lmer(sim_1 ~ condition + (1 | participant_id), data=d, REML = FALSE)
summary(m_red)$varcor
 # Groups         Name        Std.Dev.
 # participant_id (Intercept) 0.44734 
 # Residual                   1.03571 

anova(m_full, m_red)
# Data: d
# Models:
# m_red: sim_1 ~ condition + (1 | participant_id)
# m_full: sim_1 ~ condition + (condition | participant_id)
#        Df    AIC    BIC  logLik deviance  Chisq Chi Df Pr(>Chisq)
# m_red   4 2396.6 2415.3 -1194.3   2388.6                         
# m_full  6 2398.7 2426.8 -1193.3   2386.7 1.9037      2      0.386

但是,此测试可能是保守的。例如,常见问题解答说:

请记住,当零值(例如σ2= 0)在可行空间的边界上时,基于LRT的零假设检验是保守的。在最简单的情况下(单个随机效应方差),p值约为应有的两倍(Pinheiro和Bates 2000)。

有几种选择:

  1. 创建一个适当的测试分布,通常由分布的混合组成。参见例如, Self,SG,和Liang,K.-Y。(1987)。非标准条件下最大似然估计器的渐近性质和似然比检验。美国统计协会杂志,82(398),605。https : //doi.org/10.2307/2289471 但是,这非常复杂。χ2

  2. 使用来模拟正确的分发RLRsim(也见FAQ)。

我将在下面演示第二个选项:

library("RLRsim")
## reparametrize model so we can get one parameter that we want to be zero:
afex::set_sum_contrasts() ## warning, changes contrasts globally
d <- cbind(d, difference = model.matrix(~condition, d)[,"condition1"])

m_full2 <- lmer(sim_1 ~ condition + (difference | participant_id), data=d, REML = FALSE)
all.equal(deviance(m_full), deviance(m_full2))  ## both full models are identical

## however, we need the full model without correlation!
m_full2b <- lmer(sim_1 ~ condition + (1| participant_id) + 
                   (0 + difference | participant_id), data=d, REML = FALSE)
summary(m_full2b)$varcor
 # Groups           Name        Std.Dev.
 # participant_id   (Intercept) 0.44837 
 # participant_id.1 difference  0.13234 
 # Residual                     1.02677 

## model that only has random effect to be tested
m_red <- update(m_full2b,  . ~ . - (1 | participant_id), data=d, REML = FALSE)
summary(m_red)$varcor
 # Groups         Name       Std.Dev.
 # participant_id difference 0.083262
 # Residual                  1.125116

## Null model 
m_null <- update(m_full2b,  . ~ . - (0 + difference | participant_id), data=d, REML = FALSE)
summary(m_null)$varcor
 # Groups         Name        Std.Dev.
 # participant_id (Intercept) 0.44734 
 # Residual                   1.03571 

exactRLRT(m_red, m_full2b, m_null)
# Using restricted likelihood evaluated at ML estimators.
# Refit with method="REML" for exact results.
# 
#   simulated finite sample distribution of RLRT.
#   
#   (p-value based on 10000 simulated values)
# 
# data:  
# RLRT = 1.9698, p-value = 0.0719

正如我们所看到的,输出结果表明REML = TRUE我们将获得确切的结果。但这留给读者练习。

关于奖金,我不确定是否RLRsim允许同时测试多个组件,但是如果可以的话,可以用相同的方式完成。


对评论的回应:

因此,总的来说,随机斜率允许随机截距在水平上变化是正确的。θXθ0X

我不确定这个问题能否得到一个合理的答案。

  • 对于分组因子的每个级别,随机截距允许总体级别存在特质差异。例如,如果因变量是响应时间,则某些参与者会更快,而有些参与者会更慢。
  • 随机斜率允许分组因子的每个级别具有为其估计随机斜率的因子的特质效应。例如,如果因素是一致性,那么某些参与者可能会比其他参与者具有更高的一致性效果。

那么,随机斜率会影响随机截距吗?从某种意义上说,这可能是有道理的,因为它们允许分组因子的每个级别对每种情况都具有完全特有的效果。最后,我们为两个条件估计了两个特质参数。但是,我认为截距捕获的总体水平与随机斜率捕获的条件特定效果之间的区别很重要,因此随机斜率不能真正影响随机截距。但是,对于条件的每个级别,它仍然允许分组因子的每个级别都具有特质。

不过,我的测试仍然按照原始问题的要求进行。它测试两个条件之间方差的差是否为零。如果为零,则两个条件下的方差相等。换句话说,只有在不需要随机斜率的情况下,两个条件下的方差才相同。我希望这是有道理的。


1
您可以使用contr.treatment控制条件为参考的处理对比度()(即,为其计算随机截距)。我提出的参数化方法是使用求和对比(即contr.sum),而截距是大平均值。我觉得在截距是控制平均值而不是控制条件的情况下测试差异是否为零是更有意义的(但是写出来表明它可能相对无关紧要)。您可能需要阅读以下内容的第24至26页: singmann.org/download/publications/…–
Henrik,

1
谢谢!但是,我的问题略有不同:(1)您的回答似乎暗示我的问题减少为“条件的随机斜率是否不同于0”。这是真的?(2)如果对(1)的回答为“是”,则建议对以下随机斜率进行另一种解释condition:允许随机截距在的水平上变化condition。这是真的?
Patrick S. Forscher,

2
我的2¢:@amoeba对Henrik建议的过程的反例是正确的。Henrik 几乎是正确的,但是他比较了一对错误的模型。回答帕特里克(Patrick)问题的模型比较是Henrik称为m_fullvs 的模型之间的比较m_full2b。也就是说:如果随机截距-斜率相关性不为零,重要的是,在和对零对比编码参数化的情况下,参与者对A和B的条件平均响应方差不相等。无需测试随机斜率方差。试图思考如何简洁地解释这一点...
Jake Westfall

2
这不是一个正确的解释,但是在这里研究我的答案可能会对此有所启发。基本上,相关参数控制参与者回归线是“向右扇出”(正校正)还是“向左扇出”(负校正)。这些都暗示参与者的条件均值响应中存在不均等的方差。零和编码然后确保我们正在X的正确点上寻找相关性
Jake Westfall

2
如果可以的话,我会考虑用图片发布答案...
Jake Westfall '18

5

您的模特

m = lmer(sim_1 ~ condition + (condition | participant_id), data=d)

已经允许控制条件下的跨对象方差与实验条件下的跨对象方差不同。可以通过等效的重新参数化使其更加明确:

m = lmer(sim_1 ~ 0 + condition + (0 + condition | participant_id), data=d)

现在,随机协方差矩阵的解释更简单:

Random effects:
 Groups         Name                  Variance Std.Dev. Corr
 participant_id conditioncontrol      0.2464   0.4963       
                conditionexperimental 0.2074   0.4554   0.83

这里的两个方差正是您感兴趣的两个方差:控制条件下条件均值响应的[跨对象]方差,实验条件下均相同。在模拟的数据集中,它们分别为0.25和0.21。差异由

delta = as.data.frame(VarCorr(m))[1,4] - as.data.frame(VarCorr(m))[2,4]

等于0.039。您想测试它是否明显不同于零。

编辑:我意识到我下面描述的置换测试是不正确的;如果控制/实验条件下的均值不相同(因为观察值在null下不能交换),它将无法按预期工作。重新引导主题(或Bonus案例中的主题/项目)并获得的置信区间可能是一个更好的主意delta

我将尝试修复下面的代码来做到这一点。


基于原始排列的建议(错误)

我经常发现,通过进行置换测试可以节省很多麻烦。实际上,在这种情况下,设置起来非常容易。让我们分别为每个主题布置控制/实验条件;那么应该消除任何差异。重复多次将产生差异的零分布。

(我不使用R编程;每个人都可以随意以更好的R风格重写以下内容。)

set.seed(42)
nrep = 100
v = matrix(nrow=nrep, ncol=1)
for (i in 1:nrep)
{
   dp = d
   for (s in unique(d$participant_id)){             
     if (rbinom(1,1,.5)==1){
       dp[p$participant_id==s & d$condition=='control',]$condition = 'experimental'
       dp[p$participant_id==s & d$condition=='experimental',]$condition = 'control'
     }
   }
  m <- lmer(sim_1 ~ 0 + condition + (0 + condition | participant_id), data=dp)
  v[i,] = as.data.frame(VarCorr(m))[1,4] - as.data.frame(VarCorr(m))[2,4]
}
pvalue = sum(abs(v) >= abs(delta)) / nrep

运行此操作将得出p值。一个可以增加到1000左右。p=0.7nrep

完全相同的逻辑可以应用于您的红利案例。


超级有趣,谢谢!我将不得不更多地考虑为什么重新参数设置有效,因为这似乎是该答案的关键见解。
Patrick S. Forscher,

奇怪的是,您答案中的按组拦截值似乎与@MartijnWeterings答案中的不同。
Patrick S. Forscher,

@ PatrickS.Forscher因为我认为他生成了一个不同的数据集。我可以使用sim_1 ~ 0 + condition + (0 + dummy(condition, "control") + dummy(condition, "experimental") | participant_id)公式并获得与答案相同的结果。
变形虫说恢复莫妮卡

1
@ PatrickS.Forscher不,我使用了您的代码生成的数据(带有您的种子)。我仅在执行置换测试时将种子设置为42。是Martijn更改了数据集,而不是我。
变形虫说恢复莫妮卡

1
这个建议绝对是正确的。正如我认为您已经经历过的那样,为多级数据设置置换测试并非完全简单。一种类似的实现起来更容易实现的方法是参数自举,这很简单,即通过使用适配的lmer对象的simulate()方法对lme4进行处理,即多次调用simulate(m)来建立引导程序。分配。只是一个想法玩。
杰克·韦斯特伦

0

yijk=μ+αj+dij+eijk,diN(0,Σ),eijkN(0,σ2)
αjjdi=(di1,,diJ)ij
yi1kyi2kABdi

Σ=[σA2σABσABσB2]

σA2σB2

Σ

截距的方差对应于均值,为

σ12:=Var(grand mean)=Var(12(A+B))=14(Var(A)+Var(B)+2Cov(A,B)).

对比度的方差为

σ22:=Var(contrast)=Var(12(AB))=14(Var(A)+Var(B)2Cov(A,B)).

截距和对比度之间的协方差是

σ12:=Cov(grand mean, contrast)=Cov(12(A+B),12(AB))=14(Var(A)Var(B)).

Σ

Σ=[σ12+σ22+2σ12σ12σ22σ12σ22σ12+σ222σ12]=[σA2σABσABσB2].

Σ

Σ=[σ12σ12σ12σ12]+[σ22σ22σ22σ22]+2[σ1200σ12].

σ12

Σ=[σ12σ12σ12σ12]+[σ22σ22σ22σ22]=[σ12+σ22σ12σ22σ12σ22σ12+σ22]

其中,作为西部荒野@Jake衍生略有不同,测试等方差的假设,当我们比较模型没有这个协方差参数,其中协方差参数仍包含/未设置为零的典范。

值得注意的是,引入另一个交叉的随机分组因子(例如刺激)并不会改变必须进行的模型比较,即anova(mod1, mod2)refit = FALSE在使用REML估计时可以选择使用参数),其中mod1mod2定义为@Jake Westfall。

σ12σ22

Σ=[σ12σ12σ12σ12]

它检验了两个条件下的方差相等并且等于两个条件之间的(正)协方差的假设。


当我们有两个条件时,将具有(正)复合对称结构中两个参数的协方差矩阵拟合的模型也可以写成

# code snippet from Jake Westfall
d$contrast <- 2*(d$condition == 'experimental') - 1

# new model
mod3 <- lmer(sim_1 ~ contrast + (1 | participant_id) + (1 | contrast:participant_id), 
             data = d, REML = FALSE) 

或(使用分类变量/因数condition

mod4 <- lmer(sim_1 ~ condition + (1 | participant_id) + (1 | condition:participant_id), 
             data = d, REML = FALSE)

Σ=[σ12+σ22σ12σ12σ12+σ22]=[σ12σ12σ12σ12]+[σ2200σ22]

σ12σ22Σ

下面我们看到的是mod1mod3mod4产生相当于拟合:

# code snippet from Jake Westfall
d$contrast <- 2*(d$condition == 'experimental') - 1

mod1 <- lmer(sim_1 ~ contrast + (contrast || participant_id),
             data = d, REML = FALSE)

mod2 <- lmer(sim_1 ~ contrast + (contrast | participant_id),
             data = d, REML = FALSE)

# new models 
mod3 <- lmer(sim_1 ~ contrast + (1 | participant_id) + (1 | contrast:participant_id), 
             data = d, REML = FALSE) 

mod4 <- lmer(sim_1 ~ condition + (1 | participant_id) + (1 | condition:participant_id), 
             data = d, REML = FALSE)

anova(mod3, mod1)
# Data: d
# Models:
# mod3: sim_1 ~ contrast + (1 | participant_id) + (1 | contrast:participant_id)
# mod1: sim_1 ~ contrast + ((1 | participant_id) + (0 + contrast | participant_id))
#      Df    AIC    BIC  logLik deviance Chisq Chi Df Pr(>Chisq)
# mod3  5 2396.9 2420.3 -1193.5   2386.9                        
# mod1  5 2396.9 2420.3 -1193.5   2386.9     0      0          1

anova(mod4, mod3)
# Data: d
# Models:
# mod4: sim_1 ~ condition + (1 | participant_id) + (1 | condition:participant_id)
# mod3: sim_1 ~ contrast + (1 | participant_id) + (1 | contrast:participant_id)
#      Df    AIC    BIC  logLik deviance Chisq Chi Df Pr(>Chisq)
# mod4  5 2396.9 2420.3 -1193.5   2386.9                        
# mod3  5 2396.9 2420.3 -1193.5   2386.9     0      0          1

Σ

Σ=[σ12σ12+σ12σ12+σ12σ12+σ22+2σ12]=[σ12σ12σ12σ12]+[000σ22]+[0σ12σ122σ12]

σ12Aσ22ABσ12

σ12σ22

mod4Σ

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.