library("spectralmc")
# get logprior,
# syntax: lwidth = prior.Gamma(shape, rate) means that lwidth has gamma prior with given shape and rate
logprior <- LogPrior(
amp = prior.Positive(),
lwidth = prior.Gamma(1.01, 0.01), #shape rate
gwidth = prior.Gamma(1.01, 0.01), #shape rate
pos = prior.Unif(0, 1000), # min, max
a = prior.Norm(0, 0.00001), # mean, sd
b = prior.Unif(-1000, 1000)
)
proposal <- Proposal(
amp = prop.Norm(0.005), #sd
lwidth = prop.Norm(0.008),
gwidth = prop.Norm(0.008), # can also use prop.Unif(radius) for uniform proposal
pos = prop.Norm(0.006),
a = prop.Norm(0.00000005),
b = prop.Norm(0.0002) #b = prop.Unif(0.02)
)
fit_kp <- 3 # number of peaks to fit
noise_sigma <- 0.001 # noise_sigma passed to likelihood
signal_model <- voigt.model # which signal to fit (could also be pseudovoigt or GoM)
# get synthetic data
data <- data.synthetic.stormyclouds(seed = 2021, kp = 3, noise = 0.001)
x <- data$x
y <- data$y
posterior <- Posterior(Loglikeli(signal_model, noise_sigma = noise_sigma), logprior)
start_params <- initial.fit.EM(x, y, fit_kp, seed=2021)
|================================================================================| 100% elap: 0s eta: 0s
res <- chains.mhmc(x, y, start_params, posterior, proposal, iter = 20000, print_bar = FALSE)
|================================================================================| 100% elap: 16s eta: 0s
Interactive plot to see fitting process (burn-in of chain): (Not very interesting if EM start is used.)
plt.fit.chain.interactive(x, y, res$samples, signal_model, step_width = 1000)
Double click on legend to zoom to trace.
plt.traceplot(res$samples, "pos")
plt.traceplot(res$samples, "amp")
plt.traceplot(res$samples, "lwidth")
plt.traceplot(res$samples, "gwidth")
plt.traceplot(res$samples, "a")
plt.traceplot(res$samples, "b")