About Pymc3 fit in log scale

I have a question about Pymc3 fit the equation:

S = A* f**(-a)+C

and I have known : log10(A) obeys Uniform(-10,10)
log10(c) obeys Uniform (-20,10)
a abeys Uniform (1,4)

And likelihood just a normal distribution,

How can I use Pymc3 determine the A ,a ,C (and I have the data about S, and f , like S=[1,2,3…], f=[1,2,3…])

Thanks!

I’m assuming by “obey” you’re stating prior distributions on a, A, and C. The code below should work:

import pymc3 as pm

with pm.Model() as model:
    a = pm.Uniform("a", lower=1, upper=4)
    log_A = pm.Uniform("log_A", lower=-10, 10)
    log_C = pm.Uniform("log_C", lower=-20, 10)

    A = pm.Deterministic("A", pm.math.exp(log_A))
    C = pm.Deterministic("C", pm.math.exp(log_C))

    mean_S = pm.Deterministic("mean_S", A*(f**(-a)) + C)
    
    # Either fix the standard deviation of noise or put a prior on it, perhaps with pm.Exponential    
    sigma = 2.0    

    likelihood = pm.Normal("likelihood", mu=mean_S, sigma=sigma, observed=S)

    # Sample the posterior
    trace = pm.sample()

Hi @StarryNight, I am maybe wrong, but it looks like from the notation that you are fitting a power spectrum/periodogram (S) as a function of frequency (f), with a power law model. If the power spectrum has come from the application of a Discrete Fourier Transform, then the likelihood is not a Normal. It should be chi-squared.

If I am wrong, then feel free to ignore me :grin:

Happy to provide further information if I am right though. You can send me a direct message.

2 Likes

Oh Yeah! It is power spactrum that Iam doing! emmm , Would you like to share your suggestions further?
Best is your code, use pymc3(hahaha)

Becouse the data(list(S) is very small, I have to take logarithm, but I have no idea how to use pymc3 to fit well