I’m playing around with Turing.jl for the first time and am trying to infer my weight from a sequence of noisy observations. The reason I’m looking at MCMC is I want to experiment with different noise models and not only use a Kalman filter.
My problem is I can’t figure out how to tell Turing that my observation is
obs = true_weight + gaussian + exponential
. I tried the code below
using Turing
weight = 75 .+ cumsum(0.2randn(20)) # Generate testdata
N = length(weight)
@model weightfilter(y) = begin
N = length(y)
shock = Vector{Real}(undef,N-1) # noise vector
state = Vector{Real}(undef,N) # The true weight state
for i = 1:N-1
shock[i] ~ Exponential(.5) # Ate before etc.
# noise[i] ~ Normal(0, 0.2) # Hydration level etc.
end
state[1] ~ Normal(77, 4) # Initial state
for n in 2:N
state[n] ~ Normal(state[n-1], .2) # The state drifts normally
stateshock = state[n] + shock[n-1] # The measurement is corrupted with exponential noise
y[n] ~ Normal(stateshock, 0.2) # Measurement is also corrupted with gaussian noise
end
end;
iterations = 500
chain = sample(weightfilter(weight), SMC(iterations));
but it does not seem to produce any reasonable results. I would ideally like to set the initial condition of state
to the observations to make the sampling converge faster, but that does not seem to be an available option.
Any input on how to accomplish this would be greatly appreciated