Introduction
We needed to estimate a set of parameters and their errors for a nonlinear curve fit of cellular conductance data. The conductance was a function of voltage and was modeled as a Boltzmann term, an exponential term and a constant::
g = p3/(1+e((v-p1)/p2)) + p5*e((v-45)/p6) + p4
Where g and v are the input data, with v is in millivolts, and p1-p6 are the desired parameters.
A program was produced to:
The program
%Program for Matt Gruhn
%Written by Bruce Land, BRL4@cornell.edu
%May 20, 2004
%===================
%curve fit of 6 parameter conductance function of voltage
%Formula from Matt:
%g= (m3/((1+exp((m0-m1)/m2))^(1)))+(m4)+(m5*exp((m0-45)/m6));
%need to get parameters and their error range
%--Then separately plot the "boltzmann" and exponential parts separately
%===================
clear all
%total fit
figure(1)
clf
%part fit
figure(2)
clf
%parameter histograms
figure(3)
clf
%========================================================
%START settable inputs
%========================================================
%data set 1 from Matt-- cell f
%the voltages
x=[-30.3896
-25.2314
-20.0655
-14.9218
-9.82205
-4.71594
0.380856
5.53925
10.749
15.8878
21.0423
26.154
31.3026
36.3964
41.4244
46.3951
];
%the measured conductances
y=[0.01428535
0.032721504
0.06306213
0.099658404
0.134567811
0.162306115
0.181366575
0.196532089
0.20765796
0.218294045
0.22529785
0.235617098
0.250215255
0.268659046
0.294750456
0.331398216
];
%estimate of error in conductance measurement
%Currently set to 2%
dy = y*0.02;
%formula converted to
%The inline version
func = inline('p(3)./(1+exp((x-p(1))/p(2))) + p(5)*exp((x-45)/p(6)) + p(4)','p','x');
%initial parameter guess
p0 = [-10 -7 -0.2 -.01 0.2 8 ];
%To detect the sensitivity of the fit to starting parameter guess,
%the fit is run a number of times.
%each fit is plotted and each parameter plotted as a histogram
Nrepeat=100;
%each parameter is varied by a normal distribution with
%mean equal to the starting guess and std.dev. equal to
%sd*mean
sd = 0.3;
%histogram zoom factor (how many std dev to show)
zfactor = 2;
%parameter outlier cuttoff: lowest and highest N estimates are removed
outcut=10;
%========================================================
%END settable inputs
%========================================================
%list of all parameter outputs to use in histogram
pList=zeros(Nrepeat,6);
for rep =1:Nrepeat
rep
%form the new randomized start vector
p = [p0(1)*(1+sd*randn), p0(2)*(1+sd*randn), p0(3)*(1+sd*randn),...
p0(4)*(1+sd*randn), p0(5)*(1+sd*randn), p0(6)*(1+sd*randn)];
%do the fit
[p,r,j] = nlinfit(x,y,func,p);
%copy fit to list
pList(rep,:) = p';
%get parameter errors
c95 = nlparci(p,r,j);
%conductance errors
[yp, ci] = nlpredci(func,x,p,r,j);
%plot the fit
figure(1)
errorbar(x,func(p,x),ci,ci,'b-');
hold on
errorbar(x,y,dy,dy,'ro')
%plot the separated fits
figure(2)
subplot(2,1,1)
hold on
errorbar(x, y-func(p,x)+ p(5)*exp((x-45)/p(6)),dy,dy,'rx')
%plot(x, (y-func(p,x)+ p(5)*exp((x-45)/p(6))),'ro')
errorbar(x, p(5)*exp((x-45)/p(6)), 2*ci, 2*ci,'bx-')
title('Exponential fit')
subplot(2,1,2)
hold on
%plot(x, (y-func(p,x)+ p(3)./(1+exp((x-p(1))/p(2)))),'ro')
errorbar(x, y-func(p,x)+ p(3)./(1+exp((x-p(1))/p(2))),dy,dy,'rx')
errorbar(x, p(3)./(1+exp((x-p(1))/p(2))), 2*ci, 2*ci,'bx-')
title('Boltzmann fit')
%drawnow
end
figure(3)
%plot and print parameter table
fprintf('\r\rFit parameters and 95percent confidence range\r')
for i=1:6
subplot(6,1,i)
lowerLimit = mean(pList(:,i))-zfactor*std(pList(:,i));
upperLimit = mean(pList(:,i))+zfactor*std(pList(:,i));
hist(pList(:,i),linspace(lowerLimit,upperLimit,30))
%
fprintf('%7.3f\t +/- %7.3f \r',...
mean(pList(:,i)),...
max(2*std(pList(:,i)),mean(pList(:,i))-c95(i,1)));
end
fprintf('\r\rFit parameters omitting outliers\r')
for i=1:6
%get rid of outliers
pup = sort(pList(:,i));
pup = pup(outcut:end-outcut);
%print again
fprintf('%7.3f\t +/- %7.3f \r',...
mean(pup),...
max(2*std(pup),mean(pup)-c95(i,1)));
pbest(i)=mean(pup);
end
%print conductance table
%based on best parameters
v = [-30:5:45];
clear yp ci
[yp,ci] = nlpredci(func,x,pbest,r,j);
fprintf('\rVolt \t Total g\t Boltz\t Exp \r')
for i=1:length(v)
fprintf('%7.3f\t%7.3f\t%7.3f\t%7.3f\r',...
v(i),...
yp(i),...
pbest(3)./(1+exp((v(i)-pbest(1))/pbest(2))),...
pbest(5)*exp((v(i)-45)/pbest(6)));
end
Typical output
There is graphical and text output from this program. Each figure represents 100 curve fits to the same data. The first figure is a plot of the total curve fit, while figure 2 are the components of the curve fit. Figure 3 are the histograms of 100 different fits to the same data. Also shown are the raw (all sets) parameter means and the the selected (removing outliers). Note the outliers in each figure, and the strong central tendency of the parameter estimates. Finally the program prints a table of voltages and the fit values of total conductance, Boltzmann part, and exponential part.


Fit parameters and 95percent confidence range -15.394 +/- 0.611 -7.951 +/- 1.457 0.219 +/- 0.041 -0.016 +/- 0.019 0.115 +/- 0.006 14.805 +/- 1.461 Fit parameters omitting outliers -15.391 +/- 0.614 -8.098 +/- 0.583 0.223 +/- 0.014 -0.018 +/- 0.008 0.115 +/- 0.006 14.713 +/- 1.370 Volt Total g Boltz Exp -30.000 0.013 0.032 0.001 -25.000 0.034 0.052 0.001 -20.000 0.064 0.081 0.001 -15.000 0.099 0.114 0.002 -10.000 0.133 0.147 0.003 -5.000 0.162 0.175 0.004 0.000 0.183 0.194 0.005 5.000 0.197 0.206 0.008 10.000 0.208 0.214 0.011 15.000 0.217 0.218 0.015 20.000 0.225 0.220 0.021 25.000 0.236 0.222 0.029 30.000 0.250 0.222 0.041 35.000 0.269 0.223 0.058 40.000 0.295 0.223 0.082 45.000 0.331 0.223 0.115
Revision to eliminate constant term
The fit equation was modified to
g = p3/(1+e((v-p1)/p2)) + p4*e((v-45)/p5)
which eliminates the constant term. For some parameter sets, particularly where the total curvature of the data is small, the constant term tended to make the fit unstable. The convergence criteria were more carefully monitored to make sure that the overall fit was reasonable.
Reference
Gruhn M, Guckenheimer J, Land BR , Harris-Warrick R (2005)
Dopamine modulation of two delayed rectifier potassium currents in a small neural network, Journal of Neurophysiology, 94: 2888-2900 (pdf)