我在这里发布了一个IPython笔记本http://nbviewer.ipython.org/gist/dartdog/9008026
我通过标准Statsmodels OLS和PYMC3与Pandas提供的数据一起工作,顺便说一下,这部分工作得很好.
我看不出如何从PYMC3中获得更多标准参数?这些示例似乎只是使用OLS来绘制基本回归线.看来PYMC3模型数据应该能够给出回归线的参数吗?除了可能的痕迹,即什么是最高概率线?
对Alpha,beta和sigma的解释的任何进一步解释都欢迎!
另外,如何使用PYMC3模型来估计给定新x即具有某种概率的预测的y的未来值?
最后,PYMC3有一个新的GLM包装,我尝试了它似乎搞砸了?(虽然可能是我)
我注意到在 pymc3 中使用均匀分布时,_interval除非指定了转换,否则采样器也会扫描参数,例如:
with fitModel6:
    normMu  = pm.Uniform('normMu',lower=0,upper=1000)
不仅会导致对 normMu 进行采样,还会导致对 normMu_interval 进行采样:
通常,当我使用统一先验作为尺度参数(如归一化)时,我当然会在对数间隔内进行采样。pymc3 是否以某种方式为我处理这个问题?
干杯
我正在尝试非常简单地将 PyMC3 traceplot 函数(请参阅此处)生成的子图绘制到文件中。
该函数生成子图的 numpy.ndarray (2d)。
我需要将这些子图移动或复制到 matplotlib.figure 中才能保存图像文件。我能找到的所有内容都展示了如何首先生成图形的子图,然后构建它们。
作为一个最小的示例,我从Here提取了示例 PyMC3 代码,并在其中添加了几行以尝试处理子图。
from pymc3 import *
import theano.tensor as tt
from theano import as_op
from numpy import arange, array, empty
### Added these three lines relative to source #######################
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
__all__ = ['disasters_data', 'switchpoint', 'early_mean', 'late_mean', 'rate', 'disasters']
# Time series of recorded coal mining disasters in the UK from 1851 to 1962
disasters_data = array([4, 5, 4, …我有一个在pymc3中描述的模型,使用以下内容:
from pymc3 import * 
basic_model = Model()
with basic_model:
    # Priors for unknown model parameters
    alpha = Normal('alpha', mu=0, sd=10)
    beta = Normal('beta', mu=0, sd=10, shape=18)
    sigma = HalfNormal('sigma', sd=1)
    # Expected value of outcome
    mu = alpha + beta[0]*X1 + beta[1]*X2 + beta[2]*X3
    # Likelihood (sampling distribution) of observations
    Y_obs = Normal('Y_obs', mu=mu, sd=sigma, observed=Y)
但是,我的Ys不是正常分布的,而是二进制的(所以,伯努利,我认为).我无法弄清楚如何改变NormalY的分布,Bernoulli因为我无法弄清楚Y_obs在这种情况下params会是什么.
我正在尝试使用 PyMC3 来实现具有分类变量及其交互作用的分层模型。在 R 中,公式将采用以下形式:
y ~ x1 + x2 + x1:x2
然而,在教程https://pymc-devs.github.io/pymc3/GLM-hierarchical/#partial-pooling-hierarchical-regression-aka-the-best-of-both-worlds他们明确说 glm 没有还没有很好地使用分层建模。
那么我将如何添加 x1:x2 项呢?它会是一个具有两个分类父级(x1 和 x2)的分类变量吗?
我对计算贝叶斯因子以比较 PyMC 3 中的两个模型感兴趣。根据此网站,在 PyMC 2 中,该过程似乎相对简单:包括伯努利随机变量和自定义似然函数,该函数返回第一个模型的似然性当伯努利变量的值为 0 时,第二个模型的似然性为 1。然而,在 PyMC 3 中,事情变得更加复杂,因为随机节点需要是 Theano 变量。
我的两个似然函数是二项式,所以我想我需要重写这个类:
class Binomial(Discrete):
    R"""
    Binomial log-likelihood.
    The discrete probability distribution of the number of successes
    in a sequence of n independent yes/no experiments, each of which
    yields success with probability p.
    .. math:: f(x \mid n, p) = \binom{n}{x} p^x (1-p)^{n-x}
    ========  ==========================================
    Support   :math:`x \in \{0, 1, \ldots, n\}`
    Mean      :math:`n p`
    Variance  :math:`n p (1 - p)`
    ========  ==========================================
    Parameters
    ---------- …我看到了如何用pymc3进行变点分析的例子,但似乎我错过了一些东西,因为我得到的结果远非真正的值.这是一个玩具的例子.
数据:
脚本:
from pymc3 import *
from numpy.random import uniform, normal
bp_u = 30 #switch point
c_u = [1, -1] #intercepts before and after switch point
beta_u = [0, -0.02]  #slopes before & after switch point
x = uniform(0,90, 200)
y = (x < bp_u)*(c_u[0]+beta_u[0]*x) + (x >= bp_u)*(c_u[1]+beta_u[1]*x) + normal(0,0.1,200)
with Model() as sw_model:
    sigma = HalfCauchy('sigma', beta=10, testval=1.)
    switchpoint = Uniform('switchpoint', lower=x.min(), upper=x.max(), testval=45)
    # Priors for pre- and post-switch intercepts and slopes
    intercept_u1 = Uniform('Intercept_u1', lower=-10, …是否有一个函数可以告诉pandas DataFrame中匹配的百分比或数量而不执行此类操作...
len(trace_df[trace_df['ratio'] > 0]) / len(trace_df)
0.189
len(trace_df[trace_df['ratio'] <= 0]) / len(trace_df)
0.811
必须有更多的Pythonic或至少优雅的方式来做到这一点.
我有一个看起来像下面的数据集(显示前5行).CPA是来自不同广告航班的实验(处理)的观察结果.航班在广告系列中按层次分组.
  campaign_uid  flight_uid treatment         CPA
0   0C2o4hHDSN  0FBU5oULvg   control  -50.757370
1   0C2o4hHDSN  0FhOqhtsl9   control   10.963426
2   0C2o4hHDSN  0FwPGelRRX   exposed  -72.868952
3   0C5F8ZNKxc  0F0bYuxlmR   control   13.356081
4   0C5F8ZNKxc  0F2ESwZY22   control  141.030900
5   0C5F8ZNKxc  0F5rfAOVuO   exposed   11.200450
我适合如下的模型:
model.fit('CPA ~ treatment',  random=['1|campaign_uid'])
据我所知,这个模型简单地说:
所以一个只想得到一个 后为每个这样的变量.
但是,看看下面的结果,我还得到了以下变量的后验:1|campaign_uid_offset.它代表什么?
拟合模型和图的代码:
model   = Model(df)
results = model.fit('{} ~ treatment'.format(metric),  
                    random=['1|campaign_uid'], 
                    samples=1000)
# Plotting the result
pm.traceplot(model.backend.trace)
python-3.x pymc3 bambi multilevel-analysis hierarchical-bayesian
如果我们考虑PyMC3的以下线性回归示例:
http://docs.pymc.io/notebooks/getting_started.html#A-Motivating-Example:-Linear-Regression
我们如何包含诸如a + b1 + b2 = 1 or a^2 + b1^2 = 25?之类的约束?
我知道我们可以使用Bound为变量创建边界,但我不知道如何添加更复杂的约束.
谢谢您的帮助!
pymc3 ×10
python ×6
bayesian ×3
pandas ×2
pymc ×2
bambi ×1
matplotlib ×1
python-3.x ×1
regression ×1
statsmodels ×1
theano ×1