HFSModel Hyperfine Anomalies

Trey V. Wenger (c) June 2025

HFSModel can also account for a non-CTEX effects. HFSModel considers the detailed balance between all states in the mol_data dictionary. Each state’s statistical weight is a free parameter drawn from a Dirichlet distribution. The Dirichlet distribution is defined by a hyperparameter, CTEX_variance, which controls the statistical weight deviations from the CTEX values. As CTEX_variance goes to zero, the weights go to the CTEX values. Note that we make no physical inference about the CTEX deviations, we just ensure that the solution is physical (i.e., that detailed balance is maintained).

[1]:
# General imports
import time

import matplotlib.pyplot as plt
import arviz as az
import pandas as pd
import numpy as np
import pymc as pm

print("pymc version:", pm.__version__)
print("arviz version:", az.__version__)

import bayes_spec
print("bayes_spec version:", bayes_spec.__version__)

import bayes_hfs
print("bayes_hfs version:", bayes_hfs.__version__)

# Notebook configuration
pd.options.display.max_rows = None
pymc version: 5.22.0
arviz version: 0.22.0dev
bayes_spec version: 1.9.0
bayes_hfs version: 1+0.gc6f9e00.dirty

Preparing Molecule Data

Here we model the hyperfine structure of CN transitions to the ground rotational state.

[2]:
from bayes_hfs import get_molecule_data, supplement_molecule_data
import pickle

try:
    all_mol_data_12CN, all_mol_metadata_12CN = get_molecule_data("CN, v=0,1", fmin=100.0, fmax=200.0)
    with open("mol_data_12CN.pkl", "wb") as f:
        pickle.dump(all_mol_data_12CN, f)
    with open("mol_metadata_12CN.pkl", "wb") as f:
        pickle.dump(all_mol_metadata_12CN, f)
except:
    with open("mol_data_12CN.pkl", "rb") as f:
        all_mol_data_12CN = pickle.load(f)
    with open("mol_metadata_12CN.pkl", "rb") as f:
        all_mol_metadata_12CN = pickle.load(f)

all_mol_data_12CN.pprint_all()
    FREQ     ERR    LGINT   DR    ELO    GUP MOLWT TAG  QNFMT  Ju  Ku  vu F1u F2u F3u  Jl  Kl  vl F1l F2l F3l    name    Lab
    MHz      MHz   nm2 MHz       1 / cm        u
----------- ------ ------- --- --------- --- ----- ---- ----- --- --- --- --- --- --- --- --- --- --- --- --- --------- -----
 112101.656   0.05 -8.0612   2 2042.4216   2    26 5041   234   1   1   1   1  --  --   0   1   1   2  --  -- CN, v=0,1  True
 112128.989   0.05  -8.069   2 2042.4222   4    26 5041   234   1   1   1   2  --  --   0   1   1   1  --  -- CN, v=0,1  True
 112148.503   0.05 -7.9593   2 2042.4216   4    26 5041   234   1   1   1   2  --  --   0   1   1   2  --  -- CN, v=0,1  True
 112442.806   0.05 -7.9569   2 2042.4222   4    26 5041   234   1   1   2   2  --  --   0   1   1   1  --  -- CN, v=0,1  True
 112445.015   0.05 -7.5311   2 2042.4216   6    26 5041   234   1   1   2   3  --  --   0   1   1   2  --  -- CN, v=0,1  True
 112453.876   0.05 -8.0586   2 2042.4222   2    26 5041   234   1   1   2   1  --  --   0   1   1   1  --  -- CN, v=0,1  True
 112462.292   0.05 -8.0664   2 2042.4216   4    26 5041   234   1   1   2   2  --  --   0   1   1   2  --  -- CN, v=0,1  True
113123.3701 0.0058 -4.7118   2    0.0007   2    26 5041   234   1   0   1   1  --  --   0   0   1   1  --  -- CN, v=0,1 False
113144.1573 0.0057 -3.7989   2      -0.0   2    26 5041   234   1   0   1   1  --  --   0   0   1   2  --  -- CN, v=0,1 False
113170.4915 0.0039  -3.809   2    0.0007   4    26 5041   234   1   0   1   2  --  --   0   0   1   1  --  -- CN, v=0,1 False
113191.2787 0.0034 -3.6955   2      -0.0   4    26 5041   234   1   0   1   2  --  --   0   0   1   2  --  -- CN, v=0,1 False
113488.1202 0.0033 -3.6932   2    0.0007   4    26 5041   234   1   0   2   2  --  --   0   0   1   1  --  -- CN, v=0,1 False
113490.9702 0.0024 -3.2691   2      -0.0   6    26 5041   234   1   0   2   3  --  --   0   0   1   2  --  -- CN, v=0,1 False
113499.6443 0.0028 -3.7962   2    0.0007   2    26 5041   234   1   0   2   1  --  --   0   0   1   1  --  -- CN, v=0,1 False
113508.9074 0.0028 -3.8065   2      -0.0   4    26 5041   234   1   0   2   2  --  --   0   0   1   2  --  -- CN, v=0,1 False
113520.4315 0.0044  -4.709   2      -0.0   2    26 5041   234   1   0   2   1  --  --   0   0   1   2  --  -- CN, v=0,1 False
[3]:
# Keep only Kl = 0 transitions
all_mol_data_12CN = all_mol_data_12CN[all_mol_data_12CN["Kl"] == 0]

# Add GLO
all_mol_data_12CN["GLO"] = 2 * all_mol_data_12CN["F1l"]

all_mol_data_12CN.pprint_all()
    FREQ     ERR    LGINT   DR  ELO   GUP MOLWT TAG  QNFMT  Ju  Ku  vu F1u F2u F3u  Jl  Kl  vl F1l F2l F3l    name    Lab  GLO
    MHz      MHz   nm2 MHz     1 / cm       u
----------- ------ ------- --- ------ --- ----- ---- ----- --- --- --- --- --- --- --- --- --- --- --- --- --------- ----- ---
113123.3701 0.0058 -4.7118   2 0.0007   2    26 5041   234   1   0   1   1  --  --   0   0   1   1  --  -- CN, v=0,1 False   2
113144.1573 0.0057 -3.7989   2   -0.0   2    26 5041   234   1   0   1   1  --  --   0   0   1   2  --  -- CN, v=0,1 False   4
113170.4915 0.0039  -3.809   2 0.0007   4    26 5041   234   1   0   1   2  --  --   0   0   1   1  --  -- CN, v=0,1 False   2
113191.2787 0.0034 -3.6955   2   -0.0   4    26 5041   234   1   0   1   2  --  --   0   0   1   2  --  -- CN, v=0,1 False   4
113488.1202 0.0033 -3.6932   2 0.0007   4    26 5041   234   1   0   2   2  --  --   0   0   1   1  --  -- CN, v=0,1 False   2
113490.9702 0.0024 -3.2691   2   -0.0   6    26 5041   234   1   0   2   3  --  --   0   0   1   2  --  -- CN, v=0,1 False   4
113499.6443 0.0028 -3.7962   2 0.0007   2    26 5041   234   1   0   2   1  --  --   0   0   1   1  --  -- CN, v=0,1 False   2
113508.9074 0.0028 -3.8065   2   -0.0   4    26 5041   234   1   0   2   2  --  --   0   0   1   2  --  -- CN, v=0,1 False   4
113520.4315 0.0044  -4.709   2   -0.0   2    26 5041   234   1   0   2   1  --  --   0   0   1   2  --  -- CN, v=0,1 False   4
[4]:
mol_data_12CN = supplement_molecule_data(all_mol_data_12CN, all_mol_metadata_12CN)
print(mol_data_12CN.keys())
print("molecular weight (Daltons):", mol_data_12CN['mol_weight'])
print("transition frequency (MHz):", mol_data_12CN['freq'])
print("Einstein A coefficient (s-1):", mol_data_12CN['Aul'])
print("Relative intensities:", mol_data_12CN['relative_int'])
print("state info:", mol_data_12CN["states"])
print("upper state index:", mol_data_12CN["state_u_idx"])
print("lower state index:", mol_data_12CN["state_l_idx"])
print("upper state degeneracy:", mol_data_12CN["Gu"])
print("lower state degeneracy:", mol_data_12CN["Gl"])
dict_keys(['mol_weight', 'freq', 'Aul', 'relative_int', 'states', 'state_u_idx', 'state_l_idx', 'Gu', 'Gl'])
molecular weight (Daltons): 26
transition frequency (MHz): [113123.3701 113144.1573 113170.4915 113191.2787 113488.1202 113490.9702
 113499.6443 113508.9074 113520.4315]
Einstein A coefficient (s-1): [1.24997446e-06 1.02301076e-05 4.99866053e-06 6.49280964e-06
 6.54458098e-06 1.15851092e-05 1.03265758e-05 5.04267116e-06
 1.26251089e-06]
Relative intensities: [0.01204927 0.09859632 0.09632981 0.12510097 0.12576526 0.33393404
 0.0992112  0.09688593 0.0121272 ]
state info: {'state': [np.str_('0 0 1 1 -- --'), np.str_('0 0 1 2 -- --'), np.str_('1 0 1 1 -- --'), np.str_('1 0 1 2 -- --'), np.str_('1 0 2 1 -- --'), np.str_('1 0 2 2 -- --'), np.str_('1 0 2 3 -- --')], 'deg': array([2, 4, 2, 4, 2, 4, 6]), 'E': array([ 1.00714381e-03, -0.00000000e+00,  5.43007265e+00,  5.43233412e+00,
        5.44813096e+00,  5.44757789e+00,  5.44670753e+00])}
upper state index: [2, 2, 3, 3, 5, 6, 4, 5, 4]
lower state index: [0, 1, 0, 1, 0, 1, 0, 1, 1]
upper state degeneracy: [2 2 4 4 4 6 2 4 2]
lower state degeneracy: [2 4 2 4 2 4 2 4 4]

Simulate data

[5]:
from bayes_spec import SpecData

# spectral axis definition
freq_axis_1 = np.arange(113100.0, 113210.0, 0.2) # MHz
freq_axis_2 = np.arange(113470.0, 113530.0, 0.2) # MHz

# data noise can either be a scalar (assumed constant noise across the spectrum)
# or an array of the same length as the data
noise = 0.03 # K

# brightness data. In this case, we just throw in some random data for now
# since we are only doing this in order to simulate some actual data.
brightness_data_1 = noise * np.random.randn(len(freq_axis_1)) # K
brightness_data_2 = noise * np.random.randn(len(freq_axis_2)) # K

# HFSModel datasets can be named anything, here we name them "12CN-1" and "12CN-2"
obs_1 = SpecData(
    freq_axis_1,
    brightness_data_1,
    noise,
    xlabel=r"LSRK Frequency (MHz)",
    ylabel=r"$T_B$ (K)",
)
obs_2 = SpecData(
    freq_axis_2,
    brightness_data_2,
    noise,
    xlabel=r"LSRK Frequency (MHz)",
    ylabel=r"$T_B$ (K)",
)
dummy_data = {"12CN-1": obs_1, "12CN-2": obs_2}

# Plot the simulated data
fig, axes = plt.subplots(2)
axes[0].plot(dummy_data["12CN-1"].spectral, dummy_data["12CN-1"].brightness, "k-")
axes[0].set_ylabel(dummy_data["12CN-1"].ylabel)
axes[1].plot(dummy_data["12CN-2"].spectral, dummy_data["12CN-2"].brightness, "k-")
axes[1].set_xlabel(dummy_data["12CN-2"].xlabel)
_ = axes[1].set_ylabel(dummy_data["12CN-2"].ylabel)
../_images/notebooks_hfs_model_anomalies_7_0.png
[6]:
from bayes_hfs import HFSModel

# Initialize and define the model
n_clouds = 3 # number of cloud components
baseline_degree = 0 # polynomial baseline degree
model = HFSModel(
    mol_data_12CN, # molecular data
    dummy_data,
    bg_temp = 2.7, # assumed background temperature (K)
    Beff = 1.0, # beam efficiency
    Feff = 1.0, # forward efficiency
    n_clouds=n_clouds,
    baseline_degree=baseline_degree,
    seed=1234,
    verbose=True
)
model.add_priors(
    prior_log10_Ntot = [13.5, 0.5], # mean and width of log10 total column density prior (cm-2)
    prior_fwhm2 = 1.0, # width of FWHM^2 prior (km2 s-2)
    prior_velocity = [-3.0, 3.0], # upper and lower limit of velocity prior (km/s)
    prior_log10_Tex_CTEX = [0.75, 0.25], # mean and width of log10 CTEX excitation temperature prior (K)
    assume_CTEX = False, # do not assume CTEX
    prior_log10_CTEX_variance = [-4.0, 1.0], # offset and width of log10 CTEX variance prior
    clip_weights = 1.0e-9, # clip statistical weights between [clip_weights, 1-clip_weights]
    clip_tau = -10.0, # clip optical depths below to prevent masers
    prior_fwhm_L = None, # assume Gaussian line profile
    prior_baseline_coeffs = None, # use default baseline priors
)
model.add_likelihood()

sim_params = {
    "log10_Ntot": np.array([13.8, 13.9, 14.0]),
    "fwhm2": np.array([1.0, 1.25, 1.5])**2.0,
    "velocity": [-2.0, 0.0, 2.5],
    "log10_Tex_CTEX": np.log10([4.46, 3.98, 3.16]),
    "log10_CTEX_variance": [-1.5, -2.0, -3.0],
    "baseline_12CN-1_norm": [0.0],
    "baseline_12CN-2_norm": [0.0],
}

# add derived quantities to sim_params
for key in model.cloud_deterministics + ["weights"]:
    if key not in sim_params.keys():
        sim_params[key] = model.model[key].eval(sim_params, on_unused_input="ignore")

# Evaluate and save simulated observations
sim_obs1 = model.model["12CN-1"].eval(sim_params, on_unused_input="ignore")
sim_obs2 = model.model["12CN-2"].eval(sim_params, on_unused_input="ignore")

# Plot the simulated data
fig, axes = plt.subplots(2)
axes[0].plot(dummy_data["12CN-1"].spectral, sim_obs1, "k-")
axes[0].set_ylabel(dummy_data["12CN-1"].ylabel)
axes[1].plot(dummy_data["12CN-2"].spectral, sim_obs2, "k-")
axes[1].set_xlabel(dummy_data["12CN-2"].xlabel)
_ = axes[1].set_ylabel(dummy_data["12CN-2"].ylabel)
../_images/notebooks_hfs_model_anomalies_8_0.png
[7]:
sim_params
[7]:
{'log10_Ntot': array([13.8, 13.9, 14. ]),
 'fwhm2': array([1.    , 1.5625, 2.25  ]),
 'velocity': [-2.0, 0.0, 2.5],
 'log10_Tex_CTEX': array([0.64933486, 0.59988307, 0.49968708]),
 'log10_CTEX_variance': [-1.5, -2.0, -3.0],
 'baseline_12CN-1_norm': [0.0],
 'baseline_12CN-2_norm': [0.0],
 'CTEX_weights': array([[1.99954842, 4.        , 0.59193533, 1.18327051, 0.58954346,
         1.17923313, 1.76919492],
        [1.99949396, 4.        , 0.51109864, 1.02161662, 0.5087849 ,
         1.01771121, 1.52690069],
        [1.99936267, 4.        , 0.35871387, 0.71691448, 0.35666979,
         0.71346443, 1.07049146]]),
 'Tex': array([[4.05444411, 4.52949482, 3.22358484],
        [3.88913415, 4.24504889, 3.18955201],
        [3.88139514, 4.19463058, 3.18389978],
        [3.72972002, 3.94969673, 3.15071616],
        [4.20828281, 4.00918084, 3.19153193],
        [4.80371409, 4.18580968, 3.14352813],
        [4.03035563, 4.87072952, 3.22663902],
        [4.03098566, 3.7854684 , 3.15828082],
        [3.86748828, 4.54431378, 3.1926533 ]]),
 'tau': array([[0.0285187 , 0.03373917, 0.0608651 ],
        [0.25192297, 0.30918194, 0.50923403],
        [0.23263892, 0.28030451, 0.48877471],
        [0.32566198, 0.40600501, 0.64894965],
        [0.29189042, 0.37343917, 0.63645788],
        [0.76670168, 1.05278166, 1.730899  ],
        [0.23507701, 0.26689488, 0.49995897],
        [0.24304589, 0.32010818, 0.50126882],
        [0.03101042, 0.03668263, 0.06248488]]),
 'tau_total': array([2.406468  , 3.07913716, 5.13889304]),
 'TR': array([[1.92835874, 2.34468097, 1.23725902],
        [1.78627809, 2.09364636, 1.21007084],
        [1.77932952, 2.04927148, 1.20530425],
        [1.65071068, 1.83737352, 1.17894533],
        [2.05666061, 1.88433377, 1.2076583 ],
        [2.58430731, 2.03705224, 1.16988738],
        [1.90238695, 2.64453546, 1.23529128],
        [1.90280138, 1.69348048, 1.18125133],
        [1.76278995, 2.35195175, 1.20816995]]),
 'weights': array([[0.17536077, 0.37135773, 0.04596153, 0.08654541, 0.04539133,
         0.09613394, 0.17924929],
        [0.17411721, 0.37744508, 0.05251642, 0.09539703, 0.0569054 ,
         0.08951008, 0.15410877],
        [0.21395955, 0.43581472, 0.03971055, 0.07771604, 0.03955192,
         0.0776619 , 0.11558532]])}
[8]:
# Now we pack the simulated spectrum into a new SpecData instance
obs_1 = SpecData(
    freq_axis_1,
    sim_obs1,
    noise,
    xlabel=r"LSRK Frequency (MHz)",
    ylabel=r"$T_B$ (K)",
)
obs_2 = SpecData(
    freq_axis_2,
    sim_obs2,
    noise,
    xlabel=r"LSRK Frequency (MHz)",
    ylabel=r"$T_B$ (K)",
)
data = {"12CN-1": obs_1, "12CN-2": obs_2}

Model Definition

[9]:
# Initialize and define the model
model = HFSModel(
    mol_data_12CN, # molecular data
    data,
    bg_temp = 2.7, # assumed background temperature (K)
    Beff = 1.0, # beam efficiency
    Feff = 1.0, # forward efficiency
    n_clouds=n_clouds,
    baseline_degree=baseline_degree,
    seed=1234,
    verbose=True
)
model.add_priors(
    prior_log10_Ntot = [13.5, 0.5], # mean and width of log10 total column density prior (cm-2)
    prior_fwhm2 = 1.0, # width of FWHM^2 prior (km2 s-2)
    prior_velocity = [-3.0, 3.0], # upper and lower limit of velocity prior (km/s)
    prior_log10_Tex_CTEX = [0.75, 0.25], # mean and width of log10 CTEX excitation temperature prior (K)
    assume_CTEX = False, # do not assume CTEX
    prior_log10_CTEX_variance = [-4.0, 1.0], # offset and width of log10 CTEX variance prior
    clip_weights = 1.0e-9, # clip statistical weights between [clip_weights, 1-clip_weights]
    clip_tau = -10.0, # clip optical depths below to prevent masers
    prior_fwhm_L = None, # assume Gaussian line profile
    prior_baseline_coeffs = None, # use default baseline priors
)
model.add_likelihood()
[10]:
# Plot model graph
model.graph().render('hfs_model_anomalies', format='png')
model.graph()
[10]:
../_images/notebooks_hfs_model_anomalies_13_0.svg
[11]:
# model string representation
print(model.model.str_repr())
    baseline_12CN-1_norm ~ Normal(0, 1)
    baseline_12CN-2_norm ~ Normal(0, 1)
         log10_Ntot_norm ~ Normal(0, 1)
              fwhm2_norm ~ Gamma(0.5, f())
           velocity_norm ~ Beta(2, 2)
     log10_Tex_CTEX_norm ~ Normal(0, 1)
log10_CTEX_variance_norm ~ HalfNormal(0, 1)
                 weights ~ Dirichlet(f(log10_CTEX_variance_norm, log10_Tex_CTEX_norm))
              log10_Ntot ~ Deterministic(f(log10_Ntot_norm))
                   fwhm2 ~ Deterministic(f(fwhm2_norm))
                velocity ~ Deterministic(f(velocity_norm))
          log10_Tex_CTEX ~ Deterministic(f(log10_Tex_CTEX_norm))
            CTEX_weights ~ Deterministic(f(log10_Tex_CTEX_norm))
     log10_CTEX_variance ~ Deterministic(f(log10_CTEX_variance_norm))
                     Tex ~ Deterministic(f(weights, log10_Ntot_norm))
                     tau ~ Deterministic(f(weights, log10_Ntot_norm))
               tau_total ~ Deterministic(f(weights, log10_Ntot_norm))
                      TR ~ Deterministic(f(weights, log10_Ntot_norm))
                  12CN-1 ~ Normal(f(baseline_12CN-1_norm, weights, log10_Ntot_norm, velocity_norm, fwhm2_norm), <constant>)
                  12CN-2 ~ Normal(f(baseline_12CN-2_norm, weights, log10_Ntot_norm, velocity_norm, fwhm2_norm), <constant>)
[12]:
from bayes_spec.plots import plot_predictive

# prior predictive check
prior = model.sample_prior_predictive(
    samples=1000,  # prior predictive samples
)
_ = plot_predictive(model.data, prior.prior_predictive.sel(draw=slice(None, None, 20)))
Sampling: [12CN-1, 12CN-2, baseline_12CN-1_norm, baseline_12CN-2_norm, fwhm2_norm, log10_CTEX_variance_norm, log10_Ntot_norm, log10_Tex_CTEX_norm, velocity_norm, weights]
../_images/notebooks_hfs_model_anomalies_15_1.png
[13]:
print(model.cloud_freeRVs)
print(model.cloud_deterministics)
['log10_Ntot_norm', 'fwhm2_norm', 'velocity_norm', 'log10_Tex_CTEX_norm', 'log10_CTEX_variance_norm', 'weights']
['log10_Ntot', 'fwhm2', 'velocity', 'log10_Tex_CTEX', 'CTEX_weights', 'log10_CTEX_variance', 'Tex', 'tau', 'tau_total', 'TR']
[14]:
from bayes_spec.plots import plot_pair

var_names = [
    param for param in model.cloud_deterministics + [p for p in model.cloud_freeRVs if "_norm" not in p]
    if not set(model.model.named_vars_to_dims[param]).intersection(set(["transition", "state"]))
]
print(var_names)
_ = plot_pair(
    prior.prior, # samples
    var_names, # var_names to plot
    combine_dims=["cloud"], # concatenate clouds
    labeller=model.labeller, # label manager
    kind="scatter", # plot type
    reference_values=sim_params, # truths
)
['log10_Ntot', 'fwhm2', 'velocity', 'log10_Tex_CTEX', 'log10_CTEX_variance', 'tau_total']
../_images/notebooks_hfs_model_anomalies_17_1.png

Variational Inference

[15]:
start = time.time()
model.fit(
    n = 1_000_000, # maximum number of VI iterations
    draws = 1_000, # number of posterior samples
    rel_tolerance = 0.005, # VI relative convergence threshold
    abs_tolerance = 0.005, # VI absolute convergence threshold
    learning_rate = 0.001, # VI learning rate
    start = {"velocity_norm": np.linspace(0.1, 0.9, model.n_clouds)},
)
end = time.time()
print(f"Runtime: {(end-start)/60.0:.2f} minutes")
Convergence achieved at 72200
Interrupted at 72,199 [7%]: Average Loss = 1.8103e+26
Adding log-likelihood to trace
Runtime: 10.70 minutes
[16]:
pm.summary(model.trace.posterior)
arviz - WARNING - Shape validation failed: input_shape: (1, 1000), minimum_shape: (chains=2, draws=4)
/home/twenger/miniforge3/envs/bayes_spec-dev/lib/python3.13/site-packages/arviz/stats/diagnostics.py:991: RuntimeWarning: invalid value encountered in scalar divide
  varsd = varvar / evar / 4
/home/twenger/miniforge3/envs/bayes_spec-dev/lib/python3.13/site-packages/arviz/stats/diagnostics.py:991: RuntimeWarning: invalid value encountered in scalar divide
  varsd = varvar / evar / 4
/home/twenger/miniforge3/envs/bayes_spec-dev/lib/python3.13/site-packages/arviz/stats/diagnostics.py:991: RuntimeWarning: invalid value encountered in scalar divide
  varsd = varvar / evar / 4
[16]:
mean sd hdi_3% hdi_97% mcse_mean mcse_sd ess_bulk ess_tail r_hat
baseline_12CN-1_norm[0] -0.048 0.042 -0.128 0.032 0.001 0.001 978.0 943.0 NaN
baseline_12CN-2_norm[0] -0.120 0.059 -0.228 -0.013 0.002 0.001 938.0 1024.0 NaN
log10_Ntot_norm[0] -0.154 0.012 -0.175 -0.132 0.000 0.000 840.0 1072.0 NaN
log10_Ntot_norm[1] 0.660 0.014 0.634 0.684 0.000 0.000 884.0 929.0 NaN
log10_Ntot_norm[2] -0.340 0.028 -0.396 -0.291 0.001 0.001 1049.0 914.0 NaN
log10_Tex_CTEX_norm[0] 0.519 0.154 0.201 0.779 0.005 0.004 1007.0 1010.0 NaN
log10_Tex_CTEX_norm[1] -0.440 0.075 -0.571 -0.290 0.002 0.002 947.0 944.0 NaN
log10_Tex_CTEX_norm[2] -0.194 0.107 -0.401 0.006 0.004 0.002 814.0 839.0 NaN
fwhm2_norm[0] 1.189 0.044 1.106 1.270 0.001 0.001 985.0 908.0 NaN
fwhm2_norm[1] 1.561 0.060 1.456 1.680 0.002 0.001 1098.0 952.0 NaN
fwhm2_norm[2] 3.563 0.268 3.098 4.107 0.009 0.006 832.0 903.0 NaN
velocity_norm[0] 0.166 0.001 0.163 0.169 0.000 0.000 930.0 979.0 NaN
velocity_norm[1] 0.500 0.002 0.496 0.503 0.000 0.000 948.0 973.0 NaN
velocity_norm[2] 0.922 0.006 0.911 0.933 0.000 0.000 1033.0 1020.0 NaN
log10_CTEX_variance_norm[0] 2.199 0.232 1.788 2.647 0.008 0.005 936.0 877.0 NaN
log10_CTEX_variance_norm[1] 1.888 0.229 1.429 2.291 0.008 0.005 858.0 872.0 NaN
log10_CTEX_variance_norm[2] 2.162 0.228 1.780 2.647 0.007 0.006 986.0 942.0 NaN
weights[0, 0 0 1 1 -- --] 0.127 0.001 0.124 0.129 0.000 0.000 1031.0 849.0 NaN
weights[0, 0 0 1 2 -- --] 0.279 0.002 0.275 0.283 0.000 0.000 933.0 922.0 NaN
weights[0, 1 0 1 1 -- --] 0.064 0.001 0.063 0.065 0.000 0.000 922.0 983.0 NaN
weights[0, 1 0 1 2 -- --] 0.113 0.001 0.111 0.116 0.000 0.000 787.0 906.0 NaN
weights[0, 1 0 2 1 -- --] 0.061 0.001 0.060 0.062 0.000 0.000 1062.0 944.0 NaN
weights[0, 1 0 2 2 -- --] 0.138 0.001 0.135 0.141 0.000 0.000 862.0 793.0 NaN
weights[0, 1 0 2 3 -- --] 0.218 0.005 0.209 0.226 0.000 0.000 924.0 991.0 NaN
weights[1, 0 0 1 1 -- --] 0.170 0.001 0.168 0.173 0.000 0.000 761.0 892.0 NaN
weights[1, 0 0 1 2 -- --] 0.367 0.001 0.364 0.370 0.000 0.000 939.0 911.0 NaN
weights[1, 1 0 1 1 -- --] 0.055 0.000 0.054 0.056 0.000 0.000 927.0 944.0 NaN
weights[1, 1 0 1 2 -- --] 0.098 0.001 0.096 0.099 0.000 0.000 1166.0 980.0 NaN
weights[1, 1 0 2 1 -- --] 0.061 0.001 0.060 0.061 0.000 0.000 944.0 849.0 NaN
weights[1, 1 0 2 2 -- --] 0.092 0.001 0.091 0.094 0.000 0.000 1185.0 899.0 NaN
weights[1, 1 0 2 3 -- --] 0.157 0.003 0.152 0.162 0.000 0.000 1060.0 846.0 NaN
weights[2, 0 0 1 1 -- --] 0.157 0.004 0.151 0.164 0.000 0.000 1146.0 883.0 NaN
weights[2, 0 0 1 2 -- --] 0.340 0.004 0.333 0.348 0.000 0.000 897.0 865.0 NaN
weights[2, 1 0 1 1 -- --] 0.065 0.002 0.062 0.068 0.000 0.000 978.0 941.0 NaN
weights[2, 1 0 1 2 -- --] 0.113 0.002 0.109 0.118 0.000 0.000 950.0 908.0 NaN
weights[2, 1 0 2 1 -- --] 0.064 0.002 0.061 0.067 0.000 0.000 871.0 848.0 NaN
weights[2, 1 0 2 2 -- --] 0.116 0.003 0.111 0.120 0.000 0.000 908.0 943.0 NaN
weights[2, 1 0 2 3 -- --] 0.145 0.007 0.133 0.160 0.000 0.000 1080.0 960.0 NaN
log10_Ntot[0] 13.423 0.006 13.413 13.434 0.000 0.000 840.0 1072.0 NaN
log10_Ntot[1] 13.830 0.007 13.817 13.842 0.000 0.000 884.0 929.0 NaN
log10_Ntot[2] 13.330 0.014 13.302 13.354 0.000 0.000 1049.0 914.0 NaN
fwhm2[0] 1.189 0.044 1.106 1.270 0.001 0.001 985.0 908.0 NaN
fwhm2[1] 1.561 0.060 1.456 1.680 0.002 0.001 1098.0 952.0 NaN
fwhm2[2] 3.563 0.268 3.098 4.107 0.009 0.006 832.0 903.0 NaN
velocity[0] -2.004 0.009 -2.021 -1.988 0.000 0.000 930.0 979.0 NaN
velocity[1] -0.002 0.011 -0.021 0.019 0.000 0.000 948.0 973.0 NaN
velocity[2] 2.531 0.035 2.468 2.598 0.001 0.001 1033.0 1020.0 NaN
log10_Tex_CTEX[0] 0.880 0.039 0.800 0.945 0.001 0.001 1007.0 1010.0 NaN
log10_Tex_CTEX[1] 0.640 0.019 0.607 0.677 0.001 0.000 947.0 944.0 NaN
log10_Tex_CTEX[2] 0.701 0.027 0.650 0.751 0.001 0.001 814.0 839.0 NaN
CTEX_weights[0, 0 0 1 1 -- --] 2.000 0.000 2.000 2.000 0.000 0.000 1007.0 1010.0 NaN
CTEX_weights[0, 0 0 1 2 -- --] 4.000 0.000 4.000 4.000 0.000 NaN 1000.0 1000.0 NaN
CTEX_weights[0, 1 0 1 1 -- --] 0.976 0.062 0.846 1.079 0.002 0.001 1007.0 1010.0 NaN
CTEX_weights[0, 1 0 1 2 -- --] 1.952 0.124 1.692 2.158 0.004 0.003 1007.0 1010.0 NaN
CTEX_weights[0, 1 0 2 1 -- --] 0.974 0.062 0.844 1.077 0.002 0.001 1007.0 1010.0 NaN
CTEX_weights[0, 1 0 2 2 -- --] 1.948 0.124 1.688 2.155 0.004 0.003 1007.0 1010.0 NaN
CTEX_weights[0, 1 0 2 3 -- --] 2.922 0.186 2.532 3.232 0.006 0.004 1007.0 1010.0 NaN
CTEX_weights[1, 0 0 1 1 -- --] 2.000 0.000 2.000 2.000 0.000 0.000 947.0 944.0 NaN
CTEX_weights[1, 0 0 1 2 -- --] 4.000 0.000 4.000 4.000 0.000 NaN 1000.0 1000.0 NaN
CTEX_weights[1, 1 0 1 1 -- --] 0.577 0.031 0.523 0.639 0.001 0.001 947.0 944.0 NaN
CTEX_weights[1, 1 0 1 2 -- --] 1.153 0.061 1.045 1.277 0.002 0.001 947.0 944.0 NaN
CTEX_weights[1, 1 0 2 1 -- --] 0.574 0.031 0.521 0.636 0.001 0.001 947.0 944.0 NaN
CTEX_weights[1, 1 0 2 2 -- --] 1.149 0.061 1.042 1.273 0.002 0.001 947.0 944.0 NaN
CTEX_weights[1, 1 0 2 3 -- --] 1.724 0.092 1.563 1.910 0.003 0.002 947.0 944.0 NaN
CTEX_weights[2, 0 0 1 1 -- --] 2.000 0.000 2.000 2.000 0.000 0.000 814.0 839.0 NaN
CTEX_weights[2, 0 0 1 2 -- --] 4.000 0.000 4.000 4.000 0.000 NaN 1000.0 1000.0 NaN
CTEX_weights[2, 1 0 1 1 -- --] 0.679 0.045 0.593 0.764 0.002 0.001 814.0 839.0 NaN
CTEX_weights[2, 1 0 1 2 -- --] 1.358 0.091 1.185 1.527 0.003 0.002 814.0 839.0 NaN
CTEX_weights[2, 1 0 2 1 -- --] 0.677 0.045 0.590 0.762 0.002 0.001 814.0 839.0 NaN
CTEX_weights[2, 1 0 2 2 -- --] 1.354 0.091 1.181 1.523 0.003 0.002 814.0 839.0 NaN
CTEX_weights[2, 1 0 2 3 -- --] 2.032 0.136 1.772 2.285 0.005 0.003 814.0 839.0 NaN
log10_CTEX_variance[0] -1.801 0.232 -2.212 -1.353 0.008 0.005 936.0 877.0 NaN
log10_CTEX_variance[1] -2.112 0.229 -2.571 -1.709 0.008 0.005 858.0 872.0 NaN
log10_CTEX_variance[2] -1.838 0.228 -2.220 -1.353 0.007 0.006 986.0 942.0 NaN
Tex[113123.3701, 0] 7.927 0.167 7.585 8.195 0.005 0.004 954.0 1016.0 NaN
Tex[113123.3701, 1] 4.823 0.049 4.739 4.921 0.002 0.001 781.0 981.0 NaN
Tex[113123.3701, 2] 6.169 0.232 5.743 6.607 0.008 0.005 916.0 972.0 NaN
Tex[113144.1573, 0] 6.961 0.104 6.762 7.146 0.004 0.002 867.0 916.0 NaN
Tex[113144.1573, 1] 4.525 0.035 4.461 4.593 0.001 0.001 847.0 882.0 NaN
Tex[113144.1573, 2] 5.665 0.165 5.376 5.971 0.006 0.004 900.0 938.0 NaN
Tex[113170.4915, 0] 6.742 0.111 6.534 6.943 0.003 0.003 1012.0 972.0 NaN
Tex[113170.4915, 1] 4.362 0.039 4.290 4.434 0.001 0.001 1064.0 952.0 NaN
Tex[113170.4915, 2] 5.315 0.162 5.025 5.625 0.005 0.004 994.0 766.0 NaN
Tex[113191.2787, 0] 6.031 0.077 5.881 6.170 0.003 0.002 932.0 982.0 NaN
Tex[113191.2787, 1] 4.117 0.028 4.064 4.171 0.001 0.001 1165.0 1019.0 NaN
Tex[113191.2787, 2] 4.937 0.116 4.743 5.162 0.004 0.003 929.0 754.0 NaN
Tex[113488.1202, 0] 8.902 0.199 8.525 9.234 0.006 0.004 967.0 868.0 NaN
Tex[113488.1202, 1] 4.166 0.036 4.100 4.232 0.001 0.001 1009.0 1017.0 NaN
Tex[113488.1202, 2] 5.446 0.169 5.176 5.806 0.005 0.004 1000.0 703.0 NaN
Tex[113490.9702, 0] 8.356 0.344 7.746 8.997 0.012 0.007 902.0 879.0 NaN
Tex[113490.9702, 1] 4.350 0.068 4.224 4.476 0.002 0.001 1040.0 866.0 NaN
Tex[113490.9702, 2] 4.349 0.199 4.021 4.757 0.006 0.004 1057.0 981.0 NaN
Tex[113499.6443, 0] 7.434 0.146 7.171 7.710 0.005 0.003 1007.0 937.0 NaN
Tex[113499.6443, 1] 5.272 0.060 5.162 5.383 0.002 0.001 993.0 982.0 NaN
Tex[113499.6443, 2] 6.073 0.213 5.687 6.484 0.007 0.005 913.0 1031.0 NaN
Tex[113508.9074, 0] 7.705 0.128 7.446 7.926 0.004 0.003 945.0 724.0 NaN
Tex[113508.9074, 1] 3.942 0.026 3.892 3.988 0.001 0.001 1166.0 1080.0 NaN
Tex[113508.9074, 2] 5.051 0.120 4.814 5.253 0.004 0.003 910.0 924.0 NaN
Tex[113520.4315, 0] 6.581 0.093 6.409 6.759 0.003 0.002 1036.0 942.0 NaN
Tex[113520.4315, 1] 4.919 0.042 4.843 5.000 0.001 0.001 893.0 850.0 NaN
Tex[113520.4315, 2] 5.586 0.153 5.302 5.864 0.005 0.003 897.0 932.0 NaN
tau[113123.3701, 0] 0.006 0.000 0.006 0.006 0.000 0.000 990.0 956.0 NaN
tau[113123.3701, 1] 0.027 0.001 0.026 0.028 0.000 0.000 929.0 982.0 NaN
tau[113123.3701, 2] 0.007 0.000 0.006 0.008 0.000 0.000 1070.0 816.0 NaN
tau[113144.1573, 0] 0.057 0.001 0.055 0.059 0.000 0.000 827.0 952.0 NaN
tau[113144.1573, 1] 0.248 0.004 0.240 0.256 0.000 0.000 903.0 923.0 NaN
tau[113144.1573, 2] 0.064 0.003 0.059 0.069 0.000 0.000 941.0 976.0 NaN
tau[113170.4915, 0] 0.052 0.001 0.050 0.054 0.000 0.000 948.0 789.0 NaN
tau[113170.4915, 1] 0.229 0.004 0.221 0.238 0.000 0.000 940.0 838.0 NaN
tau[113170.4915, 2] 0.060 0.003 0.055 0.066 0.000 0.000 1172.0 954.0 NaN
tau[113191.2787, 0] 0.080 0.001 0.077 0.082 0.000 0.000 781.0 1023.0 NaN
tau[113191.2787, 1] 0.329 0.005 0.319 0.340 0.000 0.000 906.0 895.0 NaN
tau[113191.2787, 2] 0.088 0.003 0.081 0.094 0.000 0.000 994.0 992.0 NaN
tau[113488.1202, 0] 0.056 0.002 0.053 0.059 0.000 0.000 1012.0 731.0 NaN
tau[113488.1202, 1] 0.305 0.006 0.295 0.317 0.000 0.000 939.0 912.0 NaN
tau[113488.1202, 2] 0.077 0.004 0.070 0.084 0.000 0.000 1135.0 721.0 NaN
tau[113490.9702, 0] 0.171 0.006 0.160 0.183 0.000 0.000 839.0 769.0 NaN
tau[113490.9702, 1] 0.854 0.016 0.825 0.885 0.001 0.000 956.0 982.0 NaN
tau[113490.9702, 2] 0.251 0.012 0.231 0.273 0.000 0.000 1032.0 941.0 NaN
tau[113499.6443, 0] 0.050 0.001 0.048 0.053 0.000 0.000 1011.0 767.0 NaN
tau[113499.6443, 1] 0.213 0.004 0.204 0.221 0.000 0.000 944.0 948.0 NaN
tau[113499.6443, 2] 0.057 0.003 0.052 0.063 0.000 0.000 1072.0 875.0 NaN
tau[113508.9074, 0] 0.052 0.001 0.051 0.055 0.000 0.000 887.0 864.0 NaN
tau[113508.9074, 1] 0.260 0.004 0.251 0.268 0.000 0.000 918.0 939.0 NaN
tau[113508.9074, 2] 0.067 0.003 0.062 0.072 0.000 0.000 1021.0 1037.0 NaN
tau[113520.4315, 0] 0.007 0.000 0.007 0.008 0.000 0.000 906.0 947.0 NaN
tau[113520.4315, 1] 0.029 0.000 0.028 0.030 0.000 0.000 881.0 904.0 NaN
tau[113520.4315, 2] 0.008 0.000 0.007 0.009 0.000 0.000 994.0 908.0 NaN
tau_total[0] 0.531 0.011 0.509 0.552 0.000 0.000 782.0 785.0 NaN
tau_total[1] 2.494 0.042 2.415 2.573 0.001 0.001 922.0 978.0 NaN
tau_total[2] 0.679 0.027 0.632 0.731 0.001 0.001 1079.0 914.0 NaN
TR[113123.3701, 0] 5.520 0.161 5.192 5.778 0.005 0.004 954.0 1016.0 NaN
TR[113123.3701, 1] 2.608 0.044 2.532 2.696 0.002 0.001 781.0 981.0 NaN
TR[113123.3701, 2] 3.848 0.218 3.450 4.260 0.007 0.005 916.0 972.0 NaN
TR[113144.1573, 0] 4.595 0.099 4.406 4.771 0.003 0.002 867.0 916.0 NaN
TR[113144.1573, 1] 2.340 0.031 2.283 2.401 0.001 0.001 847.0 882.0 NaN
TR[113144.1573, 2] 3.377 0.153 3.111 3.662 0.005 0.003 900.0 938.0 NaN
TR[113170.4915, 0] 4.387 0.105 4.190 4.578 0.003 0.002 1012.0 972.0 NaN
TR[113170.4915, 1] 2.196 0.035 2.133 2.259 0.001 0.001 1064.0 952.0 NaN
TR[113170.4915, 2] 3.054 0.149 2.789 3.340 0.005 0.003 994.0 766.0 NaN
TR[113191.2787, 0] 3.717 0.072 3.577 3.847 0.002 0.002 932.0 982.0 NaN
TR[113191.2787, 1] 1.982 0.025 1.936 2.028 0.001 0.001 1165.0 1019.0 NaN
TR[113191.2787, 2] 2.709 0.105 2.534 2.913 0.003 0.002 929.0 754.0 NaN
TR[113488.1202, 0] 6.455 0.192 6.090 6.777 0.006 0.004 967.0 868.0 NaN
TR[113488.1202, 1] 2.019 0.032 1.962 2.078 0.001 0.001 1009.0 1017.0 NaN
TR[113488.1202, 2] 3.170 0.156 2.922 3.502 0.005 0.004 1000.0 703.0 NaN
TR[113490.9702, 0] 5.927 0.332 5.339 6.546 0.011 0.007 902.0 879.0 NaN
TR[113490.9702, 1] 2.180 0.060 2.070 2.292 0.002 0.001 1040.0 866.0 NaN
TR[113490.9702, 2] 2.181 0.175 1.895 2.543 0.005 0.004 1057.0 981.0 NaN
TR[113499.6443, 0] 5.041 0.140 4.789 5.305 0.004 0.003 1007.0 937.0 NaN
TR[113499.6443, 1] 3.010 0.055 2.909 3.111 0.002 0.001 993.0 982.0 NaN
TR[113499.6443, 2] 3.752 0.199 3.391 4.138 0.007 0.004 913.0 1031.0 NaN
TR[113508.9074, 0] 5.300 0.123 5.051 5.512 0.004 0.003 945.0 724.0 NaN
TR[113508.9074, 1] 1.826 0.022 1.784 1.866 0.001 0.001 1166.0 1080.0 NaN
TR[113508.9074, 2] 2.808 0.109 2.594 2.992 0.004 0.002 910.0 924.0 NaN
TR[113520.4315, 0] 4.228 0.087 4.066 4.397 0.003 0.002 1036.0 942.0 NaN
TR[113520.4315, 1] 2.688 0.038 2.619 2.761 0.001 0.001 893.0 850.0 NaN
TR[113520.4315, 2] 3.298 0.141 3.037 3.556 0.005 0.003 897.0 932.0 NaN
[17]:
posterior = model.sample_posterior_predictive(
    thin=10, # keep one in {thin} posterior samples
)
_ = plot_predictive(model.data, posterior.posterior_predictive)
Sampling: [12CN-1, 12CN-2]
../_images/notebooks_hfs_model_anomalies_21_3.png

MCMC

We increase target_accept since this model has some degeneracies.

[18]:
start = time.time()
model.sample(
    init="advi+adapt_diag",  # initialization strategy
    tune=1000,  # tuning samples
    draws=1000,  # posterior samples
    chains=8,  # number of independent chains
    cores=8,  # number of parallel chains
    init_kwargs={
        "rel_tolerance": 0.005,
        "abs_tolerance": 0.005,
        "learning_rate": 0.001,
        "start": {"velocity_norm": np.linspace(0.1, 0.9, model.n_clouds)},
    },  # VI initialization arguments
    nuts_kwargs={"target_accept": 0.9},  # NUTS arguments
)
end = time.time()
print(f"Runtime: {(end-start)/60.0:.2f} minutes")
Initializing NUTS using custom advi+adapt_diag strategy
Convergence achieved at 72200
Interrupted at 72,199 [7%]: Average Loss = 1.8103e+26
Multiprocess sampling (8 chains in 8 jobs)
NUTS: [baseline_12CN-1_norm, baseline_12CN-2_norm, log10_Ntot_norm, fwhm2_norm, velocity_norm, log10_Tex_CTEX_norm, log10_CTEX_variance_norm, weights]
Sampling 8 chains for 1_000 tune and 1_000 draw iterations (8_000 + 8_000 draws total) took 508 seconds.
Adding log-likelihood to trace
Runtime: 19.77 minutes
[19]:
model.solve(
    init_params="random_from_data", # GMM initialization strategy
    n_init=10, # number of GMM initilizations
    max_iter=1_000, # maximum number of GMM iterations
    kl_div_threshold=0.1, # covergence threshold
)
GMM converged to unique solution
[20]:
print("solutions:", model.solutions)
az.summary(model.trace.solution_0)
# this also works: az.summary(model.trace.solution_0)
solutions: [0]
/home/twenger/miniforge3/envs/bayes_spec-dev/lib/python3.13/site-packages/arviz/stats/diagnostics.py:596: RuntimeWarning: invalid value encountered in scalar divide
  (between_chain_variance / within_chain_variance + num_samples - 1) / (num_samples)
/home/twenger/miniforge3/envs/bayes_spec-dev/lib/python3.13/site-packages/arviz/stats/diagnostics.py:991: RuntimeWarning: invalid value encountered in scalar divide
  varsd = varvar / evar / 4
/home/twenger/miniforge3/envs/bayes_spec-dev/lib/python3.13/site-packages/arviz/stats/diagnostics.py:596: RuntimeWarning: invalid value encountered in scalar divide
  (between_chain_variance / within_chain_variance + num_samples - 1) / (num_samples)
/home/twenger/miniforge3/envs/bayes_spec-dev/lib/python3.13/site-packages/arviz/stats/diagnostics.py:991: RuntimeWarning: invalid value encountered in scalar divide
  varsd = varvar / evar / 4
/home/twenger/miniforge3/envs/bayes_spec-dev/lib/python3.13/site-packages/arviz/stats/diagnostics.py:596: RuntimeWarning: invalid value encountered in scalar divide
  (between_chain_variance / within_chain_variance + num_samples - 1) / (num_samples)
/home/twenger/miniforge3/envs/bayes_spec-dev/lib/python3.13/site-packages/arviz/stats/diagnostics.py:991: RuntimeWarning: invalid value encountered in scalar divide
  varsd = varvar / evar / 4
[20]:
mean sd hdi_3% hdi_97% mcse_mean mcse_sd ess_bulk ess_tail r_hat
baseline_12CN-1_norm[0] -0.046 0.044 -0.128 0.036 0.000 0.001 8602.0 5324.0 1.00
baseline_12CN-2_norm[0] -0.119 0.062 -0.230 0.003 0.001 0.001 9538.0 5722.0 1.00
log10_Ntot_norm[0] 0.292 0.211 -0.117 0.668 0.005 0.004 1599.0 1314.0 1.01
log10_Ntot_norm[1] 0.813 0.125 0.578 1.043 0.003 0.002 1862.0 2341.0 1.00
log10_Ntot_norm[2] 0.951 0.189 0.595 1.315 0.004 0.003 1939.0 1779.0 1.00
log10_Tex_CTEX_norm[0] -0.191 0.311 -0.650 0.414 0.009 0.011 1849.0 1444.0 1.01
log10_Tex_CTEX_norm[1] -0.522 0.109 -0.716 -0.309 0.002 0.002 2666.0 3340.0 1.00
log10_Tex_CTEX_norm[2] -0.979 0.046 -1.054 -0.892 0.001 0.001 2028.0 1878.0 1.00
fwhm2_norm[0] 1.026 0.102 0.837 1.214 0.002 0.001 1960.0 2527.0 1.01
fwhm2_norm[1] 1.492 0.128 1.250 1.725 0.003 0.002 2470.0 3741.0 1.00
fwhm2_norm[2] 2.737 0.355 2.059 3.368 0.006 0.004 4028.0 5397.0 1.00
velocity_norm[0] 0.167 0.002 0.163 0.170 0.000 0.000 6795.0 5946.0 1.00
velocity_norm[1] 0.499 0.002 0.495 0.503 0.000 0.000 5800.0 5898.0 1.00
velocity_norm[2] 0.921 0.007 0.907 0.934 0.000 0.000 6610.0 5793.0 1.00
log10_CTEX_variance_norm[0] 2.208 0.264 1.732 2.714 0.003 0.004 6359.0 4032.0 1.00
log10_CTEX_variance_norm[1] 1.821 0.263 1.353 2.322 0.004 0.003 5392.0 5525.0 1.00
log10_CTEX_variance_norm[2] 0.489 0.350 0.000 1.090 0.006 0.005 2672.0 2546.0 1.00
weights[0, 0 0 1 1 -- --] 0.158 0.015 0.130 0.182 0.000 0.000 1800.0 1689.0 1.01
weights[0, 0 0 1 2 -- --] 0.342 0.026 0.293 0.381 0.001 0.001 1645.0 1399.0 1.01
weights[0, 1 0 1 1 -- --] 0.052 0.005 0.044 0.062 0.000 0.000 1689.0 1434.0 1.01
weights[0, 1 0 1 2 -- --] 0.095 0.008 0.082 0.110 0.000 0.000 1670.0 1509.0 1.01
weights[0, 1 0 2 1 -- --] 0.050 0.005 0.042 0.059 0.000 0.000 1754.0 1607.0 1.01
weights[0, 1 0 2 2 -- --] 0.111 0.011 0.093 0.132 0.000 0.000 1626.0 1505.0 1.01
weights[0, 1 0 2 3 -- --] 0.191 0.011 0.175 0.213 0.000 0.000 1677.0 1387.0 1.01
weights[1, 0 0 1 1 -- --] 0.177 0.007 0.164 0.189 0.000 0.000 2245.0 2928.0 1.00
weights[1, 0 0 1 2 -- --] 0.376 0.009 0.359 0.392 0.000 0.000 2076.0 2648.0 1.00
weights[1, 1 0 1 1 -- --] 0.052 0.003 0.048 0.057 0.000 0.000 1981.0 2497.0 1.00
weights[1, 1 0 1 2 -- --] 0.094 0.004 0.087 0.101 0.000 0.000 1968.0 2463.0 1.00
weights[1, 1 0 2 1 -- --] 0.057 0.003 0.051 0.063 0.000 0.000 2009.0 2430.0 1.00
weights[1, 1 0 2 2 -- --] 0.089 0.003 0.083 0.095 0.000 0.000 2091.0 2488.0 1.00
weights[1, 1 0 2 3 -- --] 0.154 0.003 0.150 0.160 0.000 0.000 2542.0 3285.0 1.00
weights[2, 0 0 1 1 -- --] 0.214 0.004 0.206 0.221 0.000 0.000 2341.0 2046.0 1.00
weights[2, 0 0 1 2 -- --] 0.432 0.006 0.420 0.443 0.000 0.000 2090.0 1892.0 1.00
weights[2, 1 0 1 1 -- --] 0.040 0.002 0.038 0.043 0.000 0.000 2218.0 1841.0 1.00
weights[2, 1 0 1 2 -- --] 0.078 0.003 0.073 0.082 0.000 0.000 2121.0 2006.0 1.00
weights[2, 1 0 2 1 -- --] 0.040 0.002 0.037 0.043 0.000 0.000 2317.0 2016.0 1.00
weights[2, 1 0 2 2 -- --] 0.078 0.003 0.073 0.083 0.000 0.000 2090.0 1741.0 1.00
weights[2, 1 0 2 3 -- --] 0.118 0.002 0.114 0.122 0.000 0.000 2474.0 2435.0 1.00
log10_Ntot[0] 13.646 0.106 13.441 13.834 0.003 0.002 1599.0 1314.0 1.01
log10_Ntot[1] 13.906 0.062 13.789 14.021 0.001 0.001 1862.0 2341.0 1.00
log10_Ntot[2] 13.976 0.095 13.798 14.158 0.002 0.002 1939.0 1779.0 1.00
fwhm2[0] 1.026 0.102 0.837 1.214 0.002 0.001 1960.0 2527.0 1.01
fwhm2[1] 1.492 0.128 1.250 1.725 0.003 0.002 2470.0 3741.0 1.00
fwhm2[2] 2.737 0.355 2.059 3.368 0.006 0.004 4028.0 5397.0 1.00
velocity[0] -2.001 0.010 -2.020 -1.981 0.000 0.000 6795.0 5946.0 1.00
velocity[1] -0.007 0.013 -0.032 0.018 0.000 0.000 5800.0 5898.0 1.00
velocity[2] 2.524 0.043 2.442 2.605 0.001 0.000 6610.0 5793.0 1.00
log10_Tex_CTEX[0] 0.702 0.078 0.588 0.854 0.002 0.003 1849.0 1444.0 1.01
log10_Tex_CTEX[1] 0.620 0.027 0.571 0.673 0.001 0.001 2666.0 3340.0 1.00
log10_Tex_CTEX[2] 0.505 0.012 0.487 0.527 0.000 0.000 2028.0 1878.0 1.00
CTEX_weights[0, 0 0 1 1 -- --] 2.000 0.000 1.999 2.000 0.000 0.000 1849.0 1444.0 1.01
CTEX_weights[0, 0 0 1 2 -- --] 4.000 0.000 4.000 4.000 0.000 NaN 8000.0 8000.0 NaN
CTEX_weights[0, 1 0 1 1 -- --] 0.681 0.128 0.477 0.921 0.004 0.004 1849.0 1444.0 1.01
CTEX_weights[0, 1 0 1 2 -- --] 1.361 0.257 0.954 1.841 0.007 0.008 1849.0 1444.0 1.01
CTEX_weights[0, 1 0 2 1 -- --] 0.678 0.128 0.475 0.918 0.004 0.004 1849.0 1444.0 1.01
CTEX_weights[0, 1 0 2 2 -- --] 1.357 0.257 0.950 1.837 0.007 0.008 1849.0 1444.0 1.01
CTEX_weights[0, 1 0 2 3 -- --] 2.035 0.385 1.426 2.755 0.011 0.012 1849.0 1444.0 1.01
CTEX_weights[1, 0 0 1 1 -- --] 2.000 0.000 1.999 2.000 0.000 0.000 2666.0 3340.0 1.00
CTEX_weights[1, 0 0 1 2 -- --] 4.000 0.000 4.000 4.000 0.000 NaN 8000.0 8000.0 NaN
CTEX_weights[1, 1 0 1 1 -- --] 0.543 0.045 0.465 0.630 0.001 0.001 2666.0 3340.0 1.00
CTEX_weights[1, 1 0 1 2 -- --] 1.086 0.089 0.929 1.260 0.002 0.002 2666.0 3340.0 1.00
CTEX_weights[1, 1 0 2 1 -- --] 0.541 0.045 0.463 0.628 0.001 0.001 2666.0 3340.0 1.00
CTEX_weights[1, 1 0 2 2 -- --] 1.082 0.089 0.925 1.256 0.002 0.002 2666.0 3340.0 1.00
CTEX_weights[1, 1 0 2 3 -- --] 1.624 0.134 1.388 1.884 0.003 0.003 2666.0 3340.0 1.00
CTEX_weights[2, 0 0 1 1 -- --] 1.999 0.000 1.999 1.999 0.000 0.000 2028.0 1878.0 1.00
CTEX_weights[2, 0 0 1 2 -- --] 4.000 0.000 4.000 4.000 0.000 NaN 8000.0 8000.0 NaN
CTEX_weights[2, 1 0 1 1 -- --] 0.367 0.017 0.340 0.398 0.000 0.000 2028.0 1878.0 1.00
CTEX_weights[2, 1 0 1 2 -- --] 0.733 0.033 0.680 0.796 0.001 0.001 2028.0 1878.0 1.00
CTEX_weights[2, 1 0 2 1 -- --] 0.365 0.017 0.338 0.396 0.000 0.000 2028.0 1878.0 1.00
CTEX_weights[2, 1 0 2 2 -- --] 0.730 0.033 0.677 0.792 0.001 0.001 2028.0 1878.0 1.00
CTEX_weights[2, 1 0 2 3 -- --] 1.095 0.050 1.015 1.189 0.001 0.001 2028.0 1878.0 1.00
log10_CTEX_variance[0] -1.792 0.264 -2.268 -1.286 0.003 0.004 6359.0 4032.0 1.00
log10_CTEX_variance[1] -2.179 0.263 -2.647 -1.678 0.004 0.003 5392.0 5525.0 1.00
log10_CTEX_variance[2] -3.511 0.350 -4.000 -2.910 0.006 0.005 2672.0 2546.0 1.00
Tex[113123.3701, 0] 5.142 2.052 3.741 7.065 0.044 0.517 1684.0 1433.0 1.01
Tex[113123.3701, 1] 4.481 0.347 3.939 5.115 0.008 0.010 1973.0 2481.0 1.00
Tex[113123.3701, 2] 3.253 0.120 3.065 3.468 0.003 0.004 2120.0 1923.0 1.00
Tex[113144.1573, 0] 4.707 0.930 3.677 6.195 0.026 0.055 1620.0 1473.0 1.01
Tex[113144.1573, 1] 4.255 0.255 3.844 4.735 0.006 0.006 1894.0 2248.0 1.00
Tex[113144.1573, 2] 3.237 0.107 3.065 3.430 0.003 0.003 2060.0 1737.0 1.00
Tex[113170.4915, 0] 4.648 0.981 3.604 6.111 0.027 0.067 1671.0 1453.0 1.01
Tex[113170.4915, 1] 4.112 0.247 3.713 4.554 0.006 0.007 1937.0 2458.0 1.00
Tex[113170.4915, 2] 3.187 0.096 3.032 3.363 0.002 0.003 2040.0 1955.0 1.00
Tex[113191.2787, 0] 4.317 0.675 3.528 5.450 0.019 0.034 1632.0 1485.0 1.01
Tex[113191.2787, 1] 3.924 0.183 3.625 4.277 0.004 0.004 1928.0 2457.0 1.00
Tex[113191.2787, 2] 3.172 0.087 3.025 3.332 0.002 0.002 2035.0 1813.0 1.00
Tex[113488.1202, 0] 6.028 53.913 3.959 7.759 0.607 26.733 1634.0 1379.0 1.01
Tex[113488.1202, 1] 3.953 0.212 3.613 4.344 0.005 0.006 1925.0 2458.0 1.00
Tex[113488.1202, 2] 3.200 0.098 3.048 3.385 0.002 0.003 2011.0 1685.0 1.00
Tex[113490.9702, 0] 5.669 1.100 4.566 7.342 0.031 0.072 1605.0 1380.0 1.01
Tex[113490.9702, 1] 4.206 0.125 4.001 4.435 0.003 0.003 1914.0 2441.0 1.00
Tex[113490.9702, 2] 3.195 0.062 3.094 3.306 0.001 0.002 2126.0 1965.0 1.00
Tex[113499.6443, 0] 4.868 1.270 3.675 6.613 0.034 0.131 1641.0 1419.0 1.01
Tex[113499.6443, 1] 4.847 0.415 4.191 5.580 0.010 0.013 1873.0 2186.0 1.00
Tex[113499.6443, 2] 3.251 0.115 3.073 3.456 0.003 0.004 2099.0 1807.0 1.00
Tex[113508.9074, 0] 4.992 1.126 3.815 6.725 0.031 0.072 1619.0 1409.0 1.01
Tex[113508.9074, 1] 3.780 0.161 3.502 4.077 0.004 0.004 2015.0 2478.0 1.00
Tex[113508.9074, 2] 3.185 0.089 3.032 3.344 0.002 0.002 2022.0 1766.0 1.00
Tex[113520.4315, 0] 4.504 0.843 3.555 5.880 0.023 0.045 1673.0 1472.0 1.01
Tex[113520.4315, 1] 4.587 0.322 4.073 5.199 0.008 0.007 1989.0 2470.0 1.00
Tex[113520.4315, 2] 3.236 0.107 3.056 3.422 0.003 0.003 2151.0 1922.0 1.00
tau[113123.3701, 0] 0.017 0.007 0.006 0.031 0.000 0.000 1625.0 1344.0 1.01
tau[113123.3701, 1] 0.036 0.007 0.022 0.050 0.000 0.000 1863.0 2314.0 1.00
tau[113123.3701, 2] 0.059 0.014 0.033 0.087 0.000 0.000 1928.0 1727.0 1.00
tau[113144.1573, 0] 0.159 0.057 0.055 0.267 0.001 0.001 1596.0 1369.0 1.01
tau[113144.1573, 1] 0.318 0.060 0.210 0.432 0.001 0.001 1851.0 2325.0 1.00
tau[113144.1573, 2] 0.488 0.116 0.271 0.705 0.003 0.002 1928.0 1738.0 1.00
tau[113170.4915, 0] 0.146 0.054 0.048 0.248 0.001 0.001 1622.0 1379.0 1.01
tau[113170.4915, 1] 0.298 0.059 0.188 0.407 0.001 0.001 1862.0 2268.0 1.00
tau[113170.4915, 2] 0.476 0.114 0.272 0.701 0.002 0.002 1930.0 1714.0 1.00
tau[113191.2787, 0] 0.210 0.072 0.080 0.349 0.002 0.001 1597.0 1421.0 1.01
tau[113191.2787, 1] 0.419 0.076 0.280 0.562 0.002 0.001 1857.0 2318.0 1.00
tau[113191.2787, 2] 0.624 0.147 0.361 0.914 0.003 0.002 1931.0 1800.0 1.00
tau[113488.1202, 0] 0.177 0.070 0.050 0.308 0.002 0.001 1620.0 1341.0 1.01
tau[113488.1202, 1] 0.395 0.077 0.252 0.539 0.002 0.001 1860.0 2323.0 1.00
tau[113488.1202, 2] 0.620 0.148 0.345 0.904 0.003 0.002 1929.0 1733.0 1.00
tau[113490.9702, 0] 0.487 0.175 0.168 0.818 0.004 0.003 1597.0 1421.0 1.01
tau[113490.9702, 1] 1.080 0.189 0.730 1.434 0.004 0.003 1858.0 2328.0 1.00
tau[113490.9702, 2] 1.657 0.387 0.937 2.393 0.008 0.006 1935.0 1798.0 1.00
tau[113499.6443, 0] 0.147 0.056 0.046 0.252 0.001 0.001 1616.0 1349.0 1.01
tau[113499.6443, 1] 0.283 0.060 0.169 0.391 0.001 0.001 1855.0 2284.0 1.00
tau[113499.6443, 2] 0.486 0.117 0.271 0.711 0.003 0.002 1929.0 1731.0 1.00
tau[113508.9074, 0] 0.152 0.056 0.052 0.258 0.001 0.001 1597.0 1431.0 1.01
tau[113508.9074, 1] 0.329 0.059 0.219 0.438 0.001 0.001 1859.0 2339.0 1.00
tau[113508.9074, 2] 0.482 0.114 0.277 0.705 0.002 0.002 1930.0 1798.0 1.00
tau[113520.4315, 0] 0.020 0.007 0.007 0.033 0.000 0.000 1600.0 1452.0 1.01
tau[113520.4315, 1] 0.038 0.007 0.024 0.051 0.000 0.000 1862.0 2320.0 1.00
tau[113520.4315, 2] 0.060 0.014 0.034 0.087 0.000 0.000 1930.0 1767.0 1.00
tau_total[0] 1.516 0.551 0.504 2.552 0.013 0.008 1595.0 1371.0 1.01
tau_total[1] 3.195 0.592 2.140 4.344 0.014 0.008 1847.0 2331.0 1.00
tau_total[2] 4.952 1.171 2.784 7.184 0.026 0.017 1930.0 1771.0 1.00
TR[113123.3701, 0] 2.916 2.000 1.661 4.695 0.042 0.525 1684.0 1433.0 1.01
TR[113123.3701, 1] 2.304 0.311 1.828 2.872 0.007 0.009 1973.0 2481.0 1.00
TR[113123.3701, 2] 1.261 0.097 1.113 1.434 0.002 0.003 2120.0 1923.0 1.00
TR[113144.1573, 0] 2.515 0.863 1.561 3.823 0.024 0.054 1620.0 1473.0 1.01
TR[113144.1573, 1] 2.104 0.224 1.748 2.528 0.005 0.005 1894.0 2248.0 1.00
TR[113144.1573, 2] 1.248 0.086 1.103 1.394 0.002 0.003 2060.0 1737.0 1.00
TR[113170.4915, 0] 2.463 0.913 1.546 3.792 0.025 0.067 1671.0 1453.0 1.01
TR[113170.4915, 1] 1.979 0.216 1.637 2.366 0.005 0.006 1937.0 2458.0 1.00
TR[113170.4915, 2] 1.208 0.077 1.086 1.349 0.002 0.003 2040.0 1955.0 1.00
TR[113191.2787, 0] 2.165 0.612 1.483 3.178 0.017 0.032 1632.0 1485.0 1.01
TR[113191.2787, 1] 1.816 0.157 1.563 2.121 0.004 0.004 1928.0 2457.0 1.00
TR[113191.2787, 2] 1.196 0.069 1.075 1.317 0.002 0.002 2035.0 1813.0 1.00
TR[113488.1202, 0] 3.771 53.906 1.841 5.352 0.607 26.731 1634.0 1379.0 1.01
TR[113488.1202, 1] 1.838 0.183 1.540 2.166 0.004 0.005 1925.0 2458.0 1.00
TR[113488.1202, 2] 1.215 0.078 1.089 1.356 0.002 0.003 2011.0 1685.0 1.00
TR[113490.9702, 0] 3.385 1.046 2.372 4.953 0.030 0.071 1605.0 1380.0 1.01
TR[113490.9702, 1] 2.055 0.109 1.877 2.256 0.003 0.003 1914.0 2441.0 1.00
TR[113490.9702, 2] 1.210 0.049 1.131 1.299 0.001 0.001 2126.0 1965.0 1.00
TR[113499.6443, 0] 2.659 1.202 1.601 4.259 0.032 0.133 1641.0 1419.0 1.01
TR[113499.6443, 1] 2.626 0.377 2.042 3.293 0.009 0.012 1873.0 2186.0 1.00
TR[113499.6443, 2] 1.256 0.093 1.115 1.420 0.002 0.003 2099.0 1807.0 1.00
TR[113508.9074, 0] 2.769 1.058 1.709 4.356 0.029 0.071 1619.0 1409.0 1.01
TR[113508.9074, 1] 1.690 0.137 1.457 1.943 0.003 0.003 2015.0 2478.0 1.00
TR[113508.9074, 2] 1.203 0.071 1.083 1.329 0.002 0.002 2022.0 1766.0 1.00
TR[113520.4315, 0] 2.328 0.774 1.501 3.571 0.021 0.044 1673.0 1472.0 1.01
TR[113520.4315, 1] 2.392 0.289 1.916 2.918 0.007 0.007 1989.0 2470.0 1.00
TR[113520.4315, 2] 1.243 0.086 1.101 1.392 0.002 0.003 2151.0 1922.0 1.00
[21]:
posterior = model.sample_posterior_predictive(
    thin=10, # keep one in {thin} posterior samples
)
_ = plot_predictive(model.data, posterior.posterior_predictive)
Sampling: [12CN-1, 12CN-2]
../_images/notebooks_hfs_model_anomalies_26_3.png
[22]:
from bayes_spec.plots import plot_traces

axes = plot_traces(model.trace.solution_0, model.cloud_freeRVs + model.baseline_freeRVs + model.hyper_freeRVs)
fig = axes.ravel()[0].figure
fig.tight_layout()
../_images/notebooks_hfs_model_anomalies_27_0.png
[23]:
var_names = [
    param for param in model.cloud_freeRVs
    if not set(model.model.named_vars_to_dims[param]).intersection(set(["transition", "state"]))
]
print(var_names)
_ = plot_pair(
    model.trace.solution_0.sel(draw=slice(None, None, 10)), # samples
    var_names, # var_names to plot
    combine_dims=["cloud"], # concatenate clouds
    kind="scatter", # plot type
)
['log10_Ntot_norm', 'fwhm2_norm', 'velocity_norm', 'log10_Tex_CTEX_norm', 'log10_CTEX_variance_norm']
../_images/notebooks_hfs_model_anomalies_28_1.png
[24]:
_ = plot_pair(
    model.trace.solution_0.sel(draw=slice(None, None, 10)), # samples
    ["velocity", "fwhm2"], # var_names to plot
    combine_dims=None, # do not concatenate clouds
    kind="scatter", # plot type
)
../_images/notebooks_hfs_model_anomalies_29_0.png
[25]:
_ = plot_pair(
    model.trace.solution_0.sel(cloud=0, draw=slice(None, None, 10)), # samples
    var_names, # var_names to plot
    kind="scatter", # plot type
)
../_images/notebooks_hfs_model_anomalies_30_0.png
[26]:
_ = plot_pair(
    model.trace.solution_0.sel(cloud=1, draw=slice(None, None, 10)), # samples
    var_names, # var_names to plot
    kind="scatter", # plot type
)
../_images/notebooks_hfs_model_anomalies_31_0.png
[27]:
_ = plot_pair(
    model.trace.solution_0.sel(cloud=2, draw=slice(None, None, 10)), # samples
    var_names, # var_names to plot
    kind="scatter", # plot type
)
../_images/notebooks_hfs_model_anomalies_32_0.png
[28]:
var_names = [
    param for param in model.cloud_deterministics + [p for p in model.cloud_freeRVs if "_norm" not in p]
    if not set(model.model.named_vars_to_dims[param]).intersection(set(["transition", "state"]))
]
print(var_names)

_ = plot_pair(
    model.trace.solution_0.sel(draw=slice(None, None, 10)), # samples
    var_names, # var_names to plot
    combine_dims=["cloud"], # concatenate clouds
    labeller=model.labeller, # label manager
    kind="scatter", # plot type
    reference_values=sim_params, # truths
)
['log10_Ntot', 'fwhm2', 'velocity', 'log10_Tex_CTEX', 'log10_CTEX_variance', 'tau_total']
../_images/notebooks_hfs_model_anomalies_33_1.png
[29]:
# identify simulation cloud corresponding to each posterior cloud
sim_cloud_map = {}
for i in range(n_clouds):
    posterior_velocity = model.trace.solution_0['velocity'].sel(cloud=i).data.mean()
    match = np.argmin(np.abs(sim_params["velocity"] - posterior_velocity))
    sim_cloud_map[i] = match
sim_cloud_map
[29]:
{0: np.int64(0), 1: np.int64(1), 2: np.int64(2)}
[30]:
cloud = 0

# subset of sim_params
my_sim_params = {}
for var_name in var_names:
    my_sim_params[var_name] = sim_params[var_name][sim_cloud_map[cloud]]

_ = plot_pair(
    model.trace.solution_0.sel(cloud=cloud, draw=slice(None, None, 10)), # samples
    var_names, # var_names to plot
    labeller=model.labeller, # label manager
    kind="scatter", # plot type
    reference_values=my_sim_params, # truths
)
../_images/notebooks_hfs_model_anomalies_35_0.png
[31]:
cloud = 1

# subset of sim_params
my_sim_params = {}
for var_name in var_names:
    my_sim_params[var_name] = sim_params[var_name][sim_cloud_map[cloud]]

_ = plot_pair(
    model.trace.solution_0.sel(cloud=cloud, draw=slice(None, None, 10)), # samples
    var_names, # var_names to plot
    labeller=model.labeller, # label manager
    kind="scatter", # plot type
    reference_values=my_sim_params, # truths
)
../_images/notebooks_hfs_model_anomalies_36_0.png
[32]:
cloud = 2

# subset of sim_params
my_sim_params = {}
for var_name in var_names:
    my_sim_params[var_name] = sim_params[var_name][sim_cloud_map[cloud]]

_ = plot_pair(
    model.trace.solution_0.sel(cloud=cloud, draw=slice(None, None, 10)), # samples
    var_names, # var_names to plot
    labeller=model.labeller, # label manager
    kind="scatter", # plot type
    reference_values=my_sim_params, # truths
)
../_images/notebooks_hfs_model_anomalies_37_0.png
[33]:
point_stats = az.summary(model.trace.solution_0, kind='stats')
print("BIC:", model.bic())
display(point_stats)
BIC: -3293.9259619615154
mean sd hdi_3% hdi_97%
baseline_12CN-1_norm[0] -0.046 0.044 -0.128 0.036
baseline_12CN-2_norm[0] -0.119 0.062 -0.230 0.003
log10_Ntot_norm[0] 0.292 0.211 -0.117 0.668
log10_Ntot_norm[1] 0.813 0.125 0.578 1.043
log10_Ntot_norm[2] 0.951 0.189 0.595 1.315
log10_Tex_CTEX_norm[0] -0.191 0.311 -0.650 0.414
log10_Tex_CTEX_norm[1] -0.522 0.109 -0.716 -0.309
log10_Tex_CTEX_norm[2] -0.979 0.046 -1.054 -0.892
fwhm2_norm[0] 1.026 0.102 0.837 1.214
fwhm2_norm[1] 1.492 0.128 1.250 1.725
fwhm2_norm[2] 2.737 0.355 2.059 3.368
velocity_norm[0] 0.167 0.002 0.163 0.170
velocity_norm[1] 0.499 0.002 0.495 0.503
velocity_norm[2] 0.921 0.007 0.907 0.934
log10_CTEX_variance_norm[0] 2.208 0.264 1.732 2.714
log10_CTEX_variance_norm[1] 1.821 0.263 1.353 2.322
log10_CTEX_variance_norm[2] 0.489 0.350 0.000 1.090
weights[0, 0 0 1 1 -- --] 0.158 0.015 0.130 0.182
weights[0, 0 0 1 2 -- --] 0.342 0.026 0.293 0.381
weights[0, 1 0 1 1 -- --] 0.052 0.005 0.044 0.062
weights[0, 1 0 1 2 -- --] 0.095 0.008 0.082 0.110
weights[0, 1 0 2 1 -- --] 0.050 0.005 0.042 0.059
weights[0, 1 0 2 2 -- --] 0.111 0.011 0.093 0.132
weights[0, 1 0 2 3 -- --] 0.191 0.011 0.175 0.213
weights[1, 0 0 1 1 -- --] 0.177 0.007 0.164 0.189
weights[1, 0 0 1 2 -- --] 0.376 0.009 0.359 0.392
weights[1, 1 0 1 1 -- --] 0.052 0.003 0.048 0.057
weights[1, 1 0 1 2 -- --] 0.094 0.004 0.087 0.101
weights[1, 1 0 2 1 -- --] 0.057 0.003 0.051 0.063
weights[1, 1 0 2 2 -- --] 0.089 0.003 0.083 0.095
weights[1, 1 0 2 3 -- --] 0.154 0.003 0.150 0.160
weights[2, 0 0 1 1 -- --] 0.214 0.004 0.206 0.221
weights[2, 0 0 1 2 -- --] 0.432 0.006 0.420 0.443
weights[2, 1 0 1 1 -- --] 0.040 0.002 0.038 0.043
weights[2, 1 0 1 2 -- --] 0.078 0.003 0.073 0.082
weights[2, 1 0 2 1 -- --] 0.040 0.002 0.037 0.043
weights[2, 1 0 2 2 -- --] 0.078 0.003 0.073 0.083
weights[2, 1 0 2 3 -- --] 0.118 0.002 0.114 0.122
log10_Ntot[0] 13.646 0.106 13.441 13.834
log10_Ntot[1] 13.906 0.062 13.789 14.021
log10_Ntot[2] 13.976 0.095 13.798 14.158
fwhm2[0] 1.026 0.102 0.837 1.214
fwhm2[1] 1.492 0.128 1.250 1.725
fwhm2[2] 2.737 0.355 2.059 3.368
velocity[0] -2.001 0.010 -2.020 -1.981
velocity[1] -0.007 0.013 -0.032 0.018
velocity[2] 2.524 0.043 2.442 2.605
log10_Tex_CTEX[0] 0.702 0.078 0.588 0.854
log10_Tex_CTEX[1] 0.620 0.027 0.571 0.673
log10_Tex_CTEX[2] 0.505 0.012 0.487 0.527
CTEX_weights[0, 0 0 1 1 -- --] 2.000 0.000 1.999 2.000
CTEX_weights[0, 0 0 1 2 -- --] 4.000 0.000 4.000 4.000
CTEX_weights[0, 1 0 1 1 -- --] 0.681 0.128 0.477 0.921
CTEX_weights[0, 1 0 1 2 -- --] 1.361 0.257 0.954 1.841
CTEX_weights[0, 1 0 2 1 -- --] 0.678 0.128 0.475 0.918
CTEX_weights[0, 1 0 2 2 -- --] 1.357 0.257 0.950 1.837
CTEX_weights[0, 1 0 2 3 -- --] 2.035 0.385 1.426 2.755
CTEX_weights[1, 0 0 1 1 -- --] 2.000 0.000 1.999 2.000
CTEX_weights[1, 0 0 1 2 -- --] 4.000 0.000 4.000 4.000
CTEX_weights[1, 1 0 1 1 -- --] 0.543 0.045 0.465 0.630
CTEX_weights[1, 1 0 1 2 -- --] 1.086 0.089 0.929 1.260
CTEX_weights[1, 1 0 2 1 -- --] 0.541 0.045 0.463 0.628
CTEX_weights[1, 1 0 2 2 -- --] 1.082 0.089 0.925 1.256
CTEX_weights[1, 1 0 2 3 -- --] 1.624 0.134 1.388 1.884
CTEX_weights[2, 0 0 1 1 -- --] 1.999 0.000 1.999 1.999
CTEX_weights[2, 0 0 1 2 -- --] 4.000 0.000 4.000 4.000
CTEX_weights[2, 1 0 1 1 -- --] 0.367 0.017 0.340 0.398
CTEX_weights[2, 1 0 1 2 -- --] 0.733 0.033 0.680 0.796
CTEX_weights[2, 1 0 2 1 -- --] 0.365 0.017 0.338 0.396
CTEX_weights[2, 1 0 2 2 -- --] 0.730 0.033 0.677 0.792
CTEX_weights[2, 1 0 2 3 -- --] 1.095 0.050 1.015 1.189
log10_CTEX_variance[0] -1.792 0.264 -2.268 -1.286
log10_CTEX_variance[1] -2.179 0.263 -2.647 -1.678
log10_CTEX_variance[2] -3.511 0.350 -4.000 -2.910
Tex[113123.3701, 0] 5.142 2.052 3.741 7.065
Tex[113123.3701, 1] 4.481 0.347 3.939 5.115
Tex[113123.3701, 2] 3.253 0.120 3.065 3.468
Tex[113144.1573, 0] 4.707 0.930 3.677 6.195
Tex[113144.1573, 1] 4.255 0.255 3.844 4.735
Tex[113144.1573, 2] 3.237 0.107 3.065 3.430
Tex[113170.4915, 0] 4.648 0.981 3.604 6.111
Tex[113170.4915, 1] 4.112 0.247 3.713 4.554
Tex[113170.4915, 2] 3.187 0.096 3.032 3.363
Tex[113191.2787, 0] 4.317 0.675 3.528 5.450
Tex[113191.2787, 1] 3.924 0.183 3.625 4.277
Tex[113191.2787, 2] 3.172 0.087 3.025 3.332
Tex[113488.1202, 0] 6.028 53.913 3.959 7.759
Tex[113488.1202, 1] 3.953 0.212 3.613 4.344
Tex[113488.1202, 2] 3.200 0.098 3.048 3.385
Tex[113490.9702, 0] 5.669 1.100 4.566 7.342
Tex[113490.9702, 1] 4.206 0.125 4.001 4.435
Tex[113490.9702, 2] 3.195 0.062 3.094 3.306
Tex[113499.6443, 0] 4.868 1.270 3.675 6.613
Tex[113499.6443, 1] 4.847 0.415 4.191 5.580
Tex[113499.6443, 2] 3.251 0.115 3.073 3.456
Tex[113508.9074, 0] 4.992 1.126 3.815 6.725
Tex[113508.9074, 1] 3.780 0.161 3.502 4.077
Tex[113508.9074, 2] 3.185 0.089 3.032 3.344
Tex[113520.4315, 0] 4.504 0.843 3.555 5.880
Tex[113520.4315, 1] 4.587 0.322 4.073 5.199
Tex[113520.4315, 2] 3.236 0.107 3.056 3.422
tau[113123.3701, 0] 0.017 0.007 0.006 0.031
tau[113123.3701, 1] 0.036 0.007 0.022 0.050
tau[113123.3701, 2] 0.059 0.014 0.033 0.087
tau[113144.1573, 0] 0.159 0.057 0.055 0.267
tau[113144.1573, 1] 0.318 0.060 0.210 0.432
tau[113144.1573, 2] 0.488 0.116 0.271 0.705
tau[113170.4915, 0] 0.146 0.054 0.048 0.248
tau[113170.4915, 1] 0.298 0.059 0.188 0.407
tau[113170.4915, 2] 0.476 0.114 0.272 0.701
tau[113191.2787, 0] 0.210 0.072 0.080 0.349
tau[113191.2787, 1] 0.419 0.076 0.280 0.562
tau[113191.2787, 2] 0.624 0.147 0.361 0.914
tau[113488.1202, 0] 0.177 0.070 0.050 0.308
tau[113488.1202, 1] 0.395 0.077 0.252 0.539
tau[113488.1202, 2] 0.620 0.148 0.345 0.904
tau[113490.9702, 0] 0.487 0.175 0.168 0.818
tau[113490.9702, 1] 1.080 0.189 0.730 1.434
tau[113490.9702, 2] 1.657 0.387 0.937 2.393
tau[113499.6443, 0] 0.147 0.056 0.046 0.252
tau[113499.6443, 1] 0.283 0.060 0.169 0.391
tau[113499.6443, 2] 0.486 0.117 0.271 0.711
tau[113508.9074, 0] 0.152 0.056 0.052 0.258
tau[113508.9074, 1] 0.329 0.059 0.219 0.438
tau[113508.9074, 2] 0.482 0.114 0.277 0.705
tau[113520.4315, 0] 0.020 0.007 0.007 0.033
tau[113520.4315, 1] 0.038 0.007 0.024 0.051
tau[113520.4315, 2] 0.060 0.014 0.034 0.087
tau_total[0] 1.516 0.551 0.504 2.552
tau_total[1] 3.195 0.592 2.140 4.344
tau_total[2] 4.952 1.171 2.784 7.184
TR[113123.3701, 0] 2.916 2.000 1.661 4.695
TR[113123.3701, 1] 2.304 0.311 1.828 2.872
TR[113123.3701, 2] 1.261 0.097 1.113 1.434
TR[113144.1573, 0] 2.515 0.863 1.561 3.823
TR[113144.1573, 1] 2.104 0.224 1.748 2.528
TR[113144.1573, 2] 1.248 0.086 1.103 1.394
TR[113170.4915, 0] 2.463 0.913 1.546 3.792
TR[113170.4915, 1] 1.979 0.216 1.637 2.366
TR[113170.4915, 2] 1.208 0.077 1.086 1.349
TR[113191.2787, 0] 2.165 0.612 1.483 3.178
TR[113191.2787, 1] 1.816 0.157 1.563 2.121
TR[113191.2787, 2] 1.196 0.069 1.075 1.317
TR[113488.1202, 0] 3.771 53.906 1.841 5.352
TR[113488.1202, 1] 1.838 0.183 1.540 2.166
TR[113488.1202, 2] 1.215 0.078 1.089 1.356
TR[113490.9702, 0] 3.385 1.046 2.372 4.953
TR[113490.9702, 1] 2.055 0.109 1.877 2.256
TR[113490.9702, 2] 1.210 0.049 1.131 1.299
TR[113499.6443, 0] 2.659 1.202 1.601 4.259
TR[113499.6443, 1] 2.626 0.377 2.042 3.293
TR[113499.6443, 2] 1.256 0.093 1.115 1.420
TR[113508.9074, 0] 2.769 1.058 1.709 4.356
TR[113508.9074, 1] 1.690 0.137 1.457 1.943
TR[113508.9074, 2] 1.203 0.071 1.083 1.329
TR[113520.4315, 0] 2.328 0.774 1.501 3.571
TR[113520.4315, 1] 2.392 0.289 1.916 2.918
TR[113520.4315, 2] 1.243 0.086 1.101 1.392
[ ]: