Orthogonal Distance Regression fitting in a for loop
arzensekd
I am doing a linear fit to different columns in 2D wave. Accesing to different datasets is in for loops and because of this I also have errors in X wave, I want to do Orthogonal Distance Regression with X weightings.
When I am doing a regular line fitting I don't have any problems to append fitting results for different datasets in separate plots. But, when I choose flag /ODR=2 for ODR fitting, all the fitting results written in the resulting waves "fit_*" have zero values and there is no problems with resulting coefficients and residuals waves. Which flags I have to consider in the command line for ODR fitting?
My code looks like:
Function PlotInputDataAndFit(w2D,numberOfI,numberOfpH)
Wave w2D // 2-D wave containing data
Variable numberOfI
Variable numberOfpH
//determining positions of data in columns
Variable i, j // Column for determining X and Y values
Make/O/T ionic = {"15","30","50","75","100","175"}
String wTitle //the title of the graph
String graphName = ""
For (i=0; i<numberOfI;i+=1)
For (j=0;j<numberOfpH;j+=1)
wTitle = "pH=" + num2str(j+3)+ ", " + "I=" + ionic[i]
Display /W=(5,45,1053,767) w2D[][48*i+6*j+4] vs w2D[][48*i+6*j+2] as wTitle
ModifyGraph frameStyle=frameStyle
ModifyGraph mode=3,marker=19
// /N suppresses screen updates during fitting
// /Q suppresses history output during fitting
//CurveFit/N/Q/NTHR=0 line w2D[][48*i+6*j+4] /X=w2D[][48*i+6*j+2] /D /R
CurveFit/N/Q/NTHR=0/ODR=2 line w2D[][48*i+6*j+4] /X=w2D[][48*i+6*j+2] /W=w2D[][48*i+6*j+5]/XW=w2D[][48*i+6*j+3] /D /R /I=1
wave w=$("fit_"+ nameOfWave(w2D))
wave wR=$("Res_"+ nameOfWave(w2D))
//Save the coefficients
Duplicate/O w $("fit_"+"pH" + num2str(j+3) + "I" + ionic[i]+"_"+ nameOfWave(w2D))
Duplicate/O W_coef $("coef_"+"pH" + num2str(j+3) + "I" + ionic[i]+"_"+ nameOfWave(w2D))
//Save residuals
Duplicate/O wR $("Res_"+"pH" + num2str(j+3) + "I" + ionic[i]+"_"+ nameOfWave(w2D))
//Save errors
Duplicate/O W_sigma $("Sigma_"+"pH" + num2str(j+3) + "I" + ionic[i]+"_"+ nameOfWave(w2D))
wave w1=$("fit_"+"pH" + num2str(j+3) + "I" + ionic[i]+"_"+ nameOfWave(w2D))
wave wR1=$("Res_"+"pH" + num2str(j+3) + "I" + ionic[i]+"_"+ nameOfWave(w2D))
appendToGraph w1
removeFromGraph/z $nameOfWave(w)
endfor
endfor
End
Wave w2D // 2-D wave containing data
Variable numberOfI
Variable numberOfpH
//determining positions of data in columns
Variable i, j // Column for determining X and Y values
Make/O/T ionic = {"15","30","50","75","100","175"}
String wTitle //the title of the graph
String graphName = ""
For (i=0; i<numberOfI;i+=1)
For (j=0;j<numberOfpH;j+=1)
wTitle = "pH=" + num2str(j+3)+ ", " + "I=" + ionic[i]
Display /W=(5,45,1053,767) w2D[][48*i+6*j+4] vs w2D[][48*i+6*j+2] as wTitle
ModifyGraph frameStyle=frameStyle
ModifyGraph mode=3,marker=19
// /N suppresses screen updates during fitting
// /Q suppresses history output during fitting
//CurveFit/N/Q/NTHR=0 line w2D[][48*i+6*j+4] /X=w2D[][48*i+6*j+2] /D /R
CurveFit/N/Q/NTHR=0/ODR=2 line w2D[][48*i+6*j+4] /X=w2D[][48*i+6*j+2] /W=w2D[][48*i+6*j+5]/XW=w2D[][48*i+6*j+3] /D /R /I=1
wave w=$("fit_"+ nameOfWave(w2D))
wave wR=$("Res_"+ nameOfWave(w2D))
//Save the coefficients
Duplicate/O w $("fit_"+"pH" + num2str(j+3) + "I" + ionic[i]+"_"+ nameOfWave(w2D))
Duplicate/O W_coef $("coef_"+"pH" + num2str(j+3) + "I" + ionic[i]+"_"+ nameOfWave(w2D))
//Save residuals
Duplicate/O wR $("Res_"+"pH" + num2str(j+3) + "I" + ionic[i]+"_"+ nameOfWave(w2D))
//Save errors
Duplicate/O W_sigma $("Sigma_"+"pH" + num2str(j+3) + "I" + ionic[i]+"_"+ nameOfWave(w2D))
wave w1=$("fit_"+"pH" + num2str(j+3) + "I" + ionic[i]+"_"+ nameOfWave(w2D))
wave wR1=$("Res_"+"pH" + num2str(j+3) + "I" + ionic[i]+"_"+ nameOfWave(w2D))
appendToGraph w1
removeFromGraph/z $nameOfWave(w)
endfor
endfor
End
The file with data is attached bellow and this file was imported in Igor as 2D wave.
I am running this function as e.g. PlotInputDataAndFit(wave0, 3,3).
Thanks for any suggestions.
Dejan
http://www.wavemetrics.net/Downloads/latest/
You can also work around the problem by removing the /N (no updates) flag from CurveFit. That may make the function run somewhat more slowly.
John Weeks
WaveMetrics, Inc.
support@wavemetrics.com
January 31, 2012 at 12:55 pm - Permalink
The removing of /N flag works, but I will also try the fix.
Dejan
January 31, 2012 at 02:55 pm - Permalink