Greta

Por Daniel 08/07/2017

Estou bem longe de ter experiência em modelagem bayesiana usando linguagens de programação probabilística como Stan ou BUGS, mas vi esse pacote chamado greta que me chamou a atenção.

O greta é um pacote feito totalmente em R, mas que usa o TensorFlow como backend para fazer os seus cálculos. Isso tudo por intermédio do reticulate. A vantagem de usar o TensorFlow como backend é a escalabilidade: o greta pode ser rápido até mesmo em bases de dados grandes e também pode ser acelerada usando clusters de CPU’s ou GPU’s.

O greta já está disponível no CRAN e pode ser instalado com:

install.packages("greta")

Vou mostrar um exemplo simples copiado da página de início do site do próprio greta e depois vou implementar um modelo que o Fernando implementou aqui no blog em um outro post sobre estimar um modelo heterocedástico no R.

Exemplo simples

Vamos implementar o modelo de regressão linear mais simples possível. Temos duas variáveis contínuas \(x\) e \(y\) e queremos estimar um modelo da forma:

\[y = a + b*x + \epsilon\]

em que \(\epsilon\) possui distribuição normal com média zero e desvio padrão \(\sigma\). No greta isso pode ser feito da seguinte forma:

library(greta)
# define as variáveis x e y
x <- iris$Petal.Length
y <- iris$Sepal.Length

# define a distribuição priori dos parâmetros
a = normal(0, 5)
b = normal(0, 3)
sd = lognormal(0, 3)

# define o modelo
mean <- a + b * x
distribution(y) = normal(mean, sd)
m <- model(a, b, sd)

# retira amostras usando mcmc
draws <- mcmc(m, n_samples = 1000)

Você pode fazer um gráfico para visualizar as estimativas dos parâmetros usando o bayesplot:

bayesplot::mcmc_trace(draws, facet_args = list(ncol = 1))

Podemos obter as estimativas pontuais dos parâmetros pegando, por exemplo, a mediana dessa amostra do MCMC.

apply(draws[[1]], 2, median)
##         a         b        sd 
## 4.2805710 0.4219092 0.3697692

Esse resultado é muito similar ao que pode ser obtido por uma regressão linear simples:

lm(y ~ x)
## 
## Call:
## lm(formula = y ~ x)
## 
## Coefficients:
## (Intercept)            x  
##      4.3066       0.4089

Modelo linear heterocedástico

Neste post o Fernando simulou um banco de dados que é heterocedástico e depois ajustou um modelo deste tipo de diversas maneiras, vou acrescentar mais uma aqui, desta vez usando o greta.

Vou simular o banco de dados da mesma forma que o Fernando:

library(ggplot2)

N <- 1000

set.seed(11071995)
X <- sample((N/100):(N*3), N)
Y <- rnorm(N,X,4*sqrt(X))

qplot(X,Y) + 
  theme_bw(15) + 
  geom_point(color = 'darkorange')  

X2 <- sqrt(X)
dataset <- data.frame(Y,X,X2)

Agora o código em greta para ajustar esse modelo:

# definir os vetores
y <- dataset$Y
x <- dataset$X
x2 <- dataset$X2

# definir prioris dos parâmetros
alpha <- gamma(1, 1)
beta <- normal(0, 10)

# definir ligações
mean <- beta * x
sd <- alpha * x2

# definir o modelo
distribution(y) = normal(mean, sd)
m <- model(alpha, beta)

# ajustar
draws <- mcmc(m, n_samples = 1000)

Agora as estimativas pontuais:

apply(draws[[1]], 2, median)
##    alpha     beta 
## 4.077689 1.002791

Como esperado, chegamos em estimativas bem próximas do que foi simulado.

Por hoje é isso!! Abraços!

comments powered by Disqus