TypeError:logistic()缺少1个必需的位置参数:' params'

时间:2017-12-12 18:35:06

标签: python-3.x jupyter-notebook ode mcmc

我的任务是使用MCMC将ODE方程模型拟合到数据中,但不能超越错误:

TypeError                                 Traceback (most recent call last)
<ipython-input-21-10d0a714b5f4> in <module>()
   26         proposed[j] = proposed[j] + np.random.normal(0,propsigma[j])
   27         if (proposed[j]>0): # automatically reject moves if proposed parameter <=0
---> 28             alpha = np.exp(logistic_loglik (proposed,time,ExRatio,sig)-logistic_loglik(par_out[i-1,],time,ExRatio,sig))
 29             u = np.random.rand()
 30             if (u < alpha):

<ipython-input-21-10d0a714b5f4> in logistic_loglik(params, t, data, sig)
    3 # set up a function to return the log likelihood
    4 def logistic_loglik(params,t,data,sig):
--> 5     return sum(norm.logpdf(logistic(params,t),data,sig))
    6 
    7 # set standard deviations to be 10% of the population values

TypeError: logistic() missing 1 required positional argument: 'params'

问题出在这些方面:

def logistic_loglik(params,t,data,sig):
    return sum(norm.logpdf(logistic(params,t),data,sig))

这些行的功能设置为返回对数似然的函数,显然存在逻辑模型。

据我所知,问题在于&#39; params&#39;函数没有调用,但我不确定如何解决这个问题的相对初学者。

下面的其余代码是添加上下文。

import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import odeint

%matplotlib inline

def logistic(x,t,params):    
    S, R, A = x
    r, Nmax, delta_s, beta, gamma, delta_r, delta_a, Emax, H, MICs, MICr = params
N = S + R
E_s = 1 - (Emax * A**H)/(MICs**H + A**H)
E_r = 1- (Emax * A**H)/(MICr**H + A**H)

derivs = [r * (1 - N / Nmax ) * E_s * S - delta_s * S - ((beta * S * R)/N), 
         r * (1 - gamma) * (1 - N/Nmax) * E_r * R  - delta_r * R + ((beta * S * R)/N), - delta_a * A]


return derivs

r = 0.5
Nmax = 10**7
delta_s = 0.025
beta = 10**-2
gamma = 0.5
delta_r = 0.025
delta_a = 0.003
Emax = 2
H = 2
MICs = 8
MICr = 2000

[r, Nmax, delta_s, beta, gamma, delta_r, delta_a, Emax, H, MICs, MICr] = params
S = 9 * 10**6
R = 10**5
A = 5.6
x0 = [S, R, A]

maxt = 2000
tstep = 1
t = np.arange(0,maxt,tstep)

def logistic_resid(params,t,data):
    return logistic(params,t)-data

logistic_out = odeint(logistic, x0, t, args=(params,))

time = np.array([0, 168, 336, 504, 672, 840, 1008, 1176, 1344, 1512, 1680, 1848, 2016, 2184, 2352, 2520, 2688, 2856])
ExRatio = np.array([2, 27, 43, 36, 39, 32, 27, 22, 13, 10, 14, 14, 4, 4, 7, 3, 3, 1])
ratio = 100* logistic_out[:,1]/(logistic_out[:,0]+logistic_out[:,1])
plt.plot(t,ratio)
plt.plot(time,ExRatio,'h')
xlabel('Position')
ylabel('Pollution')

新细胞

from scipy.stats import norm

# set up a function to return the log likelihood
def logistic_loglik(params,t,data,sig):
    return sum(norm.logpdf(logistic(params,t),data,sig))

# set standard deviations to be 10% of the population values
sig = ExRatio/10

# parameters for the MCMC
reps = 50000
nparams = 3

# output matrix
par_out = np.ones(shape=(reps,nparams))
# acceptance 
accept = np.zeros(shape=(reps,nparams))
# proposal standard deviations. These have been pre-optimized.
propsigma = [0.05,20,5]

for i in range(1,reps):
    # make a copy of previous parameters
    par_out[i,] = par_out[i-1,]
    for j in range(npars):
        proposed = np.copy(par_out[i,:]) # we need to make a copy so that rejected moves don't affect the original matrix
    proposed[j] = proposed[j] + np.random.normal(0,propsigma[j])
    if (proposed[j]>0): # automatically reject moves if proposed parameter <=0 
        alpha = np.exp(logistic_loglik(proposed,time,ExRatio,sig)-logistic_loglik(par_out[i-1,],time,ExRatio,sig))
        u = np.random.rand()
        if (u < alpha):
            par_out[i,j] = proposed[j]
            accept[i,j] = 1

#print(sum(accept[range(101,reps),:])/(reps-100))


#plt.plot(par_out[:,0])
#plt.plot(par_out[range(101,reps),0])
#plt.plot(par_out[:,0],par_out[:,2])
plt.hist(par_out[range(101,reps),0],50)
print('\n')
a=np.mean(par_out[range(101,reps),0])

这是我在这里的第一个问题,所以如果我留下任何答案所需的信息,请告知。

任何帮助都会非常感激

1 个答案:

答案 0 :(得分:1)

您的功能如下所示:

def logistic(x,t,params)

它需要参数。但你只打电话给两个人:

def logistic_loglik(params,t,data,sig):
    return sum(norm.logpdf(logistic(params,t),data,sig))

将其更改为:

def logistic_loglik(params,t,data,sig):
    return sum(norm.logpdf(logistic(data, t, params), sig))