How can I fit a function using fmincon?

have data from a movement control experiment in which participants were timed while they performed a task, and given a score (failure or success) based on their performance. As you might expect, we assume participants will make less errors as they have more time to perform the task.
Visualizing the data gives me:
I can fit my desired model to this using cftoolbox, but a least squares fit doesn't make sense for binary data. Just to illustrate:
My attempts to fit the model using fmincon are below. This returns the error "Error using fmincon (line 609) Supplied objective function must return a scalar value."
Could anybody help me change my code to get a fit to the following sample data?
time = [12.16 11.81 12.32 11.87 12.37 12.51 12.63 12.09 11.25
7.73 8.18 9.49 10.29 8.88 9.46 10.12 9.76 9.99 10.08
7.48 7.88 7.81 6.7 7.68 8.05 8.23 7.84 8.52 7.7
6.26 6.12 6.19 6.49 6.25 6.51 6 6.79 5.89 5.93 3.97 4.91 4.78 4.43
3.82 4.72 4.72 4.31 4.81 4.32 3.62 3.71 4.29 3.46 3.9 3.73 4.15
3.92 3.8 3.4 3.7 2.91 2.84 2.7 2.83 2.46 3.19 3.44 2.67 3.49 2.71
3.17 2.97 2.76 2.71 2.88 2.52 2.86 2.83 2.64 2.02 2.37 2.38
2.53 3.03 2.61 2.59 2.59 2.44 2.73 ]
error = [0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 1
0 0 0 0 1 1 1 1 1 1 0 0 0 0 1 1 1 0 1
0 1 0 1 1 0 1 1 0 1 1 1 1 1 1 1 1 1 1
1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1];
%Code:
% initial parameters - a corresponds to params(1), b corresponds to params(2)
a = 3.0;
b = -0.01;
LL = @(params) 1/1+params(1)*(log(time).^params(2));
LL([a b]);
pOpt = fmincon(LL,[a b],[],[]);

 Accepted Answer

Torsten
Torsten on 25 Oct 2018
Edited: Torsten on 25 Oct 2018
I don't understand your LL-function:
1/1+params(1) ?
Shouldn't the "error" array enter LL somewhere ?
Further, you will have to take the sum of squares of your expression such that LL returns one single value, not a vector.

4 Comments

To clarify, the desired function is:
error = 1/1+a*(log(time)^b)
I thought the correct way to formulate this was:
LL = @(params) 1/1+params(1)*(log(time).^params(2))
LL=@(params)sum((1./(1+params(1)*log(time).^params(2))-error).^2)
Thanks so much, this seems to be the solution! If you wouldn't mind, might you be able to help me understand where I was going wrong here?
You have measurements (time(i),error(i)) and you want to fit these data to a function
error_sim = 1/(1+a*log(time)^b)
To this end, you have to minimize the sum "s" of squared differences between measured and simulated data:
s = sum_{i=1}^{i=n} (error_sim(i)-error(i))^2
and that's the objective function to be minimized for fmincon.

Sign in to comment.

More Answers (0)

Categories

Asked:

on 25 Oct 2018

Commented:

on 25 Oct 2018

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!