您可以借助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
特定人群的差异
要获得特定组中方差的结果,您可以重新参数化
# 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检验,我们仅比较两组中个体的值(均值)的方差。这些均值用于条件分布为:Ĵ
ÿ^我,Ĵ〜ñ(μĴ,σ2Ĵ+ σ2ϵ10)
如果所有个体和条件的测量误差方差 相等,并且如果两个条件()的方差相等,则方差的比率条件1的40个均值的方差,条件2的40个均值的方差是根据自由度为39和39的分子和分母的F分布进行分布的。σϵσĴĴ = { 1 ,2 }
您可以在下图的仿真中看到这一点,其中除了基于样本的F分数之外,它还基于模型的预测方差(或平方误差的总和)来计算F分数。
使用和对图像进行10000次重复建模。σj = 1= σj = 2= 0.5σϵ= 1
您会看到有一些区别。这种差异可能是由于以下事实造成的:混合效应线性模型以不同的方式获得平方误差之和(针对随机效应)。而且这些平方误差项不能(不再)很好地表示为简单的卡方分布,但仍然紧密相关,可以近似。
除了原假设为真时的(小的)差异外,原假设不为真时的情况更为有趣。尤其是。均值分布不仅取决于那些而且还取决于测量误差。在混合效应模型的情况下,该后一个误差被“滤除”,并且期望基于随机效应模型方差的F分数具有更高的功效。σj = 1≠ σj = 2ÿ^我,ĴσĴσϵ
使用,和以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)))