Skip to content

RStan Getting Started (Português)

Luiz Max F. Carvalho edited this page Nov 17, 2018 · 15 revisions

(Translation: Luiz Max Carvalho & Marco Inácio)


RStan é a interface para a Stan no R. Para mais informações sobre a Stan e a sua linguagem de modelagem, visite o website em http://mc-stan.org/

Versão mais recente: 2.18.2   (09 de Novembro de 2018)

Quase todas as instruções de instalação abaixo são para a versão do RStan citada acima, que necessita que você tenha o R na versão 3.4.0 ou mais recente. Se necessário, você pode baixar a versão mais recente do R aqui.

Além disso, recomendamos fortemente que você use o RStudio, versão 1.2.x ou mais recente porque este tem ótimo suporte à Stan.

Instalação do RStan

Por precaução, muitas vezes é necessário remover qualquer Rstan existente no sistema via usando?

remove.packages("rstan")
if (file.exists(".RData")) file.remove(".RData")

Depois disso, reabra o R.

Na maioria dos casos você pode simplesmente digitar (exatamente dessa forma)

install.packages("rstan", repos = "https://cloud.r-project.org/", dependencies = TRUE)

No entanto, se você usa o Linux, se getOption("pkgType") está configurado para "source" ou se o R perguntar se você deseja instalar a versão mais recente do Rstan a partir da fonte ("from source"), vá até a página correspondente para cada plataforma: Windows, Mac ou Linux.

Conferindo checando?não gosto, estrangeirismo, but whatever o conjunto de ferramentas ("toolchain") C++.

No RStudio (preferencialmente) ou no R, execute uma vez

pkgbuild::has_build_tools(debug = TRUE)

para se certificar que o seu conjunto de ferramentas C++ (toolchain) está usando o pacote pkgbuild que é instalado junto com o Rstan. Se essa linha de código retorna TRUE, então sua toolchain está instalada corretamente e você pode pular para a próxima seção.

Caso contrário,

  • Se você utiliza Windows e RStudio (recomendado), uma janela pop-up vai aparecer perguntando se você deseja instalar o Rtools. Clique em Yes/Sim e espere a instalação terminar.
  • Se você utiliza Windows mas não o RStudio, uma menssagem aparecerá no console do R lhe dizendo para instalar o Rtools. Mais informações sobre baixar e instalar rtools pode ser úteis, mas você normalmente NÃO precisa ir para a seção intitulada "Instalando o RStan a partir da fonte".
  • Se você utiliza Mac, um link irá aparecer, mas não clique nele. Em vez disso, vá aqui
  • Se você utiliza Linux (incluindo o subsistema Windows para Linux), então vá aqui.

Se você seguir as instruções acima mas não obtiver sucesso, pode obter ajuda no Forum da Stan no Discourse mas por favor se certifique de nos dizer qual o seu sistema operacional, se você utiliza o RStudio e qual o output quando você tenta as instruções acima.

Configuração do conjunto de ferramentas (toolchain) C++

Esse passo é opcional, mas pode resultar em programas Stan compilados que rodam muito mas rápido do que rodariam de outra forma. Simplesmente cole o código abaixo no R

dotR <- file.path(Sys.getenv("HOME"), ".R")
if (!file.exists(dotR)) dir.create(dotR)
M <- file.path(dotR, ifelse(.Platform$OS.type == "windows", "Makevars.win", "Makevars"))
if (!file.exists(M)) file.create(M)
cat("\nCXX14FLAGS=-O3 -march=native -mtune=native",
    if( grepl("^darwin", R.version$os)) "CXX14FLAGS += -arch x86_64 -ftemplate-depth-256" else 
    if (.Platform$OS.type == "windows") "CXX11FLAGS=-O3 -march=native -mtune=native" else
    "CXX14FLAGS += -fPIC",
    file = M, sep = "\n", append = TRUE)

No entanto, esteja ciente que mudar o nível de otimização para O3 pode causar problemas para outros pacotes além do RStan e que, em casos raros, especificar -march=native -mtune=native pode fazer com que programas Stan não funcionem. Se vocẽ alguma vez precisar mudar as configurações da sua toolchain C++, pode executar

M <- file.path(Sys.getenv("HOME"), ".R", ifelse(.Platform$OS.type == "windows", "Makevars.win", "Makevars"))
file.edit(M)

Como utilizar o RStan

O restante deste documento assume que você já instalou o Rstan seguindo as instruções acima.

Carregando o pacote

O nome do pacote é rstan (minúsculas), então começaremos executando

library("rstan") # observe as mensagens de inicialização

Como diz a mensagem de inicialização, se você utiliza o rstan localmente numa máquina com múltiplos processadores e tem bastante memória RAM para estimar o seu modelo em paralelo, execute

options(mc.cores = parallel::detectCores())

Além disso, você deve seguir a segunda mensagem de inicialização que pede que você execute

rstan_options(auto_write = TRUE)

que permite que você salve uma versão compilada do seu programa Stan no disco rígido, de forma que este não precise ser compilado novamente (a menos que você o mude). Por último, se você utiliza Windows, haverá uma terceira mensagem de inicialização pedindo que execute

Sys.setenv(LOCAL_CPPFLAGS = '-march=native')

que não é necessário se você seguiu os conselhos sobre a toolchain C++ na seção anterior.

Exemplo 1: Eight Schools

Esse é um exempĺo da seção 5.5 de Gelman et al (2003), que estudam os efeitos de programas educacionais sobre a performance dos estudantes no Scholastic Aptitude Test (SAT) em oito escolas. Chamaremos este exemplo de "eight schools".

Começaremos escrevendo um programa Stan com o modelo num arquivo de texto. Se você está utilizando o RStudio na versão 1.2.x ou mais recente, clique em Arquivo -> Novo arquivodocumento? não sei, não tenho uma instalação em PT para testar -> Arquivo Stan. Se não, abra seu editor de texto favorito. De qualquer forma, cole o código abaixo e salve seu trabalho em um arquivo chamado 8schools.stan no diretório de trabalho é esse o nome em português no R? (que você pode ver executando getwd()).

// saved as 8schools.stan
data {
  int<lower=0> J;         // número de escolas 
  real y[J];              // estimativas dos efeitos dos tratamentos
  real<lower=0> sigma[J]; // erro padrão das estimativas
}
parameters {
  real mu;                // efeito populacional do tratamento
  real<lower=0> tau;      // desvio padrão dos efeitos do tratamento
  vector[J] eta;          // desvio de mu por escola (não-normalizado)
}
transformed parameters {
  vector[J] theta = mu + tau * eta;        // efeitos do tratamento por escola
}
model {
  target += normal_lpdf(eta | 0, 1);       // log-densidade a priori
  target += normal_lpdf(y | theta, sigma); // log-verossimilhança
}

Certifique-se de que seu programa Stan termina com uma linha em branco, sem nenhum caractere, incluindo espaços e comentários.

Nesse programa Stan, nós vamos usar theta como a transformação transformada? de mueeta(no blocotransformed parameters) em vez de declarar thetadiretamente no blocoparameters`, que permite que o amostrador rode mais eficientemente (ver explicação detalhada). Podemos preparar os dados -- que geralmente são uma lista com nomes (named list) -- no R usando:

schools_dat <- list(J = 8, 
                    y = c(28,  8, -3,  7, -1,  1, 18, 12),
                    sigma = c(15, 10, 16, 11,  9, 11, 10, 18))

E nós podemos obter um ajuste com o seguinte comando R. Note que o argumento file = deve apontar para onde o arquivo 8schools.stan está no seu sistema, a menos que você tenha posto no diretório onde está o R, caso em que o comando abaixo deverá funcionar.

fit <- stan(file = '8schools.stan', data = schools_dat)

O objeto fit, retornado pela função stan é um objeto S4 de classe stanfit. Métodos como print, plot, e pairs estão associados com o resultado ajustado de modo que podemos utilizar o código que se segue para avaliar os resultados em fit. O método print oferece um sumário do parâmetro do modelo e também da densidade log-posteriori sob o nome de lp__ (ver o output de exemplo que se segue). Para mais métodos e detalhes da classe stanfit, veha a ajuda da classe stanfit.

Em particular, podemos usar a função extract em objetos stanfit para obter as amostras. O metódo extract extrai as amostras de um objeto stanfit na forma de uma lista de arrays para os parâmetros de interesse, ou apenas um array. Além disso, funções S3 as.array, as.matrix, e as.data.frame estão definidas para objetos stanfit (utilize help("as.array.stanfit") para olhar a documentação de ajuda no R).

print(fit)
plot(fit)
pairs(fit, pars = c("mu", "tau", "lp__"))

la <- extract(fit, permuted = TRUE) # retorna uma lista de arrays 
mu <- la$mu 

### retorna um array de três dimensôes: iterações, cadeias, paramêtros (iterations, chains, parameters)
a <- extract(fit, permuted = FALSE) 

### use funções S3 em objetos
a2 <- as.array(fit)
m <- as.matrix(fit)
d <- as.data.frame(fit)

Exemplo 2: Rats

The Rats example is also a popular example. For example, we can find the OpenBUGS version from here, which originally is from Gelfand et al (1990). The data are about the growth of 30 rats weekly for five weeks. In the following table, we list the data, in which we use x to denote the dates the data were collected. We can try this example using the linked data rats.txt and model code rats.stan.

Rat x=8 x=15 x=22 x=29 x=36 Rat x=8 x=15 x=22 x=29 x=36
1 151 199 246 283 320 16 160 207 248 288 324
2 145 199 249 293 354 17 142 187 234 280 316
3 147 214 263 312 328 18 156 203 243 283 317
4 155 200 237 272 297 19 157 212 259 307 336
5 135 188 230 280 323 20 152 203 246 286 321
6 159 210 252 298 331 21 154 205 253 298 334
7 141 189 231 275 305 22 139 190 225 267 302
8 159 201 248 297 338 23 146 191 229 272 302
9 177 236 285 350 376 24 157 211 250 285 323
10 134 182 220 260 296 25 132 185 237 286 331
11 160 208 261 313 352 26 160 207 257 303 345
12 143 188 220 273 314 27 169 216 261 295 333
13 154 200 244 289 325 28 157 205 248 289 316
14 171 221 270 326 358 29 137 180 219 258 291
15 163 216 242 281 312 30 153 200 244 286 324
y <- as.matrix(read.table('https://raw.github.com/wiki/stan-dev/rstan/rats.txt', header = TRUE))
x <- c(8, 15, 22, 29, 36)
xbar <- mean(x)
N <- nrow(y)
T <- ncol(y)
rats_fit <- stan('https://raw.githubusercontent.com/stan-dev/example-models/master/bugs_examples/vol1/rats/rats.stan')

Example 3: Anything

You can run many of the BUGS examples and some others that we have created in Stan by executing

model <- stan_demo()

and choosing an example model from the list that pops up. The first time you call stan_demo(), it will ask you if you want to download these examples. You should choose option 1 to put them in the directory where rstan was installed so that they can be used in the future without redownloading them. The model object above is an instance of class stanfit, so you can call print, plot, pairs, extract, etc. on it afterward.

More Help

More details about RStan can be found in the documentation including the vignette of package rstan. For example, using help(stan) and help("stanfit-class") to check out the help for function stan and S4 class stanfit.
And see Stan's modeling language manual for details about Stan's samplers, optimizers, and the Stan modeling language.

In addition, the Stan User's Mailing list can be used to discuss the use of Stan, post examples or ask questions about (R)Stan. When help is needed, it is important to provide enough information such as the following:

  • properly formatted syntax in the Stan modeling language
  • data
  • necessary R code
  • dump of error message using verbose=TRUE and cores=1 when calling the stan or sampling functions
  • information about R by using function sessionInfo() in R

References

  • Gelman, A., Carlin, J. B., Stern, H. S., and Rubin, D. B. (2003). Bayesian Data Analysis, CRC Press, London, 2nd Edition.
  • Stan Development Team. Stan Modeling Language User's Guide and Reference Manual.
  • Gelfand, A. E., Hills S. E., Racine-Poon, A., and Smith A. F. M. (1990). "Illustration of Bayesian Inference in Normal Data Models Using Gibbs Sampling", Journal of the American Statistical Association, 85, 972-985.
  • Stan
  • R
  • BUGS
  • OpenBUGS
  • JAGS
  • Rcpp