Skip to content

Instantly share code, notes, and snippets.

@dfd
Forked from MatsuuraKentaro/model.stan
Created October 17, 2016 02:21
Show Gist options
  • Save dfd/a7d761f3dada38e35f325ca6f29ac81c to your computer and use it in GitHub Desktop.
Save dfd/a7d761f3dada38e35f325ca6f29ac81c to your computer and use it in GitHub Desktop.
Tweedie distribution in Stan
data {
int N;
int M;
real<lower=0> Y[N];
}
parameters {
real<lower=0> mu;
real<lower=0> phi;
real<lower=1, upper=2> theta;
}
transformed parameters {
real lambda;
real alpha;
real beta;
lambda <- 1/phi*mu^(2-theta)/(2-theta);
alpha <- (2-theta)/(theta-1);
beta <- 1/phi*mu^(1-theta)/(theta-1);
}
model {
mu ~ cauchy(0, 5);
phi ~ cauchy(0, 5);
for (n in 1:N) {
if (Y[n] == 0) {
increment_log_prob(-lambda);
} else {
vector[M] ps;
for (m in 1:M)
ps[m] <- poisson_log(m, lambda) + gamma_log(Y[n], m*alpha, beta);
increment_log_prob(log_sum_exp(ps));
}
}
}
library(rstan)
library(tweedie)
stanmodel <- stan_model(file='model/model.stan')
N1 <- 200
M1 <- 30
Y1 <- rtweedie(N1, power=1.3, mu=1, phi=1)
data1 <- list(N=N1, M=M1, Y=Y1)
fit1 <- sampling(stanmodel, data=data1)
N2 <- 1000
M2 <- 30
Y2 <- rtweedie(N2, power=1.01, mu=3, phi=1)
data2 <- list(N=N2, M=M2, Y=Y2)
fit2 <- sampling(stanmodel, data=data2)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment