Path: blob/master/site/pt-br/probability/examples/HLM_TFP_R_Stan.ipynb
25118 views
Copyright 2018 The TensorFlow Probability Authors.
Licensed under the Apache License, Version 2.0 (the "License");
Regressão linear de efeitos mistos no {TF Probability, R, Stan}
1 – Introdução
Neste Colab, vamos ajustar um modelo de regressão linear de efeitos mistos para um dataset de exemplo popular. Vamos fazer o ajuste três vezes utilizando o lme4
do R, o pacote mixed-effects do Stan e os primitivos do TensorFlow Probability (TFP). Concluiremos mostrando que todos os três fornecem aproximadamente os mesmos parâmetros ajustados e distribuições posteriores.
Nossa principal conclusão é de que o TFP tem as partes gerais necessárias para fazer o ajuste de modelos tipo HLM e gera resultados consistentes com outros pacotes de software, como lme4
e rstanarm
. Este Colab não mostra com exatidão a eficiência computacional de nenhum dos pacotes comparados.
2 – Modelo linear hierárquico
Para a comparação entre o R, Stan e TFP, vamos ajustar um modelo linear hierárquico (HLM, na sigla em inglês) para o dataset Radon, popularizado em Bayesian Data Analysis de Gelman, et. al. (Análise bayesiana de dados, página 559, segunda edição; página 250, terceira edição).
Vamos supor o seguinte modelo generativo:
Na "notação de til" do lme4
do R, esse modelo é equivalente a:
log_radon ~ 1 + floor + (0 + log_uranium_ppm | county)
Vamos encontrar a estimativa de máxima verossimilhança para usando a distribuição posterior (condicionada às evidências) de .
Para ver essencialmente o mesmo modelo, porém com um intercepto aleatório, confira o Apêndice A.
Para ver uma especificação mais geral de HLMs, confira o Apêndice B.
3 – Transformação dos dados
Nesta seção, vamos obter o dataset radon
e fazer um pré-processamento mínimo para deixá-lo adequado ao modelo presumido.
3.1 – Conheça seus dados
Nesta seção, vamos explorar o dataset radon
para entender melhor por que o modelo proposto poderá ser razoável.
Conclusões:
Há uma cauda longa de 85 condados (uma ocorrência comum em modelos lineares generalizados mistos).
não é restringido (portanto, a regressão linear pode fazer sentido).
As medições são feitas principalmente no º andar, nenhuma medição foi feita acima do º andar (portanto, os efeitos fixos terão somente dois pesos).
4 – HLM no R
Nesta seção, usaremos o pacote lme4
do R para ajustar o modelo probabilístico descrito acima.
OBSERVAÇÃO: para executar o código nesta seção, você precisa mudar para um runtime de Colab do R.
5 – HLM no Stan
Nesta seção, usaremos o rstanarm para ajustar um modelo do Stan usando a mesma fórmula/sintaxe do modelo do lme4
acima.
Diferentemente do modelo do lme4
e do TF abaixo, o rstanarm
é um modelo totalmente bayesiano, isto é, todos os parâmetros são presumidamente obtidos a partir de uma distribuição normal, com os parâmetros em si obtidos a partir de uma distribuição.
OBSERVAÇÃO: para executar o código nesta seção, você precisa mudar para um runtime de Colab do R
.
Observação: os runtimes têm um único núcleo de CPU (este Colab não tem a pretensão de ser uma representação fiel do runtime do Stan ou do TFP).
Observação: volte para o runtime do kernel do TF no Python.
Recupere as estimativas de ponto e os desvios padrão condicionais para os efeitos aleatórios do grupo a partir do lme4 para visualização posterior.
Obtenha amostras para os pesos de condado usando as médias e desvios padrão estimados pelo lme4.
Também recuperamos as amostras posteriores dos pesos de condado a partir do ajuste do Stan.
Este exemplo do Stan mostra como implementar a regressão linear de efeitos mistos em um estilo próximo ao do TFP, isto é, especificando o modelo probabilístico diretamente.
6 – HLM no TF Probability
Nesta seção, usaremos os primitivos de baixo nível do TensorFlow Probability (Distributions
) para especificar o modelo linear hierárquico, bem como para ajustar os parâmetros desconhecidos.
6.1 – Especifique o modelo
Nesta seção, vamos especificar o modelo linear de efeitos mistos de radônio usando primitivos do TFP. Para fazer isso, especificamos duas funções que geram duas distribuições do TFP:
make_weights_prior
: uma distribuição anterior normal multivariada para os pesos aleatórios (que são multiplicados por para computar o preditor linear).make_log_radon_likelihood
: um lote de distribuiçõesNormal
para cada variável dependente observada.
Como estamos ajustando os parâmetros de cada uma dessas distribuições, precisamos usar variáveis do TF (isto é, tf.get_variable
). Porém, como queremos usar otimização não restringida, precisamos encontrar uma forma de restringir valores reais para conseguir a semântica necessária, ou seja, positivos que representam desvios padrão.
A seguinte função constrói a distribuição anterior: , em que denota os pesos de efeitos aleatórios, e denota o desvio padrão.
Usamos tf.make_template
para garantir que a primeira chamada a essa função instancie as variáveis do TF usadas e que todas as chamadas subsequentes reutilizem o valor atual das variáveis.
A seguinte função constrói a verossimilhança: , em que denota a resposta e a evidência, denota pesos de efeitos aleatórios e fixos, e denota o desvio padrão.
Novamente, usamos tf.make_template
para garantir que as variáveis do TF sejam reutilizadas por chamadas subsequentes.
Por fim, usamos os geradores de distribuição anterior e verossimilhança para construir a densidade logarítmica conjunta.
6.2 – Treinamento (maximização de expectativa com aproximação estocástica)
Para ajustar o modelo de regressão linear de efeitos mistos, usaremos uma versão de aproximação estocástica do algoritmo de maximização de expectativa (SAEM, na sigla em inglês). A ideia básica é usar amostras da distribuição posterior para fazer a aproximação da densidade logarítmica conjunta esperada (passo E). Em seguida, encontramos os parâmetros que maximizam esse cálculo (passo M). De uma forma um pouco mais concreta, a iteração de ponto fixo é dada por:
em que denota a evidência, denota uma variável latente que precisa ser marginalizada, e denotam possíveis parametrizações.
Confira uma explicação mais detalhada em Convergence of a stochastic approximation version of the EM algorithms (Convergência de uma versão de aproximação estocástica dos algoritmos de EM) de Bernard Delyon, Marc Lavielle, Eric, Moulines (Ann. Statist., 1999).
Para computar o passo E, precisamos fazer a amostragem da distribuição posterior. Como não é fácil fazer isso, usamos o Monte Carlo Hamiltoniano (HMC). O HMC é um procedimento de Monte Carlo via Cadeias de Markov que usa gradientes (estado wrt, não parâmetros) da densidade logarítmica posterior não normalizada para propor novas amostras.
Especificar a densidade logarítmica posterior não normalizada é simples: ela é simplesmente a densidade logarítmica conjunta "fixada" para a condição que desejamos.
Agora, computamos o passo E criando um kernel de transição do HMC.
Observações:
Usamos
state_stop_gradient=True
para evitar que o passo M faça a retropropagação por meio de obtenções de dados do MCMC (lembre-se de que não precisamos da retropropagação porque nosso passo E é intencionalmente parametrizado nos estimadores anteriores mais bem conhecidos.)Usamos
tf.placeholder
para que, quando executarmos o grafo do TF, possamos usar a amostra do MCMC aleatória da iteração anterior como o valor da cadeia da próxima iteração.Usamos a heurística
step_size
adaptativa do TFP,tfp.mcmc.hmc_step_size_update_fn
.
Agora, configuramos o passo M. É basicamente igual ao que um passo de otimização faz no TF.
Concluímos com algumas tarefas de organização. Precisamos indicar ao TF que todas as variáveis estão inicializadas. Também criamos identificadores para as variáveis do TF para que possamos exibir seus valores via print
em cada iteração do procedimento.
6.3 – Execute
Nesta seção, vamos executar nosso grafo do TF relativo ao SAEM. O principal truque é alimentar a última obtenção de dados do kernel do HMC na próxima iteração, o que é feito utilizando feed_dict
na chamada sess.run
.
Parece que, após cerca de 1.500 passos, as estimativas dos parâmetros estabilizaram.
6.4 – Resultados
Agora que ajustamos os parâmetros, vamos gerar um grande número de amostras posteriores e estudar os resultados.
Agora vamos construir um diagrama de caixa estreita do efeito aleatório . Vamos ordenar os efeitos aleatórios pela frequência decrescente de condados.
No diagrama de caixa estreita, observamos que a variância do efeito aleatório no nível de condado aumenta à medida que o condado é menos representado no dataset, o que faz sentido intuitivamente – devemos ter menos certeza sobre o impacto de um determinado condado se tivermos menos evidências para ele.
7 – Comparativo triplo lado a lado
Agora, vamos comparar os resultados dos três procedimentos. Para isso, vamos computar as estimativas não paramétricas das amostras posteriores geradas pelo Stan e TFP. Também vamos comparar com as estimativas paramétricas (aproximadas) geradas pelo pacote lme4
do R.
O gráfico abaixo mostra a distribuição posterior de cada peso para cada condado de Minnesota. Mostramos os resultados para o Stan (vermelho), TFP (azul) e lme4
do R (laranja). Sombreamos os resultados do Stan e TFP, portanto, você verá em roxo quando os dois coincidirem. Por questões de simplicidade, não sombreamos os resultados do R. Cada subgráfico representa um único condado, e os subgráficos são ordenados em frequência decrescente, da esquerda para a direita e de cima para baixo.
8 – Conclusão
Neste Colab, ajustamos um modelo de regressão linear de efeitos mistos para o dataset radon. Utilizamos três pacotes de software diferentes: R, Stan e TensorFlow Probability. Concluímos plotando as 85 distribuições posteriores conforme computadas pelos três pacotes.
Apêndice A: HLM do Radon alternativo (com intercepto aleatório)
Nesta seção, vamos descrever um HLM alternativo que também tem um intercepto aleatório associado a cada condado.
Na "notação de til" do lme4
do R, esse modelo é equivalente a:
log_radon ~ 1 + floor + (1 + log_county_uranium_ppm | county)
Apêndice B: modelos lineares generalizados de efeitos mistos
Nestas seção, mostraremos uma caracterização mais geral dos modelos lineares hierárquicos do que a usada no corpo do documento. Esse modelo mais geral é conhecido como modelo linear generalizado de efeitos mistos (GLMM, na sigla em inglês).
Os GLMMs são generalizações dos modelos lineares generalizados (GLMs). Os GLMMs estendem os GLMs, incorporando ruído aleatório específico das amostras à resposta linear prevista, o que é útil em parte porque permite que características raramente vistas compartilhem informações com características vistas com maior frequência.
Como um processo generativo, um modelo linear generalizado de efeitos mistos (GLMM) é caracterizado por:
ParseError: KaTeX parse error: Expected 'EOF', got '#' at position 70: …e{2.45cm}\text{#̲ para cada grup…onde:
Basicamente, toda categoria de cada grupo está associada a um iid MVN, . Embora as obtenções de sejam sempre independentes, são distribuídas identicamente somente para um grupo ; observe que existe exatamente um para cada .
Ao combinar com as características de grupo de uma amostra, , o resultado é um ruído específico para a amostra na ésima resposta linear prevista (que também é ).
Quando estimamos , estamos basicamente estimando a quantidade de ruído que um grupo de efeitos aleatórios transporta, que, caso contrário, abafaria o sinal presente em .
Há diversas opções para e a função de ligação inversa, . Confira algumas escolhas comuns:
ParseError: KaTeX parse error: Expected 'EOF', got '_' at position 81: …i), \text{total_̲count}=n_i)
.
Confira mais possibilidades no módulo tfp.glm
.