Assignment 9, Part 2: Simulating DNA melting data and testing the model function
This is Part 2 of Assignment 9.
Testing the fitting algorithm
Now it's time to test your code. Just like in the particle tracking lab, we will create some simulated data with a known functional form, run our code, then see whether the outputs match what we put in.
The input to the model function, Vf,model, is the block temperature (from which sample temperature is derived) and the model parameters (to be determined). The model function is suitable for use with the Matlab nlinfit function (or other fitting routines). The input to nlinfit will then be the block temperature, fluorescence signal, the model function, and initial values of the model parameters. The output of nlinfit are the fitted parameter values.
In Part II, the block temperature will be controlled to produce a ramp up from room temperature to 95 degrees then back down to room temperature.
% generate temperature ramp Tmin = 25; Tmax = 95; Temp = [ (0:0.1:900)*((Tmax-Tmin)/900) + Tmin, Tmax*ones(1,1200), ... (0.1:0.1:900)*((Tmin-Tmax)/900) + Tmax, Tmin*ones(1,1200) ]; time = (1:length(Temp))*0.1; plot(time,Temp) xlabel('Time, seconds') ylabel('Temperature, deg C') title('Model block temperature')
To test your curve fitting code, create a synthetic data set with some added random noise:
dnaConcentration = 30E-6; deltaS = -500; deltaH = -180E3; noise = 0.05; % Roughly 5% noise F = DnaFraction( dnaConcentration, Temp + 273, deltaS, deltaH ); F = F + noise*randn(size(F)); plot(time,F) xlabel('Temperature, deg C'); ylabel('Fluorescence Signal'); title('Simulated DNA Melting Curve');
Even at a relatively large amplitude, random noise by itself should not appreciably affect the fitted parameter values; however, noise will generally contribute to uncertainty in the fit values. This uncertainty is seen in the parameter confidence intervals. Use the Matlab function nlparci to obtain the 95% confidence intervals from the results returned by nlinfit, e.g.,
[fitValues, residual, ~, COVB, ~] = nlinfit(Temp, F, fitFunc, beta0, fitOptions); CI = nlparci(fitValues, residual, 'covar',COVB);
where CI will be an N×2 array of values where N is the length of fitValues.