在lme4 glmer中缩放预测变量无法解决特征值警告;替代优化也没有

时间:2018-12-18 14:03:55

标签: r optimization lme4

我正在使用R中的lme4的{​​{1}}函数分析数据(包括以下内容)。 我正在建立的模型包括泊松分布的响应变量(glmer),一个随机因子(obs),一个连续偏移量(area),五个连续固定效应({{ 1}},durationcan_perccan_ntime)和一个二项式固定影响因子(temp)。 在拟合模型之前,我检查了共线性并删除了所有共线性变量。

初始模型为:

cloud_cover

(注意:我需要将burnt指定为“ na.fail”,因为我以后想q1 = glmer(obs ~ can_perc + can_n + time * temp + cloud_cover + factor(burnt) + (1|area) + offset(dat$duration), data=dat, family=poisson, na.action = na.fail) 建立模型,这是必需的。)

运行模型会给出以下警告:

  

“ Hessian是数字上的奇数:参数不是唯一确定的”

在该模型的类似变体中,我还收到了警告:

  

“在checkConv(attr(opt,” derivs“),opt $ par,ctrl = control $ checkConv,中:   模型几乎无法识别:特征值比大-重新缩放变量?”

根据我对此处https://rdrr.io/cran/lme4/man/troubleshooting.html和其他地方的建议的有限理解,这两个警告都反映出类似的问题,即具有较大特征值的Hessian(逆曲率矩阵)表​​示表面(在数值公差范围内)在某个方向上完全平坦。 根据警告和链接中的建议,我使用na.action重新缩放了所有连续预测变量。我还缩放了偏移量变量(在缩放时都尝试过和不缩放)。具有缩放预测变量的模型在这里:

dredge()

但是我还没有逃脱特征值!比例模型给出了两个警告:

  

“无法评估比例梯度”
  “模型无法收敛:退化具有1个负特征值的Hessian”

我已经在网上进行了大量搜索,除了对模型没有进行错误指定之外,一旦对预测变量进行了缩放,就找不到其他方法/解决方案来处理特征值问题。

尝试解决警告/改进优化:

基于以下页面/文档: https://cran.r-project.org/web/packages/lme4/lme4.pdf

https://stats.stackexchange.com/questions/164457/r-glmer-warnings-model-fails-to-converge-model-is-nearly-unidentifiable

https://rdrr.io/cran/lme4/man/isSingular.html

https://stats.stackexchange.com/questions/242109/model-failed-to-converge-warning-in-lmer

和其他人,

我有:

  1. 检查了模型规格和数据是否有错误(我看不到-我错过了什么吗?)

  2. 使用scale()检查了奇点(此函数调用从q2 = glmer(obs ~ s.can_perc + s.can_n + s.time * s.temp + s.cloud_cover + factor(burnt) + (1|area) + offset(dat$s.duration), data=dat, family=poisson, na.action = na.fail) 演变为当前形式?):所有模型都给出FALSE。

  3. 使用is_singular(x, tol = 1e-05)进行
  4. 检验的收敛性度量:除非我大幅提高了公差,否则所有模型都为FALSE。但是它们的收敛度量确实有很大差异。

  5. 尝试了以下不同的优化器/模型估计方法:

    • a)isSingular()
    • b)converge_ok(q2, tolerance = 0.001)
    • c)bobyqa,Nelder_Mead,optimx.nlminb,optimx.L-BFGS-B,nloptwrap.NLOPT_LN_NELDERMEAD,nloptwrap.NLOPT_LN_BOBYQA和nmkbw优化器,使用了glmerControl(optimizer = "bobyqa") and glmerControl(optimizer ="Nelder_Mead")函数。

代码如下:

glmerControl(optimizer ='optimx', optCtrl=list(method='nlminb'))

上述代码的输出,用于未缩放模型(q1):

all_fit()

上述代码的输出,用于缩放模型(q2):

# singularity and convergence for first two models:
is_singular(s1, tol = 1e-05) # FALSE (a good thing?)
converge_ok(s1, tol = 1e-05) # FALSE (a bad thing?) 0.0259109730912352

is_singular(s2, tol = 1e-05) # FALSE (a good thing?)
converge_ok(s2, tol = 1e-05) # FALSE (a bad thing?) 0.0023434329028163
# I looked at singularity and converge measures for the others below, but omitted for brevity.

# Alternate optimisations for q1:
q1.bobyqa = glmer(obs ~ can_perc + can_n  + time * temp + cloud_cover + factor(burnt) + (1|area) + offset(dat$duration), data=dat, family=poisson, na.action = na.fail, glmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)))
# Warning 1: unable to evaluate scaled gradient
# Warning 2: Model failed to converge: degenerate  Hessian with 1 negative eigenvalues

q1.neldermead = glmer(obs ~ can_perc + can_n  + time * temp + cloud_cover + factor(burnt) +  (1|area) + offset(dat$duration), data=dat, family=poisson, na.action = na.fail,  glmerControl(optimizer ="Nelder_Mead", optCtrl = list(maxfun = 2e5)))
# Warning: unable to evaluate scaled gradient Hessian is numerically singular: parameters are not uniquely determined

q1.nlminb = glmer(obs ~ can_perc + can_n  + time * temp + cloud_cover + factor(burnt) + (1|area) + offset(dat$duration), data=dat, family=poisson, na.action = na.fail, glmerControl(optimizer ='optimx', optCtrl=list(method='nlminb')))
# Warning: Parameters or bounds appear to have different scalings. This can cause poor performance in optimization. 
# It is important for derivative free methods like BOBYQA, UOBYQA, NEWUOA.convergence code 9999 from optimxError in pwrssUpdate(pp, resp, tol = tolPwrss, GQmat = GQmat, compDev = compDev,  :   (maxstephalfit) PIRLS step-halvings failed to reduce deviance in pwrssUpdate

all_fit(q1)

# Alternate optimisations for q2:
q2.bobyqa = glmer(obs ~ s.can_perc + s.can_n  + s.time * s.temp + s.cloud_cover + factor(burnt) +  (1|area) + offset(dat$s.duration), data=dat, family=poisson, na.action = na.fail, glmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)))
# Warning 1: unable to evaluate scaled gradient
# Warning 2: Model failed to converge: degenerate  Hessian with 1 negative eigenvalues

q2.neldermead = glmer(obs ~ s.can_perc + s.can_n  + s.time * s.temp + s.cloud_cover + factor(burnt) + (1|area) + offset(dat$s.duration), data=dat, family=poisson, na.action = na.fail, glmerControl(optimizer ="Nelder_Mead", optCtrl = list(maxfun = 2e5)))
# Warning: unable to evaluate scaled gradient Hessian is numerically singular: parameters are not uniquely determined

q2.nlminb = glmer(obs ~ s.can_perc + s.can_n  + s.time * s.temp + s.cloud_cover + factor(burnt) +  (1|area) + offset(dat$s.duration), data=dat, family=poisson, na.action = na.fail, control = glmerControl(optimizer ='optimx', optCtrl=list(method='nlminb')))
# Warning: Model is nearly unidentifiable: large eigenvalue ratio - Rescale variables?

all_fit(q2)

数据:

该数据集可在以下链接获得: https://www.dropbox.com/s/ud50uatztjq4bh9/20181217%20Surveys%20simplified%20data%20for%20stackX.xlsx?dl=0

结论和要求:

在我看来,这些替代性优化方法均未成功;实际上,那时似乎有些人提出了其他警告/错误,这会把我带到另一个困境中。

有人能建议我如何改进这些模型吗? 我不是要将这些模型用作最终模型,而是要疏通它们,然后从不同的替代子集模型中选择最佳/最佳模型。

1 个答案:

答案 0 :(得分:1)

tl; dr :这似乎是完全分离的情况;在“烧伤”状态下,您根本没有任何积极的结果。您不必不必担心这一点-AIC比较仍然应该相当健壮-但是您可能想要在继续​​之前了解正在发生的事情。 GLMM FAQ的相关部分讨论了此问题(和补救措施)(关于CrossValidated有各种相关的问题/答案)。

我怎么知道?这是系数:

  (Intercept)       s.can_perc               s.can_n                s.time                s.temp  
   -19.29632          -0.22153               0.45840               0.05241              -0.24990  
       s.cloud_cover  factor(burnt)unburnt         s.time:s.temp  
            -0.19692              19.02091              -0.13949  

任何时候,(二项式或泊松)GLM中的系数(绝对值)都大于8-10时,就必须担心(除非您查看的是数值协变量的系数)单位,例如,如果您正在查看后院中的碳含量(以千兆欧为单位)。这意味着预测变量的单位变化会导致对数赔率(例如,二项式/对数链接模型)的对数赔率发生(例如)10个单位的变化。从0.006(plogis(-5))到0.994(plogis(5))的概率。在您的情况下,截距为-19.29,因此在燃烧状态的所有预测变量的值为零时,您获得的概率为4.2e-9。另一个巨大的系数是unburnt(19.02),因此,在未燃烧(未燃烧?)条件下,所有预测变量的值为零时,plogis(-19.29+19.02) = 0.43。