Second derivative of measured function is PDF of hidden RV

So, the last days I’ve played around with some experimental implementations and, so far, I guess I found something which is (roughly) doing the job. For the moment I’ve dropped the time-dependency of the problem as it just adds complexity - I think it shouldn’t be a problem to add this dimension later once I’ve found a good implementation.

This is the current code of my model:

import pandas as pd
import matplotlib.pyplot as plt
import pymc3 as pm
import theano.tensor as tt
import arviz as az
import numpy as np

# Excerpt of original dataset for a single point in time
data_x = np.array([2000.,  2000.,  3000.,  3000.,  3000.,  3000.,
        3500.,  3500.,  3500.,  3500.,  3600.,  3600.,  3600.,  3600.,
        3700.,  3700.,  3700.,  3700.,  3800.,  3800.,  3800.,  3800.,
        3900.,  3900.,  3900.,  3900.,  4000.,  4000.,  4000.,  4000.,
        4100.,  4100.,  4100.,  4100.,  4200.,  4200.,  4200.,  4200.,
        4300.,  4300.,  4300.,  4300.,  4400.,  4400.,  4400.,  4400.,
        4500.,  4500.,  4500.,  4500.,  4600.,  4600.,  4600.,  4600.,
        4700.,  4700.,  4700.,  4700.,  4800.,  4800.,  4800.,  4800.,
        4900.,  4900.,  4900.,  4900.,  5000.,  5000.,  5000.,  5000.,
        5100.,  5100.,  5100.,  5100.,  5200.,  5200.,  5200.,  5200.,
        5300.,  5300.,  5300.,  5300.,  5400.,  5400.,  5400.,  5400.,
        5500.,  5500.,  5500.,  5500.,  5600.,  5600.,  5600.,  5600.,
        5700.,  5700.,  5700.,  5700.,  5800.,  5800.,  5800.,  5800.,
        5900.,  5900.,  5900.,  5900.,  6000.,  6000.,  6000.,  6000.,
        6100.,  6100.,  6100.,  6100.,  6200.,  6200.,  6200.,  6200.,
        6300.,  6300.,  6300.,  6300.,  6400.,  6400.,  6400.,  6400.,
        6500.,  6500.,  6500.,  6500.,  6600.,  6600.,  6600.,  6600.,
        6700.,  6700.,  6700.,  6700.,  6800.,  6800.,  6800.,  6800.,
        6900.,  6900.,  6900.,  6900.,  7000.,  7000.,  7000.,  7000.,
        7100.,  7100.,  7100.,  7100.,  7200.,  7200.,  7200.,  7200.,
        7300.,  7300.,  7300.,  7300.,  7400.,  7400.,  7400.,  7400.,
        7500.,  7500.,  7500.,  7500.,  7600.,  7600.,  7600.,  7600.,
        7700.,  7700.,  7700.,  7700.,  7800.,  7800.,  7800.,  7800.,
        7900.,  7900.,  7900.,  7900.,  8000.,  8000.,  8000.,  8000.,
        8100.,  8100.,  8100.,  8100.,  8200.,  8200.,  8200.,  8200.,
        8300.,  8300.,  8300.,  8300.,  8400.,  8400.,  8400.,  8400.,
        8500.,  8500.,  8500.,  8500.,  8600.,  8600.,  8600.,  8600.,
        8700.,  8700.,  8700.,  8700.,  8800.,  8800.,  8800.,  8800.,
        8900.,  8900.,  8900.,  8900.,  9000.,  9000.,  9000.,  9000.,
        9050.,  9050.,  9050.,  9050.,  9100.,  9100.,  9100.,  9100.,
        9150.,  9150.,  9150.,  9150.,  9200.,  9200.,  9200.,  9200.,
        9250.,  9250.,  9250.,  9250.,  9300.,  9300.,  9300.,  9300.,
        9350.,  9350.,  9350.,  9350.,  9400.,  9400.,  9400.,  9400.,
        9450.,  9450.,  9450.,  9450.,  9500.,  9500.,  9500.,  9500.,
        9550.,  9550.,  9550.,  9550.,  9600.,  9600.,  9600.,  9600.,
        9650.,  9650.,  9650.,  9650.,  9700.,  9700.,  9700.,  9700.,
        9750.,  9750.,  9750.,  9750.,  9800.,  9800.,  9800.,  9800.,
        9850.,  9850.,  9850.,  9850.,  9900.,  9900.,  9900.,  9900.,
        9950.,  9950.,  9950.,  9950., 10000., 10000., 10000., 10000.,
       10050., 10050., 10050., 10050., 10100., 10100., 10100., 10100.,
       10150., 10150., 10150., 10150., 10200., 10200., 10200., 10200.,
       10250., 10250., 10250., 10250., 10300., 10300., 10300., 10300.,
       10350., 10350., 10350., 10350., 10400., 10400., 10400., 10400.,
       10450., 10450., 10450., 10450., 10500., 10500., 10500., 10500.,
       10550., 10550., 10550., 10550., 10600., 10600., 10600., 10600.,
       10650., 10650., 10650., 10650., 10700., 10700., 10700., 10700.,
       10750., 10750., 10750., 10750., 10800., 10800., 10800., 10800.,
       10850., 10850., 10850., 10850., 10900., 10900., 10900., 10900.,
       10950., 10950., 10950., 10950., 11000., 11000., 11000., 11000.,
       11100., 11100., 11100., 11100., 11200., 11200., 11200., 11200.,
       11250., 11250., 11250., 11250., 11300., 11300., 11300., 11300.,
       11350., 11350., 11350., 11350., 11400., 11400., 11400., 11400.,
       11450., 11450., 11450., 11450., 11500., 11500., 11500., 11500.,
       11550., 11550., 11550., 11550., 11600., 11600., 11600., 11600.,
       11650., 11650., 11650., 11650., 11700., 11700., 11700., 11700.,
       11750., 11750., 11750., 11750., 11800., 11800., 11800., 11800.,
       11850., 11850., 11850., 11850., 11900., 11900., 11900., 11900.,
       11950., 11950., 11950., 11950., 12000., 12000., 12000., 12000.,
       12050., 12050., 12050., 12050., 12100., 12100., 12100., 12100.,
       12150., 12150., 12150., 12150., 12200., 12200., 12200., 12200.,
       12250., 12250., 12250., 12250., 12300., 12300., 12300., 12300.,
       12350., 12350., 12350., 12350., 12400., 12400., 12400., 12400.,
       12450., 12450., 12450., 12450., 12500., 12500., 12500., 12500.,
       12550., 12550., 12550., 12550., 12600., 12600., 12600., 12600.,
       12650., 12650., 12650., 12650., 12700., 12700., 12700., 12700.,
       12750., 12750., 12750., 12750., 12800., 12800., 12800., 12800.,
       12850., 12850., 12850., 12850., 12900., 12900., 12900., 12900.,
       12950., 12950., 12950., 12950., 13000., 13000., 13000., 13000.,
       13050., 13050., 13050., 13050., 13100., 13100., 13100., 13100.,
       13150., 13150., 13150., 13150., 13200., 13200., 13200., 13200.,
       13250., 13250., 13250., 13250., 13300., 13300., 13300., 13300.,
       13350., 13350., 13350., 13350., 13400., 13400., 13400., 13400.,
       13450., 13450., 13450., 13450., 13500., 13500., 13500., 13500.,
       13550., 13550., 13550., 13550., 13600., 13600., 13600., 13600.,
       13650., 13650., 13650., 13650., 13700., 13700., 13700., 13700.,
       13750., 13750., 13750., 13750., 13800., 13800., 13800., 13800.,
       13850., 13850., 13850., 13850., 13900., 13900., 13900., 13900.,
       13950., 13950., 13950., 13950., 14000., 14000., 14000., 14000.,
       14050., 14050., 14050., 14050., 14100., 14100., 14100., 14100.,
       14150., 14150., 14150., 14150., 14200., 14200., 14200., 14200.,
       14250., 14250., 14250., 14250., 14300., 14300., 14300., 14300.,
       14350., 14350., 14350., 14350., 14400., 14400., 14400., 14400.,
       14450., 14450., 14450., 14450., 14500., 14500., 14500., 14500.,
       14600., 14600., 14600., 14600., 14700., 14700., 14700., 14700.,
       14800., 14800., 14800., 14800., 15000., 15000., 15000., 15000.,
       15500., 15500., 15500., 15500., 16000., 16000., 16000., 16000.,
       16500., 16500., 16500., 16500., 17000., 17000., 17000., 17000.,
       17500., 17500., 17500., 17500., 18000., 18000., 18000., 18000.,
       18500., 18500., 18500., 18500., 19000., 19000., 19000., 19000.,
       19500., 19500., 19500., 19500., 20000., 20000., 20000., 20000.,
       21000., 21000., 21000., 21000., 21500., 21500., 21500., 21500.,
       25000., 25000., 25000., 25000.])
data_h = np.array([2.3000e+00, 2.6000e+00, 6.8000e+00,
       6.8000e+00, 7.0500e+00, 6.4500e+00, 9.4500e+00, 9.0000e+00,
       1.0500e+01, 9.3500e+00, 9.7500e+00, 1.1700e+01, 1.0750e+01,
       1.1200e+01, 1.1700e+01, 1.0650e+01, 1.1600e+01, 1.2550e+01,
       1.1750e+01, 1.2800e+01, 1.3500e+01, 1.3850e+01, 1.4150e+01,
       1.5150e+01, 1.4800e+01, 1.2850e+01, 1.4150e+01, 1.6650e+01,
       1.6000e+01, 1.5450e+01, 1.7600e+01, 1.8050e+01, 1.5300e+01,
       1.6900e+01, 1.9050e+01, 1.8400e+01, 1.9750e+01, 1.6750e+01,
       1.9950e+01, 2.0600e+01, 1.8250e+01, 2.1350e+01, 2.1600e+01,
       2.3200e+01, 2.2450e+01, 1.9900e+01, 2.1800e+01, 2.5150e+01,
       2.4100e+01, 2.3300e+01, 2.7150e+01, 2.6350e+01, 2.5200e+01,
       2.3450e+01, 2.6850e+01, 2.8250e+01, 2.5500e+01, 2.9500e+01,
       3.1750e+01, 2.9500e+01, 2.7850e+01, 3.0750e+01, 3.0000e+01,
       3.3000e+01, 3.4250e+01, 3.1250e+01, 3.2750e+01, 3.4000e+01,
       3.7250e+01, 3.5500e+01, 3.5250e+01, 3.6250e+01, 4.0250e+01,
       3.8500e+01, 3.9500e+01, 4.3250e+01, 4.1500e+01, 3.8000e+01,
       4.1250e+01, 4.6750e+01, 4.2500e+01, 4.4750e+01, 4.8250e+01,
       5.0250e+01, 4.6000e+01, 4.4750e+01, 4.9500e+01, 5.1750e+01,
       4.8750e+01, 5.3750e+01, 5.7750e+01, 5.1750e+01, 5.5750e+01,
       5.3250e+01, 5.9750e+01, 6.1750e+01, 5.7250e+01, 5.5500e+01,
       6.0500e+01, 6.1250e+01, 6.3750e+01, 6.6000e+01, 7.0500e+01,
       6.5750e+01, 6.8250e+01, 6.4500e+01, 6.9250e+01, 7.0750e+01,
       7.5250e+01, 7.2750e+01, 7.2750e+01, 7.7250e+01, 7.5250e+01,
       8.0000e+01, 8.5500e+01, 8.0000e+01, 8.3000e+01, 7.8250e+01,
       8.3500e+01, 9.1000e+01, 8.7750e+01, 8.5750e+01, 8.9000e+01,
       9.4000e+01, 9.6500e+01, 9.1250e+01, 9.7250e+01, 1.0275e+02,
       9.5000e+01, 9.9500e+01, 1.0375e+02, 1.0600e+02, 1.0900e+02,
       1.0125e+02, 1.1025e+02, 1.1225e+02, 1.1575e+02, 1.0775e+02,
       1.1475e+02, 1.2275e+02, 1.1750e+02, 1.1925e+02, 1.2625e+02,
       1.2200e+02, 1.2425e+02, 1.3025e+02, 1.2950e+02, 1.3800e+02,
       1.3200e+02, 1.3400e+02, 1.3800e+02, 1.4625e+02, 1.4225e+02,
       1.4000e+02, 1.5500e+02, 1.4625e+02, 1.4825e+02, 1.5075e+02,
       1.5950e+02, 1.5475e+02, 1.5750e+02, 1.6400e+02, 1.7325e+02,
       1.6850e+02, 1.6400e+02, 1.6650e+02, 1.7850e+02, 1.7575e+02,
       1.7375e+02, 1.8325e+02, 1.8375e+02, 1.9375e+02, 1.8875e+02,
       1.8550e+02, 1.9425e+02, 1.9950e+02, 2.0450e+02, 1.9575e+02,
       2.1575e+02, 2.1050e+02, 2.0700e+02, 2.0525e+02, 2.1675e+02,
       2.1850e+02, 2.2200e+02, 2.2750e+02, 2.3550e+02, 2.2875e+02,
       2.4000e+02, 2.2700e+02, 2.4650e+02, 2.4250e+02, 2.5275e+02,
       2.4100e+02, 2.5450e+02, 2.6000e+02, 2.6600e+02, 2.5550e+02,
       2.8000e+02, 2.6750e+02, 2.6900e+02, 2.7350e+02, 2.8150e+02,
       2.8750e+02, 2.8300e+02, 2.9400e+02, 2.9650e+02, 3.0250e+02,
       2.9800e+02, 3.0950e+02, 3.1800e+02, 3.2550e+02, 3.1200e+02,
       3.1350e+02, 3.3400e+02, 3.2900e+02, 3.4150e+02, 3.2800e+02,
       3.5900e+02, 3.5050e+02, 3.4500e+02, 3.4600e+02, 3.6800e+02,
       3.6350e+02, 3.7650e+02, 3.6250e+02, 3.8600e+02, 3.9550e+02,
       3.8200e+02, 3.8100e+02, 3.9600e+02, 3.9100e+02, 3.9000e+02,
       4.0500e+02, 4.1450e+02, 4.0050e+02, 4.0500e+02, 4.0000e+02,
       4.1050e+02, 4.1500e+02, 4.1000e+02, 4.2500e+02, 4.2050e+02,
       4.3500e+02, 4.2500e+02, 4.2000e+02, 4.3050e+02, 4.4550e+02,
       4.3550e+02, 4.3100e+02, 4.4100e+02, 4.4550e+02, 4.5600e+02,
       4.4100e+02, 4.5200e+02, 4.5650e+02, 4.5200e+02, 4.6700e+02,
       4.6750e+02, 4.6300e+02, 4.7800e+02, 4.6300e+02, 4.7850e+02,
       4.7450e+02, 4.7400e+02, 4.8950e+02, 4.8950e+02, 5.0150e+02,
       4.8600e+02, 4.8650e+02, 4.9750e+02, 5.0150e+02, 5.1350e+02,
       4.9750e+02, 5.0900e+02, 5.2550e+02, 5.1350e+02, 5.0950e+02,
       5.2150e+02, 5.3750e+02, 5.2150e+02, 5.2550e+02, 5.3450e+02,
       5.3500e+02, 5.5050e+02, 5.3800e+02, 5.4750e+02, 5.6350e+02,
       5.5100e+02, 5.4650e+02, 5.6050e+02, 5.6400e+02, 5.7700e+02,
       5.6000e+02, 5.7300e+02, 5.9050e+02, 5.7700e+02, 5.7400e+02,
       5.8800e+02, 5.8650e+02, 6.0450e+02, 5.9100e+02, 6.1850e+02,
       6.0150e+02, 6.0450e+02, 6.0200e+02, 6.3300e+02, 6.1600e+02,
       6.1900e+02, 6.1600e+02, 6.4800e+02, 6.3050e+02, 6.3100e+02,
       6.3350e+02, 6.6300e+02, 6.4600e+02, 6.4600e+02, 6.4850e+02,
       6.6050e+02, 6.6100e+02, 6.6350e+02, 6.7850e+02, 6.7650e+02,
       6.9400e+02, 6.7900e+02, 6.7750e+02, 6.9350e+02, 6.9250e+02,
       6.9450e+02, 7.1000e+02, 7.2700e+02, 7.0900e+02, 7.0850e+02,
       7.1100e+02, 7.2750e+02, 7.2600e+02, 7.4400e+02, 7.2550e+02,
       7.4450e+02, 7.4250e+02, 7.4350e+02, 7.6100e+02, 7.6000e+02,
       7.6200e+02, 7.7850e+02, 7.6100e+02, 7.7900e+02, 7.9650e+02,
       7.7950e+02, 7.7800e+02, 7.9600e+02, 7.9750e+02, 7.9800e+02,
       8.1450e+02, 8.1550e+02, 8.3350e+02, 8.1600e+02, 8.1500e+02,
       8.5300e+02, 8.3400e+02, 8.3500e+02, 8.3500e+02, 8.5500e+02,
       8.5450e+02, 8.7250e+02, 8.5300e+02, 8.9300e+02, 8.7400e+02,
       8.7300e+02, 8.7500e+02, 8.9350e+02, 8.9500e+02, 8.9400e+02,
       9.1300e+02, 9.1450e+02, 9.3400e+02, 9.1450e+02, 9.1600e+02,
       9.3550e+02, 9.5550e+02, 9.3600e+02, 9.3750e+02, 9.5950e+02,
       9.5700e+02, 9.7750e+02, 9.5750e+02, 9.7900e+02, 9.9950e+02,
       9.8150e+02, 9.7950e+02, 1.0280e+03, 1.0255e+03, 1.0240e+03,
       1.0460e+03, 1.0710e+03, 1.0940e+03, 1.0740e+03, 1.0760e+03,
       1.0955e+03, 1.0995e+03, 1.1190e+03, 1.0995e+03, 1.1210e+03,
       1.1270e+03, 1.1245e+03, 1.1445e+03, 1.1505e+03, 1.1455e+03,
       1.1505e+03, 1.1705e+03, 1.1765e+03, 1.1970e+03, 1.1715e+03,
       1.1790e+03, 1.2060e+03, 1.1975e+03, 1.2035e+03, 1.2240e+03,
       1.2315e+03, 1.2510e+03, 1.2330e+03, 1.2250e+03, 1.2610e+03,
       1.2610e+03, 1.2790e+03, 1.2525e+03, 1.2895e+03, 1.2805e+03,
       1.2900e+03, 1.3075e+03, 1.3190e+03, 1.3085e+03, 1.3365e+03,
       1.3180e+03, 1.3670e+03, 1.3480e+03, 1.3375e+03, 1.3480e+03,
       1.3670e+03, 1.3790e+03, 1.3960e+03, 1.3780e+03, 1.4270e+03,
       1.4095e+03, 1.4090e+03, 1.3975e+03, 1.4410e+03, 1.4295e+03,
       1.4580e+03, 1.4410e+03, 1.4730e+03, 1.4910e+03, 1.4595e+03,
       1.4730e+03, 1.5050e+03, 1.5055e+03, 1.4915e+03, 1.5220e+03,
       1.5255e+03, 1.5380e+03, 1.5385e+03, 1.5560e+03, 1.5890e+03,
       1.5585e+03, 1.5720e+03, 1.5720e+03, 1.6230e+03, 1.6060e+03,
       1.5915e+03, 1.6060e+03, 1.6260e+03, 1.6410e+03, 1.6570e+03,
       1.6410e+03, 1.6760e+03, 1.6920e+03, 1.6605e+03, 1.6760e+03,
       1.7280e+03, 1.7120e+03, 1.7120e+03, 1.6955e+03, 1.7640e+03,
       1.7480e+03, 1.7490e+03, 1.7320e+03, 1.8010e+03, 1.7675e+03,
       1.7860e+03, 1.7850e+03, 1.8230e+03, 1.8390e+03, 1.8045e+03,
       1.8230e+03, 1.8760e+03, 1.8430e+03, 1.8630e+03, 1.8610e+03,
       1.9150e+03, 1.9000e+03, 1.9000e+03, 1.8810e+03, 1.9390e+03,
       1.9195e+03, 1.9390e+03, 1.9540e+03, 1.9930e+03, 1.9790e+03,
       1.9585e+03, 1.9805e+03, 2.0205e+03, 2.0330e+03, 2.0180e+03,
       1.9980e+03, 2.0600e+03, 2.0380e+03, 2.0730e+03, 2.0610e+03,
       2.1140e+03, 2.1020e+03, 2.0785e+03, 2.1010e+03, 2.1420e+03,
       2.1550e+03, 2.1420e+03, 2.1195e+03, 2.1610e+03, 2.1840e+03,
       2.1860e+03, 2.1970e+03, 2.2030e+03, 2.2270e+03, 2.2390e+03,
       2.2275e+03, 2.2810e+03, 2.2450e+03, 2.2690e+03, 2.2705e+03,
       2.2880e+03, 2.3140e+03, 2.3130e+03, 2.3240e+03, 2.3310e+03,
       2.3560e+03, 2.3580e+03, 2.3670e+03, 2.4020e+03, 2.4110e+03,
       2.3740e+03, 2.4015e+03, 2.4440e+03, 2.4445e+03, 2.4180e+03,
       2.4550e+03, 2.4890e+03, 2.4990e+03, 2.4895e+03, 2.4615e+03,
       2.5340e+03, 2.5065e+03, 2.5440e+03, 2.5345e+03, 2.5810e+03,
       2.5515e+03, 2.5890e+03, 2.5795e+03, 2.5965e+03, 2.6345e+03,
       2.6250e+03, 2.6245e+03, 2.6715e+03, 2.6810e+03, 2.6425e+03,
       2.6710e+03, 2.6875e+03, 2.7250e+03, 2.7170e+03, 2.7150e+03,
       2.7630e+03, 2.7315e+03, 2.7620e+03, 2.7710e+03, 2.7780e+03,
       2.8100e+03, 2.8080e+03, 2.8175e+03, 2.8645e+03, 2.8550e+03,
       2.8235e+03, 2.8570e+03, 2.8705e+03, 2.9040e+03, 2.9020e+03,
       2.9120e+03, 2.9175e+03, 2.9490e+03, 2.9595e+03, 2.9510e+03,
       3.0080e+03, 3.0000e+03, 2.9640e+03, 2.9970e+03, 3.0440e+03,
       3.0530e+03, 3.0460e+03, 3.0115e+03, 3.0940e+03, 3.0920e+03,
       3.0605e+03, 3.1010e+03, 3.1065e+03, 3.1420e+03, 3.1485e+03,
       3.1400e+03, 3.1545e+03, 3.1900e+03, 3.1955e+03, 3.1880e+03,
       3.2025e+03, 3.2380e+03, 3.2360e+03, 3.2450e+03, 3.2505e+03,
       3.2860e+03, 3.2930e+03, 3.2850e+03, 3.3410e+03, 3.3350e+03,
       3.3330e+03, 3.2985e+03, 3.3475e+03, 3.3830e+03, 3.3815e+03,
       3.3910e+03, 3.4380e+03, 3.4305e+03, 3.3955e+03, 3.4320e+03,
       3.4790e+03, 3.4880e+03, 3.4810e+03, 3.4445e+03, 3.5350e+03,
       3.5280e+03, 3.5290e+03, 3.4925e+03, 3.5840e+03, 3.5440e+03,
       3.5850e+03, 3.5805e+03, 3.6350e+03, 3.6295e+03, 3.5935e+03,
       3.6335e+03, 3.6755e+03, 3.6825e+03, 3.6425e+03, 3.6820e+03,
       3.7350e+03, 3.6915e+03, 3.7330e+03, 3.7245e+03, 3.7905e+03,
       3.8250e+03, 3.8290e+03, 3.8290e+03, 3.9285e+03, 3.8880e+03,
       3.9215e+03, 3.9290e+03, 4.0200e+03, 4.0265e+03, 3.9860e+03,
       4.0260e+03, 4.2250e+03, 4.2265e+03, 4.1845e+03, 4.2195e+03,
       4.7215e+03, 4.7160e+03, 4.6805e+03, 4.7235e+03, 5.2185e+03,
       5.2210e+03, 5.1800e+03, 5.2220e+03, 5.7230e+03, 5.7215e+03,
       5.6800e+03, 5.7180e+03, 6.1815e+03, 6.2155e+03, 6.2225e+03,
       6.2245e+03, 6.7250e+03, 6.7250e+03, 6.7220e+03, 6.6870e+03,
       7.2275e+03, 7.2210e+03, 7.1885e+03, 7.2260e+03, 7.7260e+03,
       7.7205e+03, 7.6890e+03, 7.7290e+03, 8.2295e+03, 8.2205e+03,
       8.2270e+03, 8.1870e+03, 8.7280e+03, 8.7210e+03, 8.6900e+03,
       8.7340e+03, 9.2320e+03, 9.1910e+03, 9.2290e+03, 9.2250e+03,
       1.0232e+04, 1.0193e+04, 1.0224e+04, 1.0238e+04, 1.0693e+04,
       1.0736e+04, 1.0726e+04, 1.0740e+04, 1.4203e+04, 1.4240e+04,
       1.4245e+04, 1.4245e+04])
data_s = np.unique(data_x)

def diff(x):
    dx = np.zeros_like(x,dtype='float')
    dx[:-1] += 0.5*np.diff(x)
    dx[1:] += 0.5*np.diff(x)
    dx[0] *=2
    dx[-1] *=2
    return dx

with pm.Model() as model:
    # Hyperpriors
    mu_s = pm.Cauchy('mu_s',alpha=12000,beta=1000)
    sigma_s = pm.HalfCauchy('sigma_s',beta=10000)
    sigma = pm.HalfNormal('sigma',sigma=1)
    # Hidden RV
    s = pm.Normal('s',mu=mu_s,sigma=sigma_s)
    ps = pm.Deterministic('ps',tt.exp(s.distribution.logp(data_s)))
    h = pm.Deterministic('h',tt.sum(np.maximum(data_x[None,:] - data_s[:,None],0) * diff(data_s)[:,None] * ps[:,None],axis=0))
    #Likelihood
    y = pm.Normal('y',mu=h,sigma=sigma,observed=data_h)
    trace = pm.sample(init='advi+adapt_diag')
    posterior = pm.sample_posterior_predictive(trace)
    idata = az.from_pymc3(trace=trace, posterior_predictive=posterior)

az.plot_trace(idata,var_names=['~ps','~h'])
plt.show()

fig, ax = plt.subplots(3,1,sharex=True,figsize=(16,16))
pm.gp.util.plot_gp_dist(ax[0],trace['ps'],data_s,palette='Blues',plot_samples=True)
ax[0].set_ylabel('ps')
ax[0].grid()
pm.gp.util.plot_gp_dist(ax[1],posterior['y'],data_x,palette='Reds')
ax[1].plot(data_x,data_h,'xk')
ax[1].set_ylabel('y')
ax[1].grid()
pm.gp.util.plot_gp_dist(ax[2],posterior['y'] - np.quantile(posterior['y'],0.5,0),data_x,palette='Reds',plot_samples=False)
ax[2].plot(data_x,(data_h - np.quantile(posterior['y'],0.5,0)),'xk')
ax[2].set_ylabel('y - y_median')
ax[2].set_xlabel('s')
ax[2].grid()
plt.show()

The results are looking reasonable for the moment - However, I’m still quite unsure about these two points:

  1. ps = pm.Deterministic('ps',tt.exp(s.distribution.logp(data_s))): For my understanding I’m evaluating here the PDF of the prior distribution of s, not of the actual distribution of s during sampling. What if I have also some measurements for s in my model - would this line still allow correct inference?
  2. h = pm.Deterministic('h',tt.sum(np.maximum(data_x[None,:]-data_s[:,None],0)*diff(data_s)[:,None]*ps[:,None],axis=0)): This is some quick & dirty approximation of the integral constraint. However, I also found this custom integral operator which should perform better - but so far I was not able to get it running in my model… Or are there any build in functions of theano which allow for symbolic integration?