【问题标题】:GLMM Convergence issues with lme4lme4 的 GLMM 收敛问题
【发布时间】:2020-05-23 16:53:06
【问题描述】:

我正在模拟每家医院在 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) 如何克服此错误:“模型无法收敛于 max|grad| = 0.00361688 (tol = 0.001, 组件 1)模型几乎无法识别:特征值非常大”? - 我已按照此站点上通常推荐的步骤:https://rstudio-pubs-static.s3.amazonaws.com/33653_57fc7b8e5d484c909b615d8633c01d51.html,但我开始认为根本问题可能在于我如何设置数据框或模型?

【问题讨论】:

  • Pablo 的回答很好,但我有几点想澄清。您是否只对 Months 的效果感兴趣,而医院之间的差异只是噪音?或者您对这两个变量的工作有何不同感兴趣?
  • 我对工作数量随时间的影响感兴趣,并希望捕捉每家医院内工作随时间的变化,因此是随机效应。我也有医院所在的地区,但我不确定如何在模型中使用它。

标签: r dataframe lme4 poisson


【解决方案1】:

好的,根据您在评论中提供的其他信息,我将扩展 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"))

【讨论】:

  • 感谢您的帮助!那么您是说,如果我希望随着时间的推移,我应该使用(工作|地区/医院)的医院(嵌套在区域中)内的工作数量有不同的截距和斜率?如果我只期望不同的拦截,请使用您的模型?这种逻辑是否也适用于负二项式模型? (即 lme4 中的 glmer.nb())
  • 谢谢!您介意澄清一下为什么我的 ( Month | factor(Region)) 的表述没有意义吗?在 Ben Bolker 的指南 (jstatsoft.org/article/view/v067i01 page4) 中,他们模拟了这样的反应时间:lmer(Reaction ~ Days + (Days | Subject), sleepstudy),所以我使用了相同的逻辑,但我的数据是用几个月而不是几天来衡量的
  • 很抱歉,我之前的评论中有错字。正确的随机斜率模型将包括 (1+Month|Region/Hospitals)
【解决方案2】:

如果 Region 是字符串 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"))

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多