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
因此,您应该 运行 的最终模型将如下所示:
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"))
我正在为每家医院的第 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
因此,您应该 运行 的最终模型将如下所示:
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"))