I'm trying to minimize a khi-square using scipy.optimize.fmin. Here is my function, (which calls an other simulation function spotdiffusion). The returned value (chi) is an array of two khi values (one for congruent condition, the other for incongruent condition) which I try to minimize:
def chis (a, ter , v , sda , rd):
ncond=1
ntrials = 1000
observed_data = np.array ([ [0.9995835, 24.0, 329.5, 357.9, 370.5, 391.5, 457.6, 0.0004164931, 0, 0],#congruent cond
[0.6953498, 16, 409.5, 450.5, 481, 529, 546 , 0.3046502 , 7 ,350]])#incongruent cond
q_probs=np.array ([.1,.2,.2,.2,.2,.1])
b_probs=np.array([0.501,0.499])
cond = np.arange (0, ncond)
chi = []
for g in cond:
if(g==0):
fl= 1.0 #flankers congruent with target
if(g==1):
fl= -1.0 # incongruent
#########
simTRcorrect, simTRerror, simprobc, simprobe = spotdiffusion (a ,ter ,v, sda,rd ,fl, ntrials = 1000)
#########
top_data = observed_data[g,0]*q_probs
bot_data=observed_data[g,7]*b_probs
pt1 = (len (simTRcorrect [simTRcorrect < observed_data[g, 2]])) /ntrials
pt2 = (len (simTRcorrect [(simTRcorrect < observed_data[g, 3]) & (simTRcorrect >= observed_data[g, 2])])) /ntrials
pt3 = (len (simTRcorrect [(simTRcorrect < observed_data[g, 4]) & (simTRcorrect >= observed_data[g, 3])])) /ntrials
pt4 = (len (simTRcorrect [(simTRcorrect < observed_data[g, 5]) & (simTRcorrect >= observed_data[g, 4])])) /ntrials
pt5 = (len (simTRcorrect [(simTRcorrect < observed_data[g, 6]) & (simTRcorrect >= observed_data[g, 5])])) /ntrials
pt6=(len (simTRcorrect [simTRcorrect > observed_data[g, 6]])) /ntrials
pred_p= np.array ([pt1,pt2,pt3,pt4,pt5,pt6])
top_chi_array = (np.square (top_data-pred_p))/ (pred_p+ 0.001)
top_chi = np.sum (top_chi_array)
pt1 = (len (simTRerror[simTRerror < observed_data[g, 9]])) /ntrials
pt2 = (len (simTRerror[simTRerror >= observed_data[g, 9]])) /ntrials
pred_p=np.array ([pt1,pt2])
bot_chi_array = (np.square (bot_data-pred_p)) / (pred_p+ 0.001)
bot_chi= np.sum (bot_chi_array)
totchi=(bot_chi+top_chi)*(observed_data[g,1]+ observed_data[g,8])
chi.append (totchi)
chi = np.array (chi)
return chi
Here is the fitting procedure:
x0 = np.array ([0.11, 0.25,0.35,1.7,0.017]) ####for initial guess
xopt = fmin (chis(a, ter , v , sda , rd), x0, maxiter=300)
I've got an error that I don't understand:
Traceback (most recent call last):
File "<ipython console>", line 1, in <module>
File "C:\Python27\lib\site-packages\spyderlib\widgets\externalshell\startup.py", line 128, in runfile
execfile(filename, glbs)
File "C:\Users\mathieu\Desktop\modeling\spotlight diffusion model\fitting_spotlight.py", line 245, in <module>
xopt = fmin (chis(a, ter , v , sda , rd), x0, maxiter=300)
File "C:\Python27\lib\site-packages\scipy\optimize\optimize.py", line 257, in fmin
fsim[0] = func(x0)
File "C:\Python27\lib\site-packages\scipy\optimize\optimize.py", line 176, in function_wrapper
return function(x, *args)
TypeError: 'numpy.float64' object is not callable
Does anyone have an idea of what's going wrong?
Cheers, Mat