pymc:根据可观察量

时间:2016-03-22 18:04:11

标签: python pymc mcmc

我观察了几条光发射线,我有一个模型可以根据两个参数qz预测这些线的几个(通量)比率,我想推断

我创建了@pymc.deterministic个对象,这些对象的值为qz(每个对象在某些有趣的区域都有无信息的先验),然后将它们转换为&#34 ;预测"比。大约有7个比率,它们具有以下形式:

@pymc.deterministic(observed=True, value=NII_SII)
def NII_SII_th(q=q, z=z):
    return NII_SII_g(np.array([q, z]))

我还可以定义从观察中得出的比率,例如

@pymc.deterministic
def NII_SII(NII_6584=NII_6584, SII_6717=SII_6717,
            rcf_NII_6584=rcf_NII_6584, rcf_SII_6717=rcf_SII_6717):
    return np.log10(
        (rcf_NII_6584*NII_6584) / \
        (rcf_SII_6717*SII_6717))

其中,例如,NII_6584是其中一条线的观察通量,rcf_NII_6584是同一条线的通量校正。这些校正本身由线波长(已知具有无限精度)和参数EBV确定,参数r可以根据观察到具有固定比率{{1}的两条线的观察通量比来计算。 }:

@pymc.deterministic
def EBV(Ha=Ha, Hb=Hb, r=r, R_V=R_V, Ha_l=Ha_l, Hb_l=Hb_l):
    kHb = gas_meas.calzetti_k(lams=np.array([Ha_l]), Rv=R_V)
    kHa = gas_meas.calzetti_k(lams=np.array([Hb_l]), Rv=R_V)
    return 2.5 / (kHb - kHa) * np.log10((Ha/Hb) / r)

我还有R_V的值。

测量本身表示为正态分布,例如

NII_6584 = pymc.Normal(
    'NII_6584', mu=f_row['[NII]6584'],
    tau=1./e_row['[NII]6584']**2.,
    observed=True, value=f_row['[NII]6584'])

我希望得到R_VEBVqz的估算值。但是,当我从所有这些中pymc Model时,我被告知Deterministic个对象无法观察到值:

TypeError: __init__() got an unexpected keyword argument 'value'

首先,我是否误解了Deterministic对象的性质?如果是这样,我怎么根据没有直接观察到的值来推断?

第二,我是否正确构建了观察结果?奇怪的是,我必须将观察到的通量指定为均值和值参数,但除了模拟通量均值和方差之外,我还不清楚还有什么可做的。似乎不必要的复杂。

任何建议都将不胜感激!

1 个答案:

答案 0 :(得分:2)

我认为你并没有正确地构建你的观察结果。这不是一个最低限度的工作示例,但也许我们可以澄清一些混乱。

首先,我不认为@deminministic装饰器接受参数value = <something>。目前尚不清楚哪些确定性陈述是实际模型,但尝试将代码转换为以下模板:

#Define your randomly-distributed variables (I'm assuming they're normal)
q = pymc.Normal(name,mu=mu,tau=tau)
z = pymc.Normal(name2,mu=mu2,tau=tau2)

#Define how you think they generate your data
@pymc.deterministic
def NII_SII_th(q=q, z=z):
    return NII_SII_g(np.array([q, z])) #this fcn is defined somewhere else

#Your data array
f_row['[Nii]6584']=[...]

#Now link your model and your data
obs = pymc.Normal(modelname,mu=NII_SII_th,
                  observed=True, value=f_row['[NII]6584'])