Who we are?
We have been developing and distributing curve-fitting software for companies and academia since 1988.
Why should you use BestCurvFit?
Several good reasons why BestCurvFit is the best choice for analyzing models to experimental data. It's one of the best, easiest to use, and most economical MS Windows software for curve-fitting analysis. Just enter the data and model in a text file, open the file in the software, and one click of the mouse produces curve-fitting statistics to determine the best-fit model. Instant graphs of data include X-Y, semi-log, and residual plots.
Why use nonlinear regression?
Nonlinear regression analysis is one way to evaluate kinetic models by curve-fitting X-Y data and determining which model fits the data best. Nonlinear regression is an iterative process of adjusting the given parameters until the chosen model best fits the data. Using BestCurvFit, the model that produces the smallest normalized Akaike Information Criterion value provides an indication of the goodness-of-fit.
How does nonlinear regression work?
A library of model equations for enzyme kinetics is provided with BestCurvFit Software. The program adjusts and optimizes the model parameters so that the model curve comes as close as possible to the data points. When no further improvement in the fit can be made, the program stops and reports the results of the analysis. BestCurvFit provides a menu of common enzyme inhibition models, and any one can be selected for analyzing inhibition data. Enzyme kinetic analysis is typically used in the development of drug products. Inhibitors of enzymes function by preventing the enzyme substrate from binding to the active site of the enzyme. This may occur by several different mechanisms. Enzyme kinetic models can be used to help distinguish between the types of inhibition mechanisms. Evaluating the substrate versus velocity (rate of reaction) kinetics in the presence of different concentrations of inhibitor is a way to distinguish between these different mechanisms. A library of models is included to facilitate this evaluation, or you can create your own custom User-Defined-Functions (UDF) for curve-fitting. A UDF can have up to 8 parameters P1..P8 and 3 independent X1..X3 variables. With the development of BestCurvFit, any practitioner can take advantage of the power of nonlinear regression for enzyme kinetic analyses.
What nonlinear regression methods does BestCurvFit use?
BestCurvFit curve-fits experimental X-Y data or substrate, inhibitor, versus velocity inhibition data to mathematical models. User-defined models with up to 8 parameters can also be used. BestCurvFit uses multiple nonlinear regression methods in tandem, the Random and Direct Search methods, Hooke-Reeves method, Variable-Metric methods, and a form of the Gauss-Newton method as modified by Marquardt-Levenberg.
BestCurvFit is accurate and verifiable?
The Statistical Reference Datasets (StRD) Project of the National Institute of Standards and Technology (NIST) has created a set of challenging nonlinear regression problems used to test nonlinear regression algorithms. The NIST StRD Project web page states that "The purpose of this project is to improve the accuracy of statistical software by providing reference datasets with certified computational results that enable the objective evaluation of statistical software". NIST Statistical Reference Datasets - Dataset Archives for Nonlinear Regression: http://itl.nist.gov/div898/strd/nls/nls_main.shtml
The NIST certified reference results were produced by NIST using at least two algorithms utilizing analytical derivatives. The certified results were reported to 11 decimal places for each dataset, however, NIST states that most of these digits are not statistically significant. They advise that "a good nonlinear least squares procedure should be able to duplicate the certified results to at least 4 or 5 digits".
BestCurvFit analyses of 22 NIST datasets produced an average accuracy of over 6 decimal places using numerical derivatives.
BestCurvFit Verification Results:
Data Digits Data Digits
NIST Misra1a 5.7 NIST Chwirut2 5.6
NIST Chwirut1 5.9 NIST Eckerle4 4.8
NIST GAUSS1 7.9 NIST GAUSS2 7.4
NIST DanWood 6.8 NIST Misra1b 6.5
NIST Hahn1 5.5 NIST Kirby2 6.2
NIST MGH17 5.6 NIST Lanczos1 8.3
NIST Lanczos2 5.8 NIST GAUSS3 6.9
NIST Misra1c 5.8 NIST Misra1d 5.9
NIST Roszman1 6.2 NIST MGH09 7.4
NIST Thurber 6.9 NIST BoxBOD 7.4
NIST Rat42 7.1 NIST Rat43 6.6
Average Number of Digits Achieved by BestCurvFit: 6.5
Library of Enzyme Kinetic Models included in BestCurvFit
- Model 1 - Michaelis-Menten
- Model 2 - One Site Sigmoidal Hill
- Model 3 - Two Site Michaelis-Menten
- Model 4 - Competitive Inhibition
- Model 5 - Noncompetitive Inhibition
- Model 6 - Uncompetitive Inhibition
- Model 7 - Mixed Noncompetitive Inhibition
- Model 8 - Partial Competitive Inhibition
- Model 9 - Partial Noncompetitive Inhibition
- Model 10 - Partial Uncompetitive Inhibition
- Model 11 - Partial Mixed Noncompetitive Inhibition
- Model 12 - Random Bi-Bi 2 Substrate
- Model 13 - Ordered Bi-Bi 2 Substrate
- Model 14 - Ping Pong Bi-Bi 2 Substrate
- Model 15 - Two Substrates: One Enzyme, One Active Site
- Model 16 - Two Substrates: One Enzyme, Two Active Sites
- Model 17 - Enzyme Initial Exponential Progress Curve
- Model 18 - Enzyme Initial Exponential Multi-Progress Curves
- Model 19 - Quasi-S-S Integrated Michaelis-Menten minus baseline - 1
- Model 20 - Quasi-S-S Integrated M-M [So] minus baseline - 2
- Model 21 - Yonetani-Theorell Mutual Exclusivity of Inhibitors
- Model 22 - Four-Parameter Logistic
- Model 23 - Five-Parameter Logistic
- Model 24 - Descending Exponential
- Model 25 - Ascending Exponential
- Model 26 - Positive or Negative Substrate Cooperativity
- Model 27 - Arrhenius 1st-Order Substance Stability (k)
- Model 28 - Arrhenius 1st-Order Substance Stability (t90)
- Model 29 - Arrhenius Zero-Order Substance Stability (k)
- Model 30 - Arrhenius Zero-Order Substance Stability (t90)
- Model 31 - Arrhenius 2nd-Order Substance Stability (k)
- Model 32 - Arrhenius 2nd-Order Substance Stability (t90)
- Model 33 - Integrated M-M Competitive Inhibition
- Model 34 - Integrated M-M Uncompetitive Inhibition
- Model 35 - Integrated M-M Noncompetitive Inhibition
- Model 36 - Integrated Michaelis-Menten Mixed Inhibition.
- Model 37 - Botts-Morales General Modifier Model
- Model 38 - Baici Tight-binding Hyperbolic Noncompetitive Model
- Model 39 - Baici Tight-binding Hyperbolic Competitive Model
- Model 40 - Baici Tight-binding Modifier 6-parameterModel
- Model 41 - Gaddum-Schild Logistic Agonist/Antagonist Model
- Model 42 - Botts-Morales Hyperbolic Substrate Inhibition Vmax Model
- Model 43 - Botts-Morales Hyperbolic Substrate Inhibition Ymax Model
- Model 44 - Hyperbolic Substrate/Competitive Inhibition Ymax Model
- Model 45 - Hyperbolic Substrate/Uncompetitive Inhibition Ymax Model
- Model 46 - Hyperbolic Substrate/Noncompetitive Inhibition Ymax Model
Format Structure of BestCurvFit's Text Input Data File
Example #1 input data file format: Michaelis-Menten1.dat
The data file MUST be created using an ASCII text editor.
The data file name MUST be appended with ".dat" (e.g. name.dat).
The first line of the data file contains the model function or the number of the library model function (Model #).
This model contains two adjustable parameters (P1 and P2).
The lower and upper parameter limits are set to 1.E-06 and 1.E+06, respectively.
None of the parameter values are held constant (Unmask = TRUE).
There is only one data curve listed in columns as X1 Y values.
The one indepdent variables (X1) is listed first followed by the Y values to fit.
The last line of the data file must contain the word END to finish.
Here's the data file Michaelis-Menten1.dat shown below:
Model 1 !<-- Library Model number to use or enter a UDF: y = P2 * X1 / (P1 + X1)
10. 100. !<-- Initial parameter values , P1 and P2
1.E-06 1.E-06 !<-- Lower limits of parameters P1 and P2
1.E+06 1.E+06 !<-- Upper limits of parameters P1 and P2
TRUE TRUE !<-- Unmasked parameters = TRUE (masked parameters = FALSE)
5 3.2 !<-- Data in columns: X1, Y (one independent variable X1 and one dependent variable Y)
10 15.9 !<-- Curve #1
END !<-- Enter END to exit
Example #2 input data file format for Noncompetitive Inhibition model #5
where X1=[S], X2=[I] and P1=Km, P2=Vmax, P3=Ki
y=Vmax/((1.0 + Km/S)*(1.0 + I/Ki))
y=P2 / ((1.0 + P1 / X1) * (1.0 + X2 / P3))
Data file format:
The first line of the data file always contains the model function or the library model number (e.g., Model 5).
This model contains three adjustable parameters (P1, P2 and P3).
The lower and upper parameter limits are set to 1.E-06 and 1.E+06, respectively.
None of the parameter values are held constant (Unmask = .TRUE.).
This model contains four curves listed in columns as X1, X2, and Y values.
The two indepdent variables (X1 and X2) are listed first followed by the dependent Y values.
The last line of the data file must contain the word END to complete the data file.
Here's the data file NonCompettitive.dat shown below:
y=P2 / ((1.0 + P1 / X1) * (1.0 + X2 / P3)) !<-- UDF or Library Model function: Model 5
1. 1. 1. !<-- Initial parameter extimates P1, P2, and P3
1.E-06 1.E-06 1.E-06 !<-- Lower limits of parameters P1, P2, and P3
1.E06 1.E06 1.E06 !<-- Upper limits of parameters P1, P2, and P3
TRUE TRUE TRUE !<-- UnMasked parameters = .TRUE. or TRUE or T
50 0 0.032 !<-- Data in columns: X1, X2, and Y of Curve #1
100 0 0.055 !<-- Column 2 (X2) is always used to identify each individual curve.
200 0 0.080
250 0 0.090
333 0 0.102
500 0 0.116
700 0 0.130
50 100 0.017 !<-- Curve #2: X1, X2, and Y
100 100 0.028
200 100 0.045
250 100 0.050
333 100 0.065
500 100 0.072
700 100 0.078
50 200 0.010 !<-- Curve #3: X1, X2, and Y
100 200 0.018
200 200 0.030
250 200 0.036
333 200 0.041
500 200 0.048
700 200 0.052
50 350 0.006 !<-- Curve #4: X1, X2, and Y
100 350 0.012
200 350 0.019
250 350 0.023
333 350 0.027
500 350 0.030
700 350 0.035
END !<-- Enter END
Example #3 input data file format for model #18
Enzyme Initial Exponential Progress Curve, Global Curve-fit
Pt = So*(1 - (1 - vo/So)^t) + bkg
y= X3*(1. - (1. - P1..P3/X3)^X1) + P4
where X1=time, X2=Curve Index number, X3=[So]
P1..P3=initial rate vo for each progress curve, P4=global baseline value
MODEL #18 !<-- Library Model function: Model 18
1. 1. 1. 0. !<-- Initial parameter extimates (P1...P4)
1.E-06 1.E-06 1.E-06 1.E-06 !<-- Lower limits of parameters P1...P4
1.E06 1.E06 1.E06 1.E06 !<-- Upper limits of parameters P1...P4
T T T F !<-- UnMasked parameters = TRUE or T, Masked = FALSE or F
0 1 5 0 !<-- Data in columns: X1, X2, X3, Y (3 independent X1..X3 and 1 dependent variable Y)
1 1 5 3.62 !<-- Progress Curve #1: Column 2 (X2) is the index to identify each individual curve (1..3).
2 1 5 4.26
3 1 5 5.25
4 1 5 5.46
5 1 5 4.64
6 1 5 4.54
7 1 5 5.23
8 1 5 5.42
9 1 5 5.37
10 1 5 4.77
0 2 10 0 !<-- Data in columns: X1, X2, X3 and Y of Progress Curve #2
1 2 10 5.24
2 2 10 7.13
3 2 10 9.36
4 2 10 9.62
5 2 10 9.14
6 2 10 10.23
7 2 10 9.23
8 2 10 10.60
9 2 10 10.69
10 2 10 9.67
0 3 20 0 !<-- Data in columns: X1, X2, X3 and Y of Curve #3
1 3 20 7.42
2 3 20 11.59
3 3 20 13.25
4 3 20 14.83
5 3 20 15.83
6 3 20 17.13
7 3 20 19.63
8 3 20 19.73
9 3 20 19.81
10 3 20 19.94
END !<-- ENTER 'END' TO EXIT RUN
How to write User-defined functions (UDF)?
User-defined functions (UDF):
Fitted parameters: P1, P2, ...,P8
Independent variables: X1, X2, and X3
Dependent variable: Y
The parameters and independent variables MUST be used in sequential order in the UDF.
For example, y = P1*X1 / (X1 + P2) is correct, but y = P1*X1 / (X1 + P3) is not correct.
Similarly, y = P1*X1 / (X3 + P2) is not correct.
UDF's use the following mathematical operators:
- addition, subtraction, multiplication, division, exponential
- +, -, *, /, ^ or **
Logical operators include:
- equal, =
- not equal, #
- less than, <
- greater than, >
- less than or equal to, [
- greater than or equal to, ]
Example of logical operator:
If a logical expression is true (e.g., (8 > 4)), then the expression equals 1.0, else it's 0.0
y = 1.0 / (P1 - P2 * (P1 # P2))
where y = 1.0 / P1 if P1 is equal to P2 [ y = 1.0 / (P1 - P2 * (0.0)) ]
Maximum and minimum operators include:
- Minimum of a and b, (P# : P#)
- Maximum of a and b, (P# ! P#)
Example of minimum of P1 and 100: (P1 : 100)
Example of maximum of P1 and P2: (P1 ! P2)
y = (P1 ! P2) / (P1 - P2) where y = P2 / (P1 - P2) if P1 is not greater than P2
UDF Functions include:
ABS(), EXP(), LOG10(), LOG(), SQRT(), SIN(), COS(), TAN(), ASIN(), ACOS(), ATAN(), SINH(), COSH(), TANH(), OMEGW()
Example of the Gaddum-Schild Model:
y = (Max - Min) / (1. + 10.^( (Log10(10.^(Log10(EC50)*(1+(Antagonist/Kb)^SchildSlope)) - Agonist)*HillSlope)) + Min
The UDF for the Gaddum-Schild Model, as shown below, can be entered into the first line of the data file (e.g., Schild.dat).
y = (P4 - P3) / (1. + 10.**( (Log10(10.**P1 * (1 + (X2 / P2)**P6)) - X1) * P5)) + P3
How to quickly run BestCurvFit?
Steps to run the analysis:
1. Create an external text data file containing:
1.1 1st line: Model # or User-define function (UDF)
1.2 2nd line: Parameter values
1.3 3rd line: Lower bounds of parameter values
1.4 4th line: Upper bounds of parameter values
1.5 5th line: TRUE or FALSE mask of parameter (Fixed=FALSE)
1.5.1 Masks can be FALSE, F, false, f, or .FALSE.
1.6 6th line: X,Y data in columns
1.7 7th line: Word END is entered after the last data row
2. The delimiters for data file values are a space or comma.
3. UDF parameters (P1..P8) must be in sequence (Do not skip a parameter)
4. Independent variables (X1..X3) must also be in sequence
4.1 Not allowed: UDF(X1,X3, P1,P2) or UDF(X1, P1,P2,P4)
4.2 Allowed: UDF(X1,X1, P1,P2) or UDF(X1, P1,P2,P3)
5. Options: For hard to fit models choose DIFFICULT (default=EASY)
6. Options: For weighting of data: Reweight, 1/y^2, Robust weight
7. Select RUN to execute curve-fitting of the selected data file.
8. Scroll down to review the results of the curve-fit.
9. Select Display Results to review results.
10. Select Plot to display the plotted data.
Note: The results of each analysis are saved in a text file with the data file name. A log file is also created to document and date each analysis. You should delete this log file when it becomes too large.
Still have questions?