2017-04-26 37 views
2

我正在对某些数据拟合分层模型,拟合似乎可以接受。如何拟合pymc3中呈现歪斜的数据

with pm.Model() as model: 
    mu_a = pm.Normal('mu_a', 0, sd=.2) 
    sigma_b = pm.HalfNormal('sig_a', 0.1) 

    mean = pm.Normal('mean', mu_a, sigma_b, shape=n) 
    std = pm.HalfNormal('std', 0.01 , shape=n) 

    means = mean[h] 
    stds = std[h] 

    y = pm.Laplace('y', mu=means, b=stds, observed=data) 
    hierarchical_trace = pm.sample(2000, n_init=30000) 

当检查后预测尾部似乎是合理的,min,并且数据的最大值(黑线)都似乎是最小/最大生成的样本的内部(这是不与StudentT的情况下)。

ppc_trace = pm.sample_ppc(model=model, trace=hierarchical_trace) 

ppc with min/max/mean of original data

然而平均(最右边的图)是的路要走,我想这是因为我的数据是负偏的,所以数据的质量移动平均太远的权利。

sp.stats.skew(data) 

-0.1699020117521286

什么是Pymc3到这类数据进行建模推荐的方法。虽然它是一个对称分布,但拉普拉斯似乎非常适合我的数据。高斯不会在尾部提供足够的重量(这会排除偏斜正常?)。我如何模拟这种适度偏斜的数据?

我的目标是获得一个准确的地图估计与我的数据的不同部分可信区间(基于分级规范)

回答

1

橡胶躲开了这一个...但回答的人一起后

绊脚石

我发现一个asymmetric laplace工作得很好,以解决缺乏适合。

def asym_laplace_log_p(x, m, lam, k): 
    diff = x - m 
    s = tt.sgn(diff) 
    return tt.log(lam/(k + 1 /k)) + (- diff * lam * s * tt.pow(k, s)) 

def asym_laplace_cdf(x, m, lam, k): 
    diff = x - m 
    k_2 = k ** 2 
    if x <= m: 
     return (k_2/(1 + k_2)) * np.exp((lam/k) * diff) 
    return 1 - ((1/(1 + k_2)) * np.exp(-1 * lam * k * diff)) 

def inverse_cdf(u, m, lam, k): 
    s = np.sign(u) 
    k_s = np.power(k, s) 
    return m - (1/ (lam * s * k_s)) * np.log(u * s * k_s) 

def asym_laplace_mean(m, lam, k): 
    return m + ((1 - k** 2)/(lam * k)) 

然后模型内部

y = pm.DensityDist('y', lambda x: asym_laplace_dist(x, means, stds, k), testval=0, observed=data) 

CDF,逆CDF和意味着仅仅用于调试目的,值得注意的此实现使用lambda对于形状,而不是1 /λ,所以我发现了一个半柯西因为先前的形状比原始问题中的半正常工作更好。

很高兴听到有关此实施的反馈意见。

在撰写本文时,密度dist不适用于sample_ppc(“AttributeError:'DensityDist'对象没有属性'random'”),所以我最终可能会使用生成的位置通过上述生成我自己的样本,形状和偏斜值。

我不认为这完全是犹太教,所以会很高兴这个方向(或解决这个问题的方向和直接使用sample_ppc)。