Estou tentando usar lme4::glmer()
para ajustar um modelo misto generalizado binomial (GLMM) com variável dependente que não é binária, mas uma variável contínua entre zero e um. Pode-se pensar nessa variável como uma probabilidade; de fato, é a probabilidade relatada por seres humanos (em um experimento que ajudo a analisar). Ou seja, não é uma fração "discreta", mas uma variável contínua.
Minha glmer()
ligação não funciona conforme o esperado (veja abaixo). Por quê? O que eu posso fazer?
Edição posterior: minha resposta abaixo é mais geral que a versão original desta pergunta, então eu modifiquei a questão para ser mais geral também.
Mais detalhes
Aparentemente, é possível usar a regressão logística não apenas para DV binário, mas também para DV contínuo entre zero e um. De fato, quando eu corro
glm(reportedProbability ~ a + b + c, myData, family="binomial")
Recebo uma mensagem de aviso
Warning message:
In eval(expr, envir, enclos) : non-integer #successes in a binomial glm!
mas um ajuste muito razoável (todos os fatores são categóricos, para que eu possa verificar facilmente se as previsões do modelo estão próximas das médias entre sujeitos e elas são).
No entanto, o que eu realmente quero usar é
glmer(reportedProbability ~ a + b + c + (1 | subject), myData, family="binomial")
Dá-me o mesmo aviso, retorna um modelo, mas esse modelo está claramente muito errado; as estimativas dos efeitos fixos estão muito longe glm()
daquelas e das médias entre sujeitos. (E preciso incluir glmerControl(optimizer="bobyqa")
na glmer
chamada, caso contrário ela não converge de maneira alguma.)
glmmadmb(reportedProbability ~ a + b + c + (1 | subject), myData, family="beta")
, obtenho o ajuste correto e intervalos razoáveis de confiança, mas uma convergência falhou : - / Tentando descobrir como aumentar o número de iterações. A versão beta pode funcionar para mim porque não tenho casos DV = 0 ou DV = 1.+ (1 | rowid)
à minha chamada glmer e isso gera estimativas estáveis e intervalos de confiança estáveis, independentemente da minha escolha de peso (tentei 100 e 500). Eu também tentei rodar o lmer no logit (reportsProbability) e recebo quase exatamente a mesma coisa. Então, ambas as soluções parecem funcionar bem! O Beta MM com glmmadmb também oferece resultados muito próximos, mas, por algum motivo, não converge completamente e leva uma eternidade para ser executado. Considere postar uma resposta listando essas opções e explicando um pouco as diferenças e os prós / contras! (Intervalos de confiança que eu mencionei são todos Wald.)Respostas:
Faz sentido começar com um caso mais simples, sem efeitos aleatórios.
Há quatro maneiras de lidar com a variável de resposta zero a um contínua que se comporta como uma fração ou uma probabilidade ( esse é o nosso tópico mais canônico / votado / visto neste tópico, mas infelizmente nem todas as quatro opções são discutidas aqui):
n
O Logit transforma a resposta e usa regressão linear. Isso geralmente não é recomendado.
Ajuste um modelo binomial, mas calcule os erros padrão levando em consideração a dispersão excessiva. Os erros padrão podem ser calculados de várias maneiras:
(a) erros padrão escalados via estimativa de superdispersão ( um , dois ). Isso é chamado GLM "quase binomial".
(b) erros padrão robustos através do estimador sanduíche ( um , dois , três , quatro ). Isso é chamado de "logit fracionário" em econometria.
Os itens (a) e (b) não são idênticos (consulte este comentário e as seções 3.4.1 e 3.4.2 deste livro , e este post do SO e também este e este ), mas tendem a fornecer resultados semelhantes. A opção (a) é implementada da
glm
seguinte maneira:As mesmas quatro maneiras estão disponíveis com efeitos aleatórios.
Usando
weights
argumento ( um , dois ):De acordo com o segundo link acima, pode ser uma boa ideia modelar superdispersão, veja lá (e também o item 4 abaixo).
Usando modelo misto beta:
ou
Se houver zeros ou zeros exatos nos dados de resposta, será possível usar o modelo beta com zero / um inflado em
glmmTMB
.Usando a conversão logit da resposta:
Contabilizando a sobredispersão no modelo binomial. Isso usa um truque diferente: adicionar um efeito aleatório para cada ponto de dados:
Por alguma razão, isso não funciona corretamente, pois
glmer()
reclama sobre não-inteirop
e gera estimativas sem sentido. Uma solução que eu criei é usar constantes falsasweights=k
e garantir que elasp*k
sejam sempre inteiras. Isso requer arredondamento,p
mas a seleção dek
que é grande o suficiente não deve importar muito. Os resultados não parecem depender do valor dek
.Atualização posterior (janeiro de 2018): pode ser uma abordagem inválida. Vejo discussão aqui . Eu tenho que investigar isso mais.
No meu caso específico, a opção 1 não está disponível.
A opção 2 é muito lenta e tem problemas com a convergência:Atualização: eu tenteiglmmadmb
leva de cinco a dez minutos para ser executada (e ainda reclama que não convergiu!), Enquantolmer
funciona em uma fração de segundo eglmer
leva alguns segundos.glmmTMB
conforme sugerido nos comentários do @BenBolker e funciona quase tão rápido quantoglmer
, sem problemas de convergência. Então é isso que eu vou usar.As opções 3 e 4 produzem estimativas e intervalos de confiança de Wald muito semelhantes (obtidos com
confint
). Eu não sou um grande fã de # 3 porque é meio que trapaça. E o número 4 parece um pouco hacky.Muito obrigado a @Aaron, que me apontou para os nºs 3 e 4 no seu comentário.
fonte
devtools::install_github("glmmTMB/glmmTMB",sub="glmmTMB")
, usandoglmmTMB(p ~ a+b+c + (1|subject), myData, family=list(family="beta",link="logit"))
deve funcionar ...glmmTMB
é mais rápido e mais estável do queglmmADMB
e abaixo do desenvolvimento (ligeiramente) mais ativo, embora não tão maduro.