Hi,

I’m having difficulty getting pymc3 to work when inverting the outputs of an RTM. Please could someone offer me some advice?

Ideally I’d like to take a time series of reflectance values and get a time series of associated crop traits - by using the prosail model in combination with a state-space time series model and bayesian model.

```
import numpy as np
import pandas as pd
import pymc3 as pm
import theano.tensor as tt
import arviz as az
import prosail
from theano.compile.ops import as_op
# Preprocessing: normalize the reflectance data reflectance has shape (,12)
reflectance_data_normalized = (reflectance - reflectance.mean()) / reflectance.std()
@as_op(itypes=[tt.dscalar, tt.dscalar, tt.dscalar, tt.dscalar, tt.dscalar, tt.dscalar], otypes=[tt.dvector])
def prosail_model(n, cab, car, cbrown, cw, cm):
# ProSail model with parameters: n, cab, car, cbrown, cw, cm
# Returns simulated reflectances
reflectances = []
reflectance = prosail.run_prosail(n, cab, car, cbrown, cw, cm, w,
lidfa=-1.0, hspot=0.01, tts=30., tto=10., psi=0., factor='SDR', rsoil=0.5, psoil=0.5, prospect_version='D')
return reflectances
# Model block
with pm.Model() as model:
# Priors for ProSail parameters
n_prior = pm.Uniform("n", lower=0.0, upper=1.0)
cab_prior = pm.Uniform("cab", lower=0.0, upper=100.0)
car_prior = pm.Uniform("car", lower=0.0, upper=100.0)
cbrown_prior = pm.Uniform("cbrown", lower=0.0, upper=100.0)
cw_prior = pm.Uniform("cw", lower=0.0, upper=0.5)
cm_prior = pm.Uniform("cm", lower=0.0, upper=0.5)
# Combine ProSail parameters
prosail_prior = tt.stack([n_prior, cab_prior, car_prior, cbrown_prior, cw_prior, cm_prior], axis=-1)
# Calculate ProSail model output for each time step
prosail_output = pm.Deterministic("prosail_output", calculate_prosail(prosail_prior))
# Likelihood - assuming normally distributed noise
sigma_obs = pm.HalfNormal("sigma_obs", sigma=0.1)
obs = pm.Normal("obs", mu=prosail_output, sigma=sigma_obs, observed=reflectance_data_normalized)
# Sample
trace = pm.sample(2000, tune=1000, target_accept=0.9)
# Plot traces
az.plot_trace(trace)
```

My error is “TypeError: Expected an array-like object, but found a Variable: maybe you are trying to call a function on a (possibly shared) variable instead of a numeric array?” because I am struggling to get the prosail scipy functions to cooperate with pymc3.