<jupyter_start><jupyter_text>Giới thiệu phân phối SinhArcsinhBS Vương Kiến ThanhPhân phối SinhArcsinh được giới thiệu bởi <NAME> và <NAME> vào năm 2009 như một dạng tổng quát hoá của phân phối normal. Trong khi phân phối normal là đối xứng, có hai đuôi từ nhỏ đến vừa và có thể được định nghĩa bằng chỉ hai tham số ($\mu$-`loc` và $\sigma$-`scale`), phân phối SinhArcsinh cần thêm hai tham số để kiểm soát độ lệch ($\nu$-`skewness`) và trọng lượng của đuôi ($\tau$-`tailweight`).Các bạn có thể nhìn thấy ảnh hưởng của các tham số `nu` ($\nu$) và `tau`($\tau$) ở các hình sau:![](https://statisticaloddsandends.files.wordpress.com/2019/04/fig2.png)![](https://statisticaloddsandends.files.wordpress.com/2019/04/fig1.png)![](https://statisticaloddsandends.files.wordpress.com/2019/04/fig3.png)`tensorflow` đã chuyển nó thành một dạng transformation để sử dụng được với tất cả các phân phối khác. Gần đây, `numpyro` đã cho phép sử dụng các phân phối có trong `tensorflow` để suy luận Bayes.Hôm nay tôi sẽ dùng phân phối này để suy luận tham số của một biến X. Biến X có phân phối lệch (T) và có một đuôi rất nhỏ.<jupyter_code>import numpy as np
import pandas as pd
import seaborn as sns
import arviz as az
import numpyro
import numpyro.distributions as dist
import numpyro.contrib.tfp.distributions as tfd
from numpyro.infer import MCMC, NUTS, Predictive
from jax import random
import jax.numpy as jnp
import matplotlib.pyplot as plt
az.style.use('fivethirtyeight')<jupyter_output><empty_output><jupyter_text>Mô phỏng biến X<jupyter_code>x = np.concatenate([
    np.random.uniform(0,1, 100),
    np.random.normal(1.1,0.1,50),
    np.random.normal(0.9,0.1,500)
])
sns.kdeplot(x, bw_adjust=0.5)
plt.title('Phân phối của biến X');<jupyter_output><empty_output><jupyter_text>Suy luậnTa đặt prior cho 4 tham số, vì giá trị của mình khoảng nhỏ nên prior của `loc` cũng đặt gần giá trị 1.<jupyter_code>def model(x=None):
    loc = numpyro.sample('loc', dist.Normal(1,1))
    scale = numpyro.sample('scale', dist.Exponential(1))
    skewness = numpyro.sample('skewness', dist.Normal(0,1))
    tailweight = numpyro.sample('tailweight', dist.Exponential(1))
    numpyro.sample('x',
                   tfd.SinhArcsinh(loc, scale, skewness, tailweight,
                                   distribution=tfd.Normal(0,1)),
                   obs=x
                  )
mcmc = MCMC(NUTS(model), 500,1000, 4,chain_method="sequential")
mcmc.run(random.PRNGKey(1), x=x)
mcmc.print_summary()<jupyter_output>sample: 100%|██████████| 1500/1500 [00:12<00:00, 124.02it/s, 7 steps of size 4.34e-01. acc. prob=0.93] 
sample: 100%|██████████| 1500/1500 [00:03<00:00, 488.98it/s, 11 steps of size 4.09e-01. acc. prob=0.95]
sample: 100%|██████████| 1500/1500 [00:02<00:00, 519.69it/s, 15 steps of size 4.72e-01. acc. prob=0.93]
sample: 100%|██████████| 1500/1500 [00:03<00:00, 492.91it/s, 7 steps of size 4.26e-01. acc. prob=0.93]<jupyter_text>Kiểm tra converge của các chuỗi MCMC.<jupyter_code>az.plot_trace(mcmc);<jupyter_output><empty_output><jupyter_text>Kiểm tra fit của model<jupyter_code>post = mcmc.get_samples()
x_seq = np.linspace(0,1.5,100)
plt.plot(x_seq,
         np.exp(tfd.SinhArcsinh(
             post['loc'].mean(),
             post['scale'].mean(),
             post['skewness'].mean(),
             post['tailweight'].mean()
         ).log_prob(x_seq)))
plt.hist(x, density=True, bins=50, alpha=0.5);<jupyter_output><empty_output><jupyter_text>Tổng kết:Phân phối SinhArcsinh là một phân phối rất flexible. R package `gamlss` đã ứng dụng nó làm phân phối chính, kết hợp thêm các kỹ thuật trong GAM để suy luận.  Trong bối cảnh Generalized Linear Model, phân phối này là một phân phối hữu ích, bên cạnh Gamma Regression, Beta Regression. Để thành "SinhArcsinh regression", các bạn chỉ cần thêm linear model vào tham số `loc` như các GLM khác.Chúc các bạn thành công.<jupyter_code>dist.transforms.AbsTransform
a = dist.TransformedDistribution(
    tfd.SinhArcsinh(0,1,0,1),
    dist.transforms.AbsTransform())
a.log_prob(1)<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.13301956898687145, 'fraction_numerical': 0.052761951944513254, 'mean_word_length': 4.190231362467866, 'pattern_counts': {'":': 0, '<': 30, '<?xml version=': 0, '>': 26, 'https://': 3, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 1, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '6', 'dir': 'jupyter-structured-clean-dedup', 'id': '511203', 'license': 'MIT', 'n_tokens_mistral': 2006, 'n_tokens_neox': 1829, 'n_words': 424, 'path': 'notebooks/sinharchsinh.ipynb', 'repo_name': 'vuongkienthanh/learn-bayes', 'size': '4049'}