在尝试利用具有随机效果影响的用户定义链接功能时,我遇到了一个我不知道如何排除故障的错误:
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。
答案 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 ++代码传播而不会引发任何直接的失败......)