lmer(lme4)中具有最简单随机结构的奇异拟合,贝叶斯方法是唯一的选择吗?

机器算法验证 r 贝叶斯 lme4-nlme 单数
2022-03-20 22:57:15

我正在使用lmerR 中 lme4 包中的函数运行混合模型,并遇到了一些奇异拟合的问题。我收到警告消息'singular fit',指定为'convergence code 0; 1 优化器警告;0 lme4 警告'summary(model).

就像背景信息一样,我最近重新安装了我的电脑 (MacOS),但我不记得我以前遇到过同样的问题。因此,可能发生了一些变化,这可以解释问题的出现(另请参见此处的此线程,其中有人仅在一些未知更改后才收到消息,可能是更新)。

基于此线程here,我首先认为随机效应结构对于我的数据集可能过于复杂并简化了模型。但是,在构建模型后我仍然收到相同的警告,该模型仅包括主题的随机截距,没有其他内容:lmer(y ~ 1 + (1|Subject))

因此,我尝试仅使用所有受试者的均值和标准差来重建我的数据集,然后根据这些值模拟新数据。我的想法是测试类似的数据集是否会出现问题,并且我还希望有一个更容易在这里共享的数据集。

在其中一些新的(部分随机的)数据集上运行与上述相同的模型,我仍然对奇异拟合有同样的问题。但是,我并不是一直都明白(见下文)。

因此,我想问是否有人可以对这种现象给我一个很好的解释。

可重现的例子:

首先,我定义了一个函数,根据为每个主题提供的平均值和 sd,为每个主题获取 n 个正态分布的随机值。

get_subject_df <- function(means, sds, samples_per_ind){
  ind_vars = vector(length = length(means) * samples_per_ind)  
  for(i in 1:length(means)){
    vals <- rnorm(n = samples_per_ind, mean = means[[i]], sd = sds[[i]])
    irows <-  ((i - 1) * samples_per_ind + 1):(i*samples_per_ind)
    ind_vars[irows] <- vals
    names(ind_vars)[irows] <- paste0("ID_", i)
  }
  df = data.frame(ID = names(ind_vars), vals = ind_vars)
  return(df)
}

在这里,我根据真实数据为所有主题创建了包含均值和 sds 的列表

subject_means <- c(9.70,  9.89,  9.72, 10.66,  9.83, 10.32, 10.35, 10.93, 14.36, 12.38, 
                   10.91, 10.38,  8.71, 10.21, 12.28, 11.42, 11.90, 11.41,  9.69,  
                   9.10, 10.20, 10.49, 10.11,  9.16, 10.74)
subject_sds   <- c(3.28, 3.12, 4.91, 4.49, 3.08, 3.67, 4.08, 3.99, 6.10, 5.32, 3.04, 
                   4.69, 3.54, 4.63, 5.47, 3.46, 6.05, 5.94, 3.27, 4.18, 3.41, 4.21, 
                   4.59, 3.28, 4.15)

y ~ 1 + (1|Subject)使用不同的值多次运行模型,set.seed()并且某些但不是所有模型都会出现奇异拟合问题。(例如,当 的值为set.seed()2、4、8 时,会出现问题,但 1、3、5、.... 不会出现问题)。这是一个有问题的模型(请注意,ID 的随机截距的 sd 为 0。)

set.seed(2)
df_1 <- get_subject_df(means=subject_means, sds=subject_sds, samples_per_ind=5)
lme4::lmer(vals ~ 1 + (1|ID), data = df_1)

singular fit 
Linear mixed model fit by REML ['lmerMod'] 
Formula: vals ~ 1 + (1 | ID)   
Data: df_1 

REML criterion at convergence: 751.7272 

Random effects:
  Groups   Name        Std.Dev.
  ID       (Intercept) 0.000
  Residual             4.917   
 Number of obs: 125, groups:  ID, 25 

Fixed Effects: 
 (Intercept)  
      10.64 

convergence code 0; 1 optimizer warnings; 0 lme4 warnings

所有受试者的值具有相同标准偏差(此处为 2)的模型似乎没有这个问题(我尝试了 1 到 1000 in 之间的所有值 set.seed(),并且从未遇到过奇异拟合的问题)。

set.seed(1)
df_2 <- get_subject_df(means=subject_means, sds=rep(2, length(subject_means)),
                         samples_per_ind=5)
lme4::lmer(vals ~ 1 + (1|ID), data=df_2)

Linear mixed model fit by REML ['lmerMod']
Formula: vals ~ 1 + (1 | ID)
   Data: df_2
REML criterion at convergence: 524.5715
Random effects:
 Groups   Name        Std.Dev.
 ID       (Intercept) 1.134   
 Residual             1.766   
Number of obs: 125, groups:  ID, 25
Fixed Effects:
(Intercept)  
      10.81  

编辑:
我浏览了 Ben Bolker 在评论中提供的链接,还浏览了这些线程中链接的其他来源。如果我理解正确的话,有以下(潜在的)选项来处理这种奇异模型(如此处总结

  1. 简化随机结构。在我的情况下不可能,因为我已经使用了可能的最简单的随机效应结构和仅拦截模型。
  2. 将随机效应拟合为固定效应。然而,这个建议似乎适用于随机效应水平数非常低(<5)的场景,而这里的情况并非如此(25 个水平)。
  3. 使用贝叶斯方法。

因此,我的悬而未决的问题是我唯一的选择是否是使用贝叶斯方法?

0个回答
没有发现任何回复~