View Full Version : nonlinear regression results

05-12-2008, 07:48 AM
I have a set of datapoints which i am trying to fit to the function
y = A*log(B+x) + C*x + D*sqrt(x)
and I am trying to use IMSL NonLinearRegression to do so.
An example of the data points i am trying to fit is attached:
The results are
A = 6.470
B = 0.827
D= 4.009
I tried to compare the results with those generated by another library and those generated by other curve fitting softwares and, while the values of B, C and D agree with those calculated by IMSL NonLinearRegression, the value of A calculated with all other methods is 2.810.
Could anyone explain why am I getting different results?
Thanks in advance

05-12-2008, 12:02 PM
I tried this quickly using the JMSL NonlinearRegression (http://www.vni.com/products/imsl/jmsl/v50/manual/api/com/imsl/stat/NonlinearRegression.html) class and get the 2.81 value for A.

Can you tell us which version and IMSL product you're using? If you follow the example below and still get a different result, we'd be happy to look into it but would probably need your example code.

The code and results are included below; the code is based off of Example 1 in the documentation.

The computed regression coefficients are:
The sums of squares for error is 0.12211509207486902

import com.imsl.stat.*;

public class ForumNLR {
public static void main(String args[])
throws NonlinearRegression.TooManyIteration***ception,
NonlinearRegression.NegativeWeightException {
NonlinearRegression.Function f = new NonlinearRegression.Function() {

public boolean f(double theta[], int iobs, double frq[], double wt[], double e[]) {
double xdata[] = {0.048,0.091,0.091,0.091,0.082,0.13,0.138,0.176,0. 214,0.226,
0.269,0.294,0.327,0.371,0.417,0.454,0.493,0.558,0. 606,0.656,0.701,0.765,
double ydata[] = {0.6,0.8,0.8,0.8,1,1.2,1.4,1.6,1.8,2,2.2,2.4,2.6,2 .8,3,3.2,
3.4,3.6,3.8,4,4.2,4.4,4.6,4.8,5,5.2,5.4,5.6,5.8,6} ;
boolean iend;
int nobs = 30;

if(iobs < nobs){
wt[0] = 1.0;
frq[0] = 1.0;
iend = true;
e[0] = ydata[iobs]
- theta[0] * Math.log(theta[1] + xdata[iobs])
- theta[2] * xdata[iobs]
- theta[3] * Math.sqrt(xdata[iobs]);
} else {
iend = false;
return iend;

int nparm = 4;
double theta[] = {1, 1, 1, 1};
NonlinearRegression regression = new NonlinearRegression(nparm);
double coef[] = regression.solve(f);
System.out.println("The computed regression coefficients are:");
for (int i=0; i<coef.length; i++) {
System.out.println("\t" + coef[i]);
double sse = regression.getSSE();
System.out.println("The sums of squares for error is " + sse);

05-12-2008, 12:10 PM
On a whim, I just re-ran this in Java and changed the "Math.log" method call to "Math.log10" and got the following results:

The computed regression coefficients are:
The sums of squares for error is 0.12211509207523491

So I guess you need to make sure you're calling the same LOG function in every program. It's interesting that the other parameters do not change at all.

05-12-2008, 01:39 PM
:o now that explains it! thanks for your help, Ed! Much appreciated

04-25-2015, 09:37 AM
It's interesting that the other parameters do not change at all.Switching from natural to common logarithms is equivalent to scaling A by ln 10. The remaining fit coefficients (B, C and D) are not affected by this scaling, so there is no surprise here.