- まずは、ポアソン過程の平均値の推定
$ cat poi.stan
data{
intJ; // number of data
int y[J];
}
parameters{
real mu;
}model{
y[J] ~ poisson(mu);
}
平均30のポアソン分布
###Poison
library("rstan")
y<-rpois(100,lambda=30)
data <- list(J = 100, y =y)
fit <- stan(file = 'poi.stan', data = data,iter = 1000,chains = 4)
print(fit)
出力結果:
Inference for Stan model: poi.
4 chains, each with iter=1000; warmup=500; thin=1;
post-warmup draws per chain=500, total post-warmup draws=2000.mean se_mean sd 2.5% 25% 50% 75% 97.5% n_eff Rhat
mu 33.61 0.21 5.57 23.95 29.55 33.31 37.09 45.33 683 1
lp__ 81.92 0.02 0.65 80.17 81.77 82.17 82.34 82.38 948 1Samples were drawn using NUTS(diag_e) at Sat Mar 12 10:44:44 2016.
For each parameter, n_eff is a crude measure of effective sample size,
and Rhat is the potential scale reduction factor on split chains (at
convergence, Rhat=1).
- 次に平均がランダムに変化するポアソン過程の平均と分散の推定
$ cat poi4.stan
data{ int<lower=0> J; // number of schools real y[J]; // estimated treatment effects } parameters { real mu1; real<lower=0.000> sd1; } transformed parameters{ } model{ #lambda ~ poisson(mu1); for(j in 1:J){ increment_log_prob(normal_log(lambda1[j],mu1,sd1)); } for(j in 1:J){ increment_log_prob(poisson_log(y[j],lambda1[j])); # increment_log_prob(poisson_log(y[j],mu1)); } #lambda ~ normal(mu1,mu1*k1); # y ~ poisson(mu1); }
*尤度表示をつかっている.
increment_log_prob は尤度を足し込んでいく関数.
Rコード
###RD process
y<-rpois(100,rnorm(100,mean=100,sd=20))
data <- list(J = 100, y =y)
fit <- stan(file = 'poi_4.stan', data = data,iter = 1000,chains = 4)
traceplot(fit)
plot(fit)
出力
> print(fit)
Inference for Stan model: poi_3.
4 chains, each with iter=1000; warmup=500; thin=1;
post-warmup draws per chain=500, total post-warmup draws=2000.mean se_mean sd 2.5% 25% 50% 75% 97.5% n_eff Rhat
mu1 103.19 0.05 1.70 99.92 102.04 103.22 104.27 106.49 1049 1.00
sd1 17.74 0.04 1.34 15.42 16.79 17.65 18.52 20.72 1044 1.01
lp__ -425.94 0.04 1.05 -428.84 -426.31 -425.62 -425.23 -424.97 574 1.01Samples were drawn using NUTS(diag_e) at Sun Mar 13 09:40:51 2016.
For each parameter, n_eff is a crude measure of effective sample size,
and Rhat is the potential scale reduction factor on split chains (at
convergence, Rhat=1).
##RD model2
N<-30
x<-1:30
inits<-list(list(alpha=5,beta=50),list(alpha=5,beta=50),list(alpha=5,beta=50),list(alpha=5,beta=50))
para <- c("alpha", "beta")
a<-rnorm(30,mean=100,sd=100*0.01)
y<-rpois(length(a),lambda=a)
data<-list(y=y,N=N)ll<-stan(file="test_6.stan",data=data,iter=1000,chain=4,init=inits,par=para)
plot(ll)
traceplot(ll)
ll
data {
int
N;
#real x[N];
inty[N]; }
parameters {
realalpha;
realbeta;
}
model{
#real mu[N];alpha ~ normal(1,0.01);
#beta ~ normal(5,0.1);
for(n in 1:N){
#mu[n] ~ normal(alpha+beta*x[n],0.1);
y[n] ~ poisson(alpha*beta);
}
}
出力:
mean se_mean sd 2.5% 25% 50% 75% 97.5%
alpha 1.00 0.00 0.01 0.98 0.99 1.00 1.01 1.02
beta 97.77 0.08 2.05 93.90 96.33 97.75 99.11 101.96
lp__ 10506.72 0.04 1.00 10504.18 10506.34 10507.03 10507.41 10507.69
n_eff Rhat
alpha 835 1.00
beta 672 1.00
lp__ 608 1.01
##RD model6
N<-300
x<-1:30
#inits<-list(list(alpha=5,beta=50),list(alpha=5,beta=50),list(alpha=5,beta=50),list(alpha=5,beta=50))
para <- c("alpha", "beta","sigma","delta")
a<-rnorm(N,mean=1,sd=0.01)
c[1]<-30
for(i in 2:N){
c[i]<-0.8*c[i-1]+rnorm(N,mean=0,sd=30*0.1)+30
}y<-rpois(length(a),lambda=c*a)
data<-list(y=y,N=N)#ll<-stan(file="test_7.stan",data=data,iter=1000,chain=4,init=inits,par=para)
ll<-stan(file="test_8.stan",data=data,iter=1000,chain=4,par=para)
plot(ll)
traceplot(ll)
data {
int
N;
#real x[N];
inty[N]; }
parameters {
realdelta;
real alpha;
real beta;
real sigma;
realc[N]; }
model{
#real mu[N];delta ~ normal(1,0.01);
for(n in 2:N){
#mu[n] ~ normal(alpha+beta*x[n],0.1);
c[n] ~ normal(alpha+beta*c[n-1],sigma);
y[n] ~ poisson(c[n]*delta);
}
}
出力
Inference for Stan model: test_8.
4 chains, each with iter=1000; warmup=500; thin=1;
post-warmup draws per chain=500, total post-warmup draws=2000.mean se_mean sd 2.5% 25% 50% 75%
alpha 37.15 0.29 4.81 27.86 33.92 37.11 40.28
beta 0.75 0.00 0.03 0.69 0.73 0.75 0.77
sigma 3.69 0.11 0.83 2.13 3.13 3.61 4.15
delta 1.00 0.00 0.01 0.98 0.99 1.00 1.01
lp__ 179097.66 11.35 62.01 178981.88 179056.96 179096.99 179134.35
97.5% n_eff Rhat
alpha 46.88 274 1.01
beta 0.81 274 1.01
sigma 5.53 57 1.14
delta 1.02 233 1.00
lp__ 179245.10 30 1.17Samples were drawn using NUTS(diag_e) at Thu Mar 17 22:45:25 2016.
For each parameter, n_eff is a crude measure of effective sample size,
and Rhat is the potential scale reduction factor on split chains (at
convergence, Rhat=1).
- 2018.02.06追記
- ランダム拡散+ランダムウォーク(2)
data { int<lower=0> N; #real x[N]; real c; int<lower=0> y[N]; } parameters { real<lower=0> delta[N]; real alpha; real beta; real<lower=0> sigma; real<lower=0> gamma; real<lower=0> r[N]; //real r[N]; } model{ #real mu[N]; for(n in 2:N){ delta[n] ~ normal(1,gamma); #mu[n] ~ normal(alpha+beta*x[n],0.1); r[n] ~ normal(alpha+beta*r[n-1],sigma); y[n] ~ poisson(c*r[n]*delta[n]); }
-
- 実行スクリプト
###RD model#### N<-300 x<-1:30 #inits<-list(list(alpha=5,beta=50),list(alpha=5,beta=50),list(alpha=5,beta=50),list(alpha=5,beta=50)) para <- c("alpha", "beta","sigma","delta") a<-rnorm(N,mean=1,sd=0.01) c1<-NULL r1<-NULL r1[1]<-1 for(i in 2:N){ r1[i]<-0.8*r1[i-1]+rnorm(N,mean=0,sd=0.05)+1 } c1<-30 y<-rpois(length(a),lambda=c1*r1*a) data<-list(y=y,N=N,c=30) #ll<-stan(file="test_7.stan",data=data,iter=1000,chain=4,init=inits,par=para) #ll<-stan(file="test_8.stan",data=data,iter=1000,chain=4,par=para) ll<-stan(file="test_8b.stan",data=data,iter=1000,chain=4,par=para)
- 参考
超要約 Stan Reference
https://rstudio-pubs-static.s3.amazonaws.com/31748_bff68e5646e74bbeb267c61beba9f812.html
デバッグモードなど設定の切り替え
http://blog.kz-md.net/?p=935
RStanのおさらいをしながら読む 岩波DS 1 http://rpubs.com/uri-sy/iwanami_ds1