Confidence bands after a fit
johnweeks
The function CPInterval, as you are getting it, uses anaDerivs() for the derivatives, a function that implements the derivative of the function using an analytic expression. The one included in the procedure file is for a particular fitting function (the one in vfit, of course).
You will need to replace either vfit or anaDerivs with one appropriate to your fitting function. This was written before we had FUNCREF in Igor, so it was difficult to write it to use an arbitrary fitting function.
To use this, call CPInterval with the value of X where you want the confidence band, plus the covariance matrix from the fit, the coefficient wave, desired confidence level expressed as a fraction (0.95 for 95 per cent) and the number of degrees of freedom (number of input data points minus number of fit coefficients). Returns the confidence interval.
You might use it this way:
Duplicate fitWave, upperConfWave, lowerConfWave
upperConfWave = fit_inputData + CPInterval(x, M_covar, W_coef, 0.95, V_npnts-numpnts(W_coef))
lowerConfWave = fit_inputData - CPInterval(x, M_covar, W_coef, 0.95, V_npnts-numpnts(W_coef))
Function/D vfit(cw, xx)
Wave/D cw;Variable/D xx
return ((cw[0]*xx)/(xx+cw[1]))
End
Function CPInterval(xx, covar, params, conflevel, DegFree)
Variable xx
Wave covar
Wave params
Variable conflevel
Variable DegFree
Variable i
Variable j
Variable LpEnd = numpnts(params)
Variable temp, Yvar
Variable tP
// Uncomment these three lines and the one below the Duplicate, in order to
// use numerical estimates of derivatives. You might do that if your fitting function
// is very complicated to compute, doesn't have a good analytic derivative, or if you lost
// your installation of Mathematica...
// Duplicate/O params, epsilon
// epsilon[0] = 1e-6
// epsilon[1] = 1e-18
Duplicate/O params, dyda
// calcDerivs(xx, params, dyda, epsilon)
// You must comment out this line in order to use numerical derivatives.
anaDerivs(xx, params, dyda)
i = 0
YVar = 0
do
temp = 0
j = 0
do
temp += covar[j][i]*dyda[j]
j += 1
while (j < LpEnd)
YVar += temp*dyda[i]
i += 1
while (i < LpEnd)
tP = StudentT(confLevel, DegFree)
return tP*sqrt(YVar)
end
Function calcDerivs(xx, params, dyda, epsilon)
Variable xx
Wave params
Wave dyda
Wave epsilon
Duplicate/O params, theP
Variable yhat = vfit(params, xx)
Variable i = 0
Variable LpEnd = numpnts(params)
do
theP = params
theP[i] = params[i]-epsilon[i]
yhat = vfit(theP, xx)
theP[i] = params[i]+epsilon[i]
dyda[i] = (yhat - vfit(theP, xx))/(2*epsilon[i])
i += 1
while (i < LpEnd)
end
Function anaDerivs(xx, w, dyda)
Variable xx
Wave w
Wave dyda
Variable denom = xx+w[1]
dyda[0] = xx/denom
dyda[1] = -w[0]*xx/(denom*denom)
end
Wave/D cw;Variable/D xx
return ((cw[0]*xx)/(xx+cw[1]))
End
Function CPInterval(xx, covar, params, conflevel, DegFree)
Variable xx
Wave covar
Wave params
Variable conflevel
Variable DegFree
Variable i
Variable j
Variable LpEnd = numpnts(params)
Variable temp, Yvar
Variable tP
// Uncomment these three lines and the one below the Duplicate, in order to
// use numerical estimates of derivatives. You might do that if your fitting function
// is very complicated to compute, doesn't have a good analytic derivative, or if you lost
// your installation of Mathematica...
// Duplicate/O params, epsilon
// epsilon[0] = 1e-6
// epsilon[1] = 1e-18
Duplicate/O params, dyda
// calcDerivs(xx, params, dyda, epsilon)
// You must comment out this line in order to use numerical derivatives.
anaDerivs(xx, params, dyda)
i = 0
YVar = 0
do
temp = 0
j = 0
do
temp += covar[j][i]*dyda[j]
j += 1
while (j < LpEnd)
YVar += temp*dyda[i]
i += 1
while (i < LpEnd)
tP = StudentT(confLevel, DegFree)
return tP*sqrt(YVar)
end
Function calcDerivs(xx, params, dyda, epsilon)
Variable xx
Wave params
Wave dyda
Wave epsilon
Duplicate/O params, theP
Variable yhat = vfit(params, xx)
Variable i = 0
Variable LpEnd = numpnts(params)
do
theP = params
theP[i] = params[i]-epsilon[i]
yhat = vfit(theP, xx)
theP[i] = params[i]+epsilon[i]
dyda[i] = (yhat - vfit(theP, xx))/(2*epsilon[i])
i += 1
while (i < LpEnd)
end
Function anaDerivs(xx, w, dyda)
Variable xx
Wave w
Wave dyda
Variable denom = xx+w[1]
dyda[0] = xx/denom
dyda[1] = -w[0]*xx/(denom*denom)
end
Forum
Support
Gallery
Igor Pro 9
Learn More
Igor XOP Toolkit
Learn More
Igor NIDAQ Tools MX
Learn More