Python 在函数中包装pymc3模型

Python 在函数中包装pymc3模型,python,function,modeling,pymc,Python,Function,Modeling,Pymc,有人知道在标准Python 3函数中存储pymc3模型的方法吗 我希望将此函数存储在本地,以便在Jupyter环境中多次调用,其功能旨在在模型实例化后返回视觉效果。该函数接受控制和实验条件,并将其转换为numpy数组,然后再执行建模和MCMC: def贝叶斯检验(x,y): y1=x y2=y 数据=局部数据帧(dict(value=np.r_u1;[y1,y2],group=np.r_1;['y2']*len(y2), [y1']*len(y1)]) μm=数据值平均值() μ_s=data.

有人知道在标准Python 3函数中存储
pymc3
模型的方法吗

我希望将此函数存储在本地,以便在
Jupyter
环境中多次调用,其功能旨在在模型实例化后返回视觉效果。该函数接受控制和实验条件,并将其转换为
numpy
数组,然后再执行建模和
MCMC

def贝叶斯检验(x,y):
y1=x
y2=y
数据=局部数据帧(dict(value=np.r_u1;[y1,y2],group=np.r_1;['y2']*len(y2),
[y1']*len(y1)])
μm=数据值平均值()
μ_s=data.value.std()*2
σ_低=标准差_低
σ_高=sd_高
第1组标准=pm.Uniform('1组标准',下=σ低,上=σ高)
第2组标准=pm.Uniform(第2组标准,下=σ_低,上=σ_高)
ν=pm.指数('ν_减1',1/29。)+1
λ1=组1_标准**-2
λ2=组2_标准**-2
第1组=pm.StudentT('对照组1',nu=ν,mu=1组平均值,lam=λ1,观察值=y1)
组2=pm.StudentT('NBA',nu=ν,mu=group2_平均值,lam=λ2,观察值=y2)
平均数差异=pm.确定性(“平均数差异”,第2组平均数-第1组平均数)
性病差异=pm.确定性(“性病差异”,第2组性病-第1组性病)
影响大小=pm.Deterministic('影响大小',差异平均值/np.sqrt((第1组标准**2+
第2组(标准**2)/2)
跟踪=pm样品(1000)
返回轨迹
我得到的错误是:

TypeError: No model on context stack, which is needed to instantiate distributions. Add variable inside a 'with model:' block, or use the '.dist' syntax for a standalone distribution.
你能行

def贝叶斯检验(x,y):
y1=x
y2=y
数据=局部数据帧(dict(value=np.r_u1;[y1,y2],group=np.r_1;['y2']*len(y2),
[y1']*len(y1)])
μm=数据值平均值()
μ_s=data.value.std()*2
σ_低=标准差_低
σ_高=sd_高
使用pm.Model():
第1组标准=pm.Uniform('1组标准',下=σ低,上=σ高)
第2组标准=pm.Uniform(第2组标准,下=σ_低,上=σ_高)
ν=pm.指数('ν_减1',1/29。)+1
λ1=组1_标准**-2
λ2=组2_标准**-2
第1组=pm.StudentT('对照组1',nu=ν,mu=1组平均值,lam=λ1,观察值=y1)
组2=pm.StudentT('NBA',nu=ν,mu=group2_平均值,lam=λ2,观察值=y2)
平均数差异=pm.确定性(“平均数差异”,第2组平均数-第1组平均数)
性病差异=pm.确定性(“性病差异”,第2组性病-第1组性病)
影响大小=pm.Deterministic('影响大小',差异平均值/np.sqrt((第1组标准**2+
第2组(标准**2)/2)
跟踪=pm样品(1000)
返回轨迹
这将在每次调用函数并从中采样时创建一个模型。或者,要使功能扩展现有模型,请执行以下操作:

def bayesian_ab_test(x ,y, model):

   with model:

       y1 = x
       y2 = y

       data = pd.DataFrame(dict(value=np.r_[y1, y2], group=np.r_[['y2']*len(y2), 
       ['y1']*len(y1)]))
    
       μ_m = data.value.mean()
       μ_s = data.value.std() * 2
    
       σ_low = sd_low
       σ_high = sd_high
    
       group1_std = pm.Uniform('group1_std', lower=σ_low, upper=σ_high)
       group2_std = pm.Uniform('group2_std', lower=σ_low, upper=σ_high)
    
       ν = pm.Exponential('ν_minus_one', 1/29.) + 1
    
       λ1 = group1_std**-2
       λ2 = group2_std**-2

       group1 = pm.StudentT('Control_1', nu=ν, mu=group1_mean, lam=λ1, observed=y1)
       group2 = pm.StudentT('NBA', nu=ν, mu=group2_mean, lam=λ2, observed=y2)
    
       diff_of_means = pm.Deterministic('difference of means', group2_mean - group1_mean)
       diff_of_stds = pm.Deterministic('difference of stds', group2_std - group1_std)
       effect_size = pm.Deterministic('effect size', diff_of_means / np.sqrt((group1_std**2 + 
       group2_std**2) / 2))
    
       trace = pm.sample(1000)

    return trace