2016-03-22 11 views
-1

Ich habe Beobachtungen von mehreren optischen Emissionslinien, und ich habe ein Modell, das mehrere (Fluss) Verhältnisse dieser Linien, basierend auf zwei Parametern, q und z, die ich will schließen.pymc: Inferring Parameter basierend auf Funktionen von Observablen

Ich habe @pymc.deterministic Objekte erstellt, die Werte von q und z nehmen (von denen jeder hat uninformativ priors über einige physikalisch interessanten Region), und sie in ein Verhältnis „vorhergesagt“. Es gibt etwa 7-Verhältnisse, und sie haben die Form:

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

I auch die Verhältnisse aus Beobachtungen abgeleitet definieren kann, wie beispielsweise

@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)) 

wo zum Beispiel NII_6584 ist der beobachtete Fluß einer der Linien und rcf_NII_6584 ist die Flusskorrektur für die gleiche Linie. Diese Korrekturen werden, sich durch die Linienwellenlängen (bekannt mit unendlicher Genauigkeit) bestimmt, und durch einen Parameter EBV, die aus dem beobachteten Flussverhältnis von zwei Linien berechnet werden können, die angeblich ein festes Verhältnis haben r:

@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) 

Ich habe auch eine vorherige auf den Wert von R_V.

Die Messungen selbst als Normalverteilungen ausgedrückt werden, wie

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']) 

würde Ich mag Schätzungen von R_V, EBV, q und z bekommen. Allerdings, wenn ich ein pymcModel von all diesen machen, wie ich höre, dass Deterministic Objekte können nicht Werte beobachtet:

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

Zuerst bin ich die Art von Deterministic Objekte Missverständnis? Wenn ja, wie kann ich sonst auf Werte schließen, die nicht direkt beobachtet werden?

Zweitens, konstruiere ich die Beobachtungen richtig? Es erscheint merkwürdig, dass ich den beobachteten Fluss als das Mittelwert- und das Wertargument spezifizieren müsste, aber es ist mir nicht klar, was ich sonst tun soll, außer dass ich auch die Flussmittel und Varianzen modelliere, was unnötig kompliziert erscheint.

Jeder Rat würde geschätzt werden!

Antwort

2

Ich glaube nicht, dass Sie Ihre Beobachtungen richtig konstruieren. Dies ist kein minimales Arbeitsbeispiel, aber vielleicht können wir etwas Verwirrung beseitigen.

Zunächst einmal, ich glaube nicht, dass der @ Deterministic Decorator ein Argument value = <something>. Es ist nicht klar, welche Ihre deterministischen Aussagen ist das eigentliche Modell, aber versuchen Sie den Code in die folgenden Vorlage zu übersetzen:

#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']) 
+0

Das ist ziemlich nützlich, so dass ich bin zu akzeptieren, da es die einzige versuchte Antwort ist ich habe bekommen. Danke für Ihre Hilfe! – DathosPachy