lme4 的 GLMM 收敛问题

GLMM Convergence issues with lme4

我正在为每家医院的第 1-112 个月(约 10 年)的工作数量建模。随着时间的推移,工作数量因医院而异,因此我定义了以下多级模型作为起点:

glmer.nb(Jobs ~ 1 + Region + Month + ( Month | factor(Region)),
                     data = df_month_region, 
                     family = poisson(link = "log"))

我的数据与此非常相似:

df <- data.frame(
  Region = rep(1:14, each=112),
  Month = rep(seq(1,112,1),14),
  Job = rpois(112*14, 0.7)
)

我想知道:

1) 以这种格式对我的数据建模是否有意义?将年份和月份分开列是否更有意义?

2) 如何克服此错误:"Model failed to converge with max|grad| = 0.00361688 (tol = 0.001, component 1)Model is nearly unidentifiable: very large eigenvalue"? - 我已按照此处的步骤操作:https://rstudio-pubs-static.s3.amazonaws.com/33653_57fc7b8e5d484c909b615d8633c01d51.html 按照本网站的普遍推荐,但我开始认为潜在的问题可能在于我如何设置数据框或模型?

如果 区域 是 lme4 自动检测的字符串,这是一个因素。您的模型具有随机截距和随机斜率。月份作为随机斜率没有多少意义,月份也是一个因素或块变量。

混合效果模型:

glmer(Jobs ~ 1  + ( 1 | Region) + (1| Month),
                 data = df_month_region, 
                 family = poisson(link = "log"))

固定效应模型:

glm(Jobs ~ 1  + Region + Month,
                 data = df_month_region, 
                 family = poisson(link = "log"))

月份和地区应该是字符串。

好的,根据您在评论中提供的其他信息,我将对 Pablo 的回答进行扩展。由于您实际上只对工作数量随时间的变化感兴趣,因此您唯一的固定效果应该是月份。现在,您还说您有不同的医院和这些医院所在的地区。这意味着您需要有一个嵌套的随机效应结构,其中有属于不同地区的不同医院。您可以在此处阅读有关嵌套随机效应的更多信息:

http://errickson.net/stats-notes/vizrandomeffects.html

https://stats.stackexchange.com/questions/228800/crossed-vs-nested-random-effects-how-do-they-differ-and-how-are-they-specified

因此,您应该 运行 的最终模型将如下所示:

job_model <- glmer(Jobs ~ Month + (1|Region/Hospital),
                     data = df_month_region, 
                     family = poisson(link = "log"))

为了看看Month是否对模型有明显的提升,你还应该拟合以下模型进行比较。

job_model_null <- glmer(Jobs ~ 1 + (1|Region/Hospital),
                     data = df_month_region, 
                     family = poisson(link = "log"))

然后使用 anova() 函数将它们与似然比检验进行比较,如下所示:

anova(job_model, job_model_null)

编辑: 如果您希望将 Month 的随机斜率拟合到随机效应,它看起来像这样:

job_model <- glmer(Jobs ~ Month + (1+Month|Region/Hospital),
                     data = df_month_region, 
                     family = poisson(link = "log"))