glmer用户定义的链接函数给出错误:(maxstephalfit)PIRLS步长减半未能减少偏差

时间:2014-10-02 01:00:07

标签: r lme4

在尝试利用具有随机效果影响的用户定义链接功能时,我遇到了一个我不知道如何排除故障的错误:

Error: (maxstephalfit) PIRLS step-halvings failed to reduce deviance in pwrssUpdate

有没有人对如何解决此错误提出任何建议?它没有提供太多方向。

我已尝试按照rpubs.com/bbolker/logregexp中所述的方式按照说明定义新的链接功能(特别是缩放的logit),但如果我的定义的某些方面不正确,我不会感到惊讶。看到我失踪的任何东西?

scaled_logit <- function(s = 1) {
  linkfun <- function(mu) log( max(0, mu / (s-mu)) )
  linkinv <- function(eta) s / (1 + exp(-eta))
  mu.eta <- function(eta) s * exp(-eta) / (1 + exp(-eta))^2
  valideta <- function(eta) TRUE
  link <- paste0('scaled_logit(',s,')')
  structure(list(linkfun = linkfun, linkinv = linkinv, mu.eta = mu.eta, valideta = valideta, name = link), class = 'link-glm')
}

此实现一定有问题,因为估计与标准二项式族(假定的logit链接)一起正常工作,但是当我用s = 1(应该相同)引用此链接时出错。可以按如下方式生成样本数据:

library(data.table)

courts <- 50
test_courts <- data.table(court = 1:courts,
                     court_factor = pmax(0, rnorm(courts, mean=1, sd=0.25)))
setkey(test_courts, court)
pros <- 100
test_pros <- data.table(ID = 1:pros,
                       deg1_rate = pmax(0, rnorm(pros, mean=0.02, sd=0.0075)))
setkey(test_pros, ID)

test_data <- data.table(expand.grid(ID = 1:pros, court = 1:courts))
setkeyv(test_data, c('ID','court'))
test_data <- merge(test_data, test_courts, by='court', all.x=TRUE)
test_data <- merge(test_data, test_pros  , by='ID'   , all.x=TRUE)

test_data[ , indict := sample(0:20, nrow(test_data), replace=TRUE)]
test_data[ , deg1 := rbinom(pros*courts, size=indict, prob=court_factor*deg1_rate)]

我之后一直试图估算简单模型

logit_link <- glmer(cbind(deg1, indict-deg1) ~ (1|ID) + (1|court), family=binomial, data=test_data[indict > 0])

和相应的替代

scaled_link <- glmer(cbind(deg1, indict-deg1) ~ (1|ID) + (1|court), family=binomial(link=scaled_logit()), data=test_data[indict > 0])

任何见解都将不胜感激!我在R 3.0.3上使用lme4 1.1.6。

1 个答案:

答案 0 :(得分:4)

我认为你的问题会变成没有&#34;钳位&#34;反向链接函数(即将结果严格保持在0和1之间),但事实证明(我认为)它比那简单得多 - 只是max()和{{1的混淆}}。 (pmax()有一个非常危险的设计!)这对我有用:

max()

也就是说,将scaled_logit <- function(s = 1) { linkfun <- function(mu) log( pmax(0, mu / (s-mu)) ) linkinv <- function(eta) s / (1 + exp(-eta)) mu.eta <- function(eta) s * exp(-eta) / (1 + exp(-eta))^2 valideta <- function(eta) TRUE link <- paste0('scaled_logit(',s,')') structure(list(linkfun = linkfun, linkinv = linkinv, mu.eta = mu.eta, valideta = valideta, name = link), class = 'link-glm') } 而不是pmax(epsilon,...)设置为pmax(0,...)epsilon之间的反向链接函数可能是一个好主意。 (其中1-epsilon类似于1e-6)。

PS我们(epsilon维护者)应该尝试在PIRLS步骤中插入一些更强大的错误检查 - lme4 /非有限值的许多问题弹出看起来像PIRLS失败,当它们不是真的时候(NaN似乎通过C ++代码传播而不会引发任何直接的失败......)