Como ajustar um modelo misto com variável de resposta entre 0 e 1?

15

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 glmerchamada, caso contrário ela não converge de maneira alguma.)

ameba diz Restabelecer Monica
fonte
11
Que tal transformar as probabilidades primeiro? Você pode obter algo mais próximo do que normalmente é distribuído com, digamos, uma transformação de logit? Ou o arcsin-sqrt? Essa seria a minha preferência, em vez de usar o glmer. Ou na sua solução de hackers, você também pode tentar adicionar um efeito aleatório para cada observação para explicar a falta de dispersão devido à sua escolha de pesos.
Aaron - Restabelece Monica
Obrigado. Sim, posso logar no DV e depois usar o modelo misto gaussiano (lmer), mas isso também é uma espécie de hack e li que não é recomendado. Vou tentar um efeito aleatório para cada observação! No momento, estou tentando o modelo misto beta; O lme4 não pode lidar com isso, mas o glmmadmb pode. Quando corro 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.
Ameba diz Reinstate Monica
Eu não sei para glmer, mas para glm isso pode ajudar: stats.stackexchange.com/questions/164120/… :
11
@ Aaron: tentei adicionar + (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.)
ameba diz Reintegrar Monica
11
E eles estão absolutamente certos sobre seu valor como 0,9, ou eles também têm alguma "margem de erro"? Você pode supor que a confiança relatada por diferentes sujeitos seja igualmente precisa?

Respostas:

20

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):

  1. p=m/nnnN

    glm(p ~ a+b+c, myData, family="binomial", weights=n)
  2. pp01 1 consulte este tópico ).

    betareg(p ~ a+b+c, myData)
  3. O Logit transforma a resposta e usa regressão linear. Isso geralmente não é recomendado.

    lm(log(p/(1-p)) ~ a+b+c, myData)
  4. 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 glmseguinte maneira:

    glm(p ~ a+b+c, myData, family="quasibinomial")

As mesmas quatro maneiras estão disponíveis com efeitos aleatórios.

  1. Usando weights argumento ( um , dois ):

    glmer(p ~ a+b+c + (1|subject), myData, family="binomial", weights=n)

    De acordo com o segundo link acima, pode ser uma boa ideia modelar superdispersão, veja lá (e também o item 4 abaixo).

  2. Usando modelo misto beta:

    glmmadmb(p ~ a+b+c + (1|subject), myData, family="beta")

    ou

    glmmTMB(p ~ a+b+c + (1|subject), myData, 
            family=list(family="beta",link="logit"))

    Se houver zeros ou zeros exatos nos dados de resposta, será possível usar o modelo beta com zero / um inflado em glmmTMB .

  3. Usando a conversão logit da resposta:

    lmer(log(p/(1-p)) ~ a+b+c + (1|subject), myData)
  4. Contabilizando a sobredispersão no modelo binomial. Isso usa um truque diferente: adicionar um efeito aleatório para cada ponto de dados:

    myData$rowid = as.factor(1:nrow(myData))
    glmer(p ~ a+b+c + (1|subject) + (1|rowid), myData, family="binomial",
          glmerControl(optimizer="bobyqa"))

    Por alguma razão, isso não funciona corretamente, pois glmer()reclama sobre não-inteiro pe gera estimativas sem sentido. Uma solução que eu criei é usar constantes falsas weights=ke garantir que elas p*ksejam sempre inteiras. Isso requer arredondamento, pmas a seleção de kque é grande o suficiente não deve importar muito. Os resultados não parecem depender do valor de k.

    k = 100
    glmer(round(p*k)/k ~ a+b+c + (1|subject) + (1|rowid), myData, 
          family="binomial", weights=rowid*0+k, glmerControl(optimizer="bobyqa"))

    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: glmmadmbleva de cinco a dez minutos para ser executada (e ainda reclama que não convergiu!), Enquanto lmerfunciona em uma fração de segundo e glmerleva alguns segundos. Atualização: eu tenteiglmmTMB conforme sugerido nos comentários do @BenBolker e funciona quase tão rápido quanto glmer, 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.

ameba diz Restabelecer Monica
fonte
11
Boa resposta, bem explicada e conectada com os modelos sem efeitos aleatórios. Eu não chamaria de trapaça nº 3 (a transformação), esses tipos de transformação são muito comuns em análises como essas. Em vez disso, eu diria que os itens 3 e 4 estão fazendo suposições sobre o relacionamento sobre a distribuição dos dados, e também sobre o relacionamento entre a média e a variação, e apenas porque o nº 4 está modelando na escala em que os dados foi coletado não significa que essas suposições serão melhores.
Aaron - Restabelece Monica
11
O número 3 assume que o logit das probabilidades é normal com variação constante, enquanto o número 4 assume que a variação é proporcional a p (1-p). Pela sua descrição do ajuste, estes parecem ser semelhantes o suficiente para não importarem muito. E o número 3 é quase certamente mais padrão (dependendo do seu público); portanto, se o diagnóstico for razoável, é o que eu preferiria.
Aaron - Restabelece Monica
11
outra possibilidade é usar glmmTMB ; após a instalação com devtools::install_github("glmmTMB/glmmTMB",sub="glmmTMB"), usando glmmTMB(p ~ a+b+c + (1|subject), myData, family=list(family="beta",link="logit"))deve funcionar ...
Ben Bolker
@BenBolker Thanks! Existe algum motivo para preferir o glmmTMB ao glmmADMB (para modelos beta) ou vice-versa? Um desses pacotes é mais recente ou desenvolvido mais ativamente? Além disso, posso perguntar qual a abordagem entre as listadas nesta resposta - gaussian glmm após transformação logit, beta glmm ou binomial glmm com termo (1 | rowid) - você acha geralmente preferível?
Ameba diz Reinstate Monica
11
Prefiro o beta GLMM, se possível - é o modelo estatístico que visa medir alterações nas proporções entre covariáveis ​​/ grupos. glmmTMBé mais rápido e mais estável do que glmmADMBe abaixo do desenvolvimento (ligeiramente) mais ativo, embora não tão maduro.
Ben Bolker