我正在使用R中的lme4
的{{1}}函数分析数据(包括以下内容)。
我正在建立的模型包括泊松分布的响应变量(glmer
),一个随机因子(obs
),一个连续偏移量(area
),五个连续固定效应({{ 1}},duration
,can_perc
,can_n
,time
)和一个二项式固定影响因子(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://rdrr.io/cran/lme4/man/isSingular.html
https://stats.stackexchange.com/questions/242109/model-failed-to-converge-warning-in-lmer
和其他人,
我有:
检查了模型规格和数据是否有错误(我看不到-我错过了什么吗?)
使用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。
is_singular(x, tol = 1e-05)
进行检验的收敛性度量:除非我大幅提高了公差,否则所有模型都为FALSE。但是它们的收敛度量确实有很大差异。
尝试了以下不同的优化器/模型估计方法:
isSingular()
converge_ok(q2, tolerance = 0.001)
glmerControl(optimizer = "bobyqa") and glmerControl(optimizer ="Nelder_Mead")
函数。 代码如下:
glmerControl(optimizer ='optimx', optCtrl=list(method='nlminb'))
all_fit()
# 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
在我看来,这些替代性优化方法均未成功;实际上,那时似乎有些人提出了其他警告/错误,这会把我带到另一个困境中。
有人能建议我如何改进这些模型吗? 我不是要将这些模型用作最终模型,而是要疏通它们,然后从不同的替代子集模型中选择最佳/最佳模型。
答案 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。