0

背景

社区中有很多关于如何标准化自变量(减去平均值然后除以标准差)有利于提高 MCMC 采样效率的讨论,而不是数学要求(John K. Kruschke,https: //stats.stackexchange.com/q/273209 . Andrew Gelman 等人 (2008, p. 4-5) 和 Osvaldo Martin (2018, p. 96) 提到的其他主要好处是自变量允许我们使用相同的弱信息先验/超先验,随后意味着所有系数都可以用 z 分数来解释。

因此,我们有两个选择:i)标准化自变量,在这种情况下先验的规模可以保持不变,或者 ii)不标准化自变量,在这种情况下,需要手动设置先验的规模. 这是我的问题所指的第二个选项。

业务问题

我正在为购物类别(即男士沐浴露)构建一个层次模型。因变量是数量,其中每个观察值都是每周的 SKU(库存单位)水平。层次结构使得产品线中的每个 SKU 与该产品线中的所有其他 SKU 共享相同的系数。产品线是同一品牌内的一组 SKU,它们是几乎相同的产品,只有不同的气味/颜色等。我们还将因变量除以 SKU 级别的平均值,以便模型可以估计当您在同一产品线中有一些小批量 SKU 和一些大批量 SKU 时,这些系数是有意义的。

在下面的简单示例中,有 3 个变量和截距。变量的比例如下: rrp - 推荐零售价。大多数 SKU 是 $20-$60 discount_amount - 此变量经过 atan 转换以形成“S”形;比例为 0-1 mu_comp_launch_steal - 此变量的值是竞争对手产品发布蚕食的数量(数量);比例从 0 到 ~5000 不等,具体取决于产品

Question: how do I scale the hyperpriors when choosing not to standardize the independent variables?

使用 pm.Model() 作为分层模型:

            # hyperpriors
            hypers  = {'mu_intercept' : pm.Normal('mu_intercept', mu=0, sd={?})
                           , 'mu_rrp' : pm.Normal('mu_rrp', mu=0, sd={?})
                           , 'mu_discount_amount' : pm.Normal('mu_discount_amount', mu=0, sd={?})
                           , 'mu_comp_launch_steal' : pm.Normal('mu_comp_launch_steal', mu=0, sd={?})

                           , 'sigma_intercept' : pm.HalfCauchy('sigma_intercept', beta={?})
                           , 'sigma_rrp' : pm.HalfCauchy('sigma_rrp', beta={?})
                           , 'sigma_discount_amount' : pm.HalfCauchy('sigma_discount_amount', beta={?})
                           , 'sigma_comp_launch_steal' : pm.HalfCauchy('sigma_comp_launch_steal', beta={?})
                             }

            # coefficient priors
            coef_priors = {'intercept' : pm.Normal('intercept'
                                                  , mu=hypers['mu_intercept']
                                                  , sigma=hypers['sigma_intercept']
                                                  , shape=n_skus)
                          ,'rrp' : pm.Bound(pm.Normal, upper=0.0)('rrp'
                                          , mu=hypers['mu_rrp']
                                          , sigma=hypers['sigma_rrp']
                                          , shape=n_product_lines)
                          ,'discount_amount' : pm.Bound(pm.Normal, lower=0.0)('discount_amount'
                                          , mu=hypers['mu_discount_amount']
                                          , sigma=hypers['sigma_discount_amount']
                                          , shape=n_product_lines)
                          ,'comp_launch_steal' : pm.Bound(pm.Normal, upper=0.0)('comp_launch_steal'
                                          , mu=hypers['mu_comp_launch_steal']
                                          , sigma=hypers['sigma_comp_launch_steal']
                                          , shape=n_product_lines)}

            # errors
            eps = pm.HalfCauchy('eps', beta=5)

            # expected value. (feat_values is a dictionary of Theano shared variables)
            y_hat = coef_priors['intercept'][feat_values['sku_idx']] + \
                           (coef_priors['rrp'][feat_values['product_line_idx']]) * (feat_values['rrp'])  + \
                           (coef_priors['discount_amount'][feat_values['product_line_idx']]) * (feat_values['discount_amount'])  + \
                            (coef_priors['comp_launch_steal'][feat_values['product_line_idx']]) * (feat_values['comp_launch_steal'])


            # likelihood
            y_like = pm.Normal('y_like', mu=y_hat, sd=eps, observed=QTY) # qty is a 1-D array

参考

[1] John K. Kruschke ( https://stats.stackexchange.com/users/16592/john-k-kruschke),MCMC贝叶斯方法 - 居中和标准化,URL(版本:2017-04-11):https: //stats.stackexchange.com/q/273209

[2] Andrew Gelman、Aleks Jakulin、Maria Grazia Pittau、Yu-Sung Su。“逻辑和其他回归模型的信息量较弱的默认先验分布。” 应用统计年鉴,2(4) 1360-1383 2008 年 12 月。第 1363 页。

[3] 奥斯瓦尔多·马丁。使用 Python 进行贝叶斯分析:使用 PyMC3 和 ArviZ 进行统计建模和概率编程的介绍。第 2 版。2018. 第 96 页奥斯瓦尔多·马丁。“使用 Python 进行贝叶斯分析”。第 96 页。

4

0 回答 0