Chi2 map - calculate chi2 as a parameter varies

Often one wants to see how chi2 varies for a given set of data, and a given fit function, for a specific parameter. The following snippet takes the name of a user defined fitfunction, a set of x,y data, a coefficient wave, the parameter of interest and a given region to examine (expressed as a percentage of the parameter you are interested in).
You can optionally specify which x,y pairs you are interested in using lhs and rhs and you can also weight the data if you have a wave containing the standard deviation.

Function chi2generator(fn,ydata,xdata,coefs,whichParam,searchArea, [edata, lhs, rhs])
	FUNCREF chi2fitfuntemplate  fn
	Wave ydata,xdata,coefs      //y data, x data, and coefficient wave
	variable whichParam, searchArea  //which of the parameters to you want to vary, how far from the original value do you want to search (%)
	Wave edata   //wave containing standard deviation for the x,y pair
	variable lhs, rhs    //specify a region of interest in the data using a left hand side and right hand side.

	variable originalvalue = coefs[whichparam]
	variable range = originalValue * searchArea/100
	variable ii

	duplicate/o ydata, :theoretical_data, :chi2_data
	Wave theoretical_data, chi2_data

	make/o/n=200/d chi2_map
	setscale/I x,  originalvalue - range/2, originalvalue + range/2, chi2_map
	
	if(paramisdefault(lhs))
		lhs = 0
	endif
	if(paramisdefault(rhs))
		rhs = numpnts(ydata)
	endif

	for(ii=0 ; ii < numpnts(chi2_map) ; ii+=1)
		coefs[whichparam] = pnt2x(chi2_map, ii)

		theoretical_data = fn(coefs, xdata)
		chi2_data = (ydata-theoretical_data)^2
		
		if(!paramisdefault(edata))
			chi2_data /= edata^2
		endif
		Wavestats/q/R=[lhs, rhs] chi2_data
		
		chi2_map[ii] = V_avg * V_npnts
	endfor

	coefs[whichparam] = originalvalue

	display/K=1 chi2_map

	killwaves/z theoretical_data, chi2_data
End

Function chi2fitfuntemplate(w, x)
Wave w
variable x
End

Forum

Support

Gallery

Igor Pro 10

Learn More

Igor XOP Toolkit

Learn More

Igor NIDAQ Tools MX

Learn More