拓端tecdat|R語(yǔ)言RStan貝葉斯示例:重復(fù)試驗(yàn)?zāi)P秃头N群競(jìng)爭(zhēng)模型Lotka Volterra
原文鏈接:http://tecdat.cn/?p=19737
原文出處:拓端數(shù)據(jù)部落公眾號(hào)
Stan是一種用于指定統(tǒng)計(jì)模型的概率編程語(yǔ)言。Stan通過(guò)馬爾可夫鏈蒙特卡羅方法(例如No-U-Turn采樣器,一種漢密爾頓蒙特卡洛采樣的自適應(yīng)形式)為連續(xù)變量模型提供了完整的貝葉斯推斷。
可以通過(guò)R使用rstan
?包來(lái)調(diào)用Stan,也可以?通過(guò)Python使用?pystan
?包。這兩個(gè)接口都支持基于采樣和基于優(yōu)化的推斷,并帶有診斷和后驗(yàn)分析。
在本文中,簡(jiǎn)要展示了Stan的主要特性。還顯示了兩個(gè)示例:第一個(gè)示例與簡(jiǎn)單的伯努利模型相關(guān),第二個(gè)示例與基于常微分方程的Lotka-Volterra模型有關(guān)。
什么是Stan?
Stan是命令式概率編程語(yǔ)言。
Stan程序定義了概率模型。
它聲明數(shù)據(jù)和(受約束的)參數(shù)變量。
它定義了對(duì)數(shù)后驗(yàn)。
Stan推理:使模型擬合數(shù)據(jù)并做出預(yù)測(cè)。
它可以使用馬爾可夫鏈蒙特卡羅(MCMC)進(jìn)行完整的貝葉斯推斷。
使用變分貝葉斯(VB)進(jìn)行近似貝葉斯推斷。
最大似然估計(jì)(MLE)用于懲罰最大似然估計(jì)。
Stan計(jì)算什么?
得出后驗(yàn)分布?。
MCMC采樣。
繪制
,其中每個(gè)繪制
都按后驗(yàn)概率
的邊緣分布。
使用直方圖,核密度估計(jì)等進(jìn)行繪圖
安裝?rstan
要在R中運(yùn)行Stan,必須安裝?rstan
?C ++編譯器。在Windows上,?Rtools?是必需的。
最后,安裝?rstan
:
install.packages(rstan)
Stan中的基本語(yǔ)法
定義模型
Stan模型由六個(gè)程序塊定義?:
數(shù)據(jù)(必填)。
轉(zhuǎn)換后的數(shù)據(jù)。
參數(shù)(必填)。
轉(zhuǎn)換后的參數(shù)。
模型(必填)。
生成的數(shù)量。
數(shù)據(jù)塊讀出的外部信息。
data {
int N;
int x[N];
int offset;
}
變換后的數(shù)據(jù)?塊允許數(shù)據(jù)的預(yù)處理。
transformed data {
int y[N];
for (n in 1:N)
y[n] = x[n] - offset;
}
?參數(shù)?塊定義了采樣的空間。
parameters {
real<lower=0> lambda1;
real<lower=0> lambda2;
}
變換參數(shù)?塊定義計(jì)算后驗(yàn)之前的參數(shù)處理。
transformed parameters {
real<lower=0> lambda;
lambda = lambda1 + lambda2;
}
在?模型?塊中,我們定義后驗(yàn)分布。
model {
y ~ poisson(lambda);
lambda1 ~ cauchy(0, 2.5);
lambda2 ~ cauchy(0, 2.5);
}
最后,?生成的數(shù)量?塊允許進(jìn)行后處理。
generated quantities {
int x_predict;
x_predict = poisson_rng(lambda) + offset;
}
類(lèi)型
Stan有兩種原始數(shù)據(jù)類(lèi)型,?并且兩者都是有界的。
int?是整數(shù)類(lèi)型。
real?是浮點(diǎn)類(lèi)型。
int<lower=1> N;
real<upper=5> alpha;
real<lower=-1,upper=1> beta;
real gamma;
real<upper=gamma> zeta;
實(shí)數(shù)擴(kuò)展到線性代數(shù)類(lèi)型。
vector[10] a; ? ? // 列向量
matrix[10, 1] b;
row_vector[10] c; // 行向量
matrix[1, 10] d;
整數(shù),實(shí)數(shù),向量和矩陣的數(shù)組均可用。
real a[10];
vector[10] b;
matrix[10, 10] c;
Stan還實(shí)現(xiàn)了各種?約束?類(lèi)型。
simplex[5] theta; ? ? ? ?// sum(theta) = 1
ordered[5] o; ? ? ? ? ? ?// o[1] < ... < o[5]
positive_ordered[5] p;
corr_matrix[5] C; ? ? ? ?// 對(duì)稱(chēng)和
cov_matrix[5] Sigma; ? ? // 正定的
關(guān)于Stan的更多信息
所有典型的判斷和循環(huán)語(yǔ)句也都可用。
if/then/else
for (i in 1:I)
while (i < I)
有兩種修改?后驗(yàn)的方法。
y ~ normal(0, 1);
target += normal_lpdf(y | 0, 1);
# 新版本的Stan中已棄用:
increment_log_posterior(log_normal(y, 0, 1))
而且許多采樣語(yǔ)句都是?矢量化的。
parameters {
real mu[N];
real<lower=0> sigma[N];
}
model {
// for (n in 1:N)
// y[n] ~ normal(mu[n], sigma[n]);
y ~ normal(mu, sigma); ?// 向量化版本
}
貝葉斯方法
概率是?認(rèn)知的。例如,?約翰·斯圖亞特·米爾?(John Stuart Mill)說(shuō):
事件的概率不是事件本身,而是我們或其他人期望發(fā)生的情況的程度。每個(gè)事件本身都是確定的,不是可能的;如果我們?nèi)苛私?,我們?yīng)該或者肯定地知道它會(huì)發(fā)生,或者它不會(huì)。
對(duì)我們來(lái)說(shuō),概率表示對(duì)它發(fā)生的期望程度。
概率可以量化不確定性。
Stan的貝葉斯示例:重復(fù)試驗(yàn)?zāi)P?/h1>
我們解決一個(gè)小例子,其中的目標(biāo)是給定從伯努利分布中抽取的隨機(jī)樣本,以估計(jì)缺失參數(shù)的后驗(yàn)分布?
?(成功的機(jī)會(huì))。
步驟1:?jiǎn)栴}定義
在此示例中,我們將考慮以下結(jié)構(gòu):
數(shù)據(jù):
,試用次數(shù)。
,即試驗(yàn)n的結(jié)果??(已知的建模數(shù)據(jù))。
參數(shù):
先驗(yàn)分布
概率
后驗(yàn)分布
步驟2:Stan
我們創(chuàng)建Stan程序,我們將從R中調(diào)用它。
data {
int<lower=0> N; ? ? ? ? ? ? ? // 試驗(yàn)次數(shù)
int<lower=0, upper=1> y[N]; ? // 試驗(yàn)成功
}
model {
theta ~ uniform(0, 1); ? ? ? ?// 先驗(yàn)
y ~ bernoulli(theta); ? ? ? ? // 似然
}
步驟3:數(shù)據(jù)
在這種情況下,我們將使用示例隨機(jī)模擬一個(gè)隨機(jī)樣本,而不是使用給定的數(shù)據(jù)集。
# 生成數(shù)據(jù)
y = rbinom(N, 1, 0.3)
y
## ?[1] 0 0 0 1 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1
?根據(jù)數(shù)據(jù)計(jì)算?MLE作為樣本均值:
## [1] 0.25
步驟4:rstan
使用貝葉斯后驗(yàn)估計(jì)?
最后一步是使用R中的Stan獲得我們的估算值。
##
## SAMPLING FOR MODEL '6dcfbccbf2f063595ccc9b93f383e221' NOW (CHAIN 1).
## Chain 1:
## Chain 1: Gradient evaluation took 7e-06 seconds
## Chain 1: 1000 transitions using 10 leapfrog steps per transition would take 0.07 seconds.
## Chain 1: Adjust your expectations accordingly!
## Chain 1:
## Chain 1:
## Chain 1: Iteration: ? ?1 / 5000 [ ?0%] ?(Warmup)
## Chain 1: Iteration: ?500 / 5000 [ 10%] ?(Warmup)
## Chain 1: Iteration: 1000 / 5000 [ 20%] ?(Warmup)
## Chain 1: Iteration: 1500 / 5000 [ 30%] ?(Warmup)
## Chain 1: Iteration: 2000 / 5000 [ 40%] ?(Warmup)
## Chain 1: Iteration: 2500 / 5000 [ 50%] ?(Warmup)
## Chain 1: Iteration: 2501 / 5000 [ 50%] ?(Sampling)
## Chain 1: Iteration: 3000 / 5000 [ 60%] ?(Sampling)
## Chain 1: Iteration: 3500 / 5000 [ 70%] ?(Sampling)
## Chain 1: Iteration: 4000 / 5000 [ 80%] ?(Sampling)
## Chain 1: Iteration: 4500 / 5000 [ 90%] ?(Sampling)
## Chain 1: Iteration: 5000 / 5000 [100%] ?(Sampling)
## Chain 1:
## Chain 1: ?Elapsed Time: 0.012914 seconds (Warm-up)
## Chain 1: ? ? ? ? ? ? ? ?0.013376 seconds (Sampling)
## Chain 1: ? ? ? ? ? ? ? ?0.02629 seconds (Total)
## Chain 1:
...
## SAMPLING FOR MODEL '6dcfbccbf2f063595ccc9b93f383e221' NOW (CHAIN 4).
## Chain 4:
## Chain 4: Gradient evaluation took 3e-06 seconds
## Chain 4: 1000 transitions using 10 leapfrog steps per transition would take 0.03 seconds.
## Chain 4: Adjust your expectations accordingly!
## Chain 4:
## Chain 4:
## Chain 4: Iteration: ? ?1 / 5000 [ ?0%] ?(Warmup)
## Chain 4: Iteration: ?500 / 5000 [ 10%] ?(Warmup)
## Chain 4: Iteration: 1000 / 5000 [ 20%] ?(Warmup)
## Chain 4: Iteration: 1500 / 5000 [ 30%] ?(Warmup)
## Chain 4: Iteration: 2000 / 5000 [ 40%] ?(Warmup)
## Chain 4: Iteration: 2500 / 5000 [ 50%] ?(Warmup)
## Chain 4: Iteration: 2501 / 5000 [ 50%] ?(Sampling)
## Chain 4: Iteration: 3000 / 5000 [ 60%] ?(Sampling)
## Chain 4: Iteration: 3500 / 5000 [ 70%] ?(Sampling)
## Chain 4: Iteration: 4000 / 5000 [ 80%] ?(Sampling)
## Chain 4: Iteration: 4500 / 5000 [ 90%] ?(Sampling)
## Chain 4: Iteration: 5000 / 5000 [100%] ?(Sampling)
## Chain 4:
## Chain 4: ?Elapsed Time: 0.012823 seconds (Warm-up)
## Chain 4: ? ? ? ? ? ? ? ?0.014169 seconds (Sampling)
## Chain 4: ? ? ? ? ? ? ? ?0.026992 seconds (Total)
## Chain 4:
## Inference for Stan model: 6dcfbccbf2f063595ccc9b93f383e221.
## 4 chains, each with iter=5000; warmup=2500; thin=1;
## post-warmup draws per chain=2500, total post-warmup draws=10000.
##
## ? ? ? ? mean se_mean ? sd ? ?10% ? ?90% n_eff Rhat
## theta ? 0.27 ? ?0.00 0.09 ? 0.16 ? 0.39 ?3821 ? ?1
## lp__ ?-13.40 ? ?0.01 0.73 -14.25 -12.90 ?3998 ? ?1
##
# 提取后驗(yàn)抽樣
# 計(jì)算后均值(估計(jì))
mean(theta_draws)
## [1] 0.2715866
# 計(jì)算后驗(yàn)區(qū)間
## ? ? ? 10% ? ? ? 90%
## 0.1569165 0.3934832
ggplot(theta_draws_df, aes(x=theta)) +
geom_histogram(bins=20, color="gray")
RStan:MAP,MLE
Stan的估算優(yōu)化;兩種觀點(diǎn):
最大后驗(yàn)估計(jì)(MAP)。
最大似然估計(jì)(MLE)。
optimizing(model, data=c("N", "y"))
## $par
## theta
## ? 0.4
##
## $value
## [1] -3.4
##
## $return_code
## [1] 0
種群競(jìng)爭(zhēng)模型 ---Lotka-Volterra模型
洛特卡(Lotka,1925)和沃爾泰拉(Volterra,1926)制定了參數(shù)化微分方程,描述了食肉動(dòng)物和獵物的競(jìng)爭(zhēng)種群。
完整的貝葉斯推斷可用于估計(jì)未來(lái)(或過(guò)去)的種群數(shù)量。
Stan用于對(duì)統(tǒng)計(jì)模型進(jìn)行編碼并執(zhí)行完整的貝葉斯推理,以解決從噪聲數(shù)據(jù)中推斷參數(shù)的逆問(wèn)題。
在此示例中,我們希望根據(jù)公司每年收集的毛皮數(shù)量,將模型擬合到1900年至1920年之間各自種群的加拿大貓科食肉動(dòng)物和野兔獵物。
數(shù)學(xué)模型
我們表示U(t)和V(t)作為獵物和捕食者種群數(shù)量?分別。與它們相關(guān)的微分方程為:
這里:
α:獵物增長(zhǎng)速度。
β:捕食引起的獵物減少速度。
γ:自然的捕食者減少速度。
δ:捕食者從捕食中增長(zhǎng)速度。
stan中的Lotka-Volterra
real[] dz_dt(data real t, ? ? ? // 時(shí)間
real[] z, ? ? ? ? ? ? ? ? ? ? // 系統(tǒng)狀態(tài)
real[] theta, ? ? ? ? ? ? ? ? // 參數(shù)
data real[] x_r, ? ? ? ? ? ? ?// 數(shù)值數(shù)據(jù)
data int[] x_i) ? ? ? ? ? ? ? // 整數(shù)數(shù)據(jù)
{
real u = z[1]; ? ? ? ? ? ? ? ?// 提取狀態(tài)
real v = z[2];
觀察到已知變量:
:表示在時(shí)間?
的
物種數(shù)量
必須推斷未知變量):
初始狀態(tài):?
:k的初始物種數(shù)量。
后續(xù)狀態(tài)
:在時(shí)間t的物種數(shù)量k。
參量?
。
假設(shè)誤差是成比例的(而不是相加的):
等效:
與
建立模型
已知常數(shù)和觀測(cè)數(shù)據(jù)的變量。
data {
int<lower = 0> N; ? ? ? // 數(shù)量測(cè)量
real ts[N]; ? ? ? ? ? ? // 測(cè)量次數(shù)>0
real y0[2]; ? ? ? ? ? ? // 初始數(shù)量
real<lower=0> y[N,2]; ? // 后續(xù)數(shù)量
}
未知參數(shù)的變量。
parameters {
real<lower=0> theta[4]; ? ?// alpha, beta, gamma, delta
real<lower=0> z0[2]; ? ? ? // 原始種群
real<lower=0> sigma[2]; ? ?// 預(yù)測(cè)誤差
}
先驗(yàn)分布和概率。
model {
// 先驗(yàn)
sigma ~ lognormal(0, 0.5);
theta[{1, 3}] ~ normal(1, 0.5);
// 似然(對(duì)數(shù)正態(tài))
for (k in 1:2) {
y0[k] ~ lognormal(log(z0[k]), sigma[k]);
我們必須為預(yù)測(cè)的總體定義變量?:
初始種群(
z0
)。初始時(shí)間(
0.0
),時(shí)間(ts
)。參數(shù)(
theta
)。最大迭代次數(shù)(
1e3
)。
Lotka-Volterra參數(shù)估計(jì)
print(fit, c("theta", "sigma"), probs=c(0.1, 0.5, 0.9))
獲得結(jié)果:
mean ?se_mean ? sd ?10% ?50% ?90% ?n_eff ?Rhat
## theta[1] ? ?0.55 ? ?0 ? ? 0.07 0.46 0.54 0.64 ? 1168 ? ? 1
## theta[2] ? ?0.03 ? ?0 ? ? 0.00 0.02 0.03 0.03 ? 1305 ? ? 1
## theta[3] ? ?0.80 ? ?0 ? ? 0.10 0.68 0.80 0.94 ? 1117 ? ? 1
## theta[4] ? ?0.02 ? ?0 ? ? 0.00 0.02 0.02 0.03 ? 1230 ? ? 1
## sigma[1] ? ?0.29 ? ?0 ? ? 0.05 0.23 0.28 0.36 ? 2673 ? ? 1
## sigma[2] ? ?0.29 ? ?0 ? ? 0.06 0.23 0.29 0.37 ? 2821 ? ? 1
分析所得結(jié)果:
Rhat接近1表示收斂;n_eff是有效樣本大小。
10%,后驗(yàn)分位數(shù);例如
。
后驗(yàn)均值是貝葉斯點(diǎn)估計(jì):α=0.55。
后驗(yàn)平均估計(jì)的標(biāo)準(zhǔn)誤為0。
α的后驗(yàn)標(biāo)準(zhǔn)偏差為0.07。
最受歡迎的見(jiàn)解
1.matlab使用貝葉斯優(yōu)化的深度學(xué)習(xí)
2.matlab貝葉斯隱馬爾可夫hmm模型實(shí)現(xiàn)
3.R語(yǔ)言Gibbs抽樣的貝葉斯簡(jiǎn)單線性回歸仿真
4.R語(yǔ)言中的block Gibbs吉布斯采樣貝葉斯多元線性回歸
5.R語(yǔ)言中的Stan概率編程MCMC采樣的貝葉斯模型
6.Python用PyMC3實(shí)現(xiàn)貝葉斯線性回歸模型
7.R語(yǔ)言使用貝葉斯 層次模型進(jìn)行空間數(shù)據(jù)分析
8.R語(yǔ)言隨機(jī)搜索變量選擇SSVS估計(jì)貝葉斯向量自回歸(BVAR)模型
9.matlab貝葉斯隱馬爾可夫hmm模型實(shí)現(xiàn)