annotate multithreshold 1.46/psychometricFunction.m @ 38:c2204b18f4a2 tip

End nov big change
author Ray Meddis <rmeddis@essex.ac.uk>
date Mon, 28 Nov 2011 13:34:28 +0000
parents f233164f4c86
children
rev   line source
rmeddis@0 1 % ------------------------------------------------------- psychometricFunction
rmeddis@0 2 function [psy, levelsBinVector, binFrequencies, nNo, nYes]=...
rmeddis@0 3 psychometricFunction(levels, responses, psyBinWidth)
rmeddis@0 4 % computes a psychometric function from rwo vectors (levels and responses)
rmeddis@0 5 % responses is a binary vectory (1=yes)
rmeddis@0 6 % psyBinWidth is the bin width (dB) of the output psychometric function
rmeddis@0 7 % this function is called by both fitPsychometricFunction and subjGUI
rmeddis@0 8 % for this reason it should notbe bundled with fitPsychometricFunction
rmeddis@0 9
rmeddis@0 10 binFrequencies=[]; nNo=[]; nYes=[];
rmeddis@0 11 if min(levels)+abs(psyBinWidth) < max(levels)
rmeddis@0 12 % create a set of bins for the psychometric function
rmeddis@0 13 levelsBinVector= min(levels): abs(psyBinWidth): max(levels);
rmeddis@0 14 else
rmeddis@0 15 psy=[]; levelsBinVector=[];
rmeddis@0 16 return
rmeddis@0 17 end
rmeddis@0 18
rmeddis@0 19 idx0=find(responses==0); % isolate 'no'
rmeddis@0 20 z=levels(idx0);
rmeddis@0 21 nNo=hist(z, levelsBinVector);
rmeddis@0 22
rmeddis@0 23 idx1=find(responses>0); % isolate 'yes'
rmeddis@0 24 y=levels(idx1);
rmeddis@0 25 nYes=hist(y, levelsBinVector);
rmeddis@0 26
rmeddis@0 27 if sum(nNo)==0 | sum(nYes)==0
rmeddis@0 28 psy=[]; levelsBinVector=[];
rmeddis@0 29 return % yesses and nos required for a function
rmeddis@0 30 end
rmeddis@0 31
rmeddis@0 32 binFrequencies=nNo+nYes;
rmeddis@0 33
rmeddis@0 34 warning off MATLAB:divideByZero
rmeddis@0 35 psy=nYes./binFrequencies; % psy is the proportion of 'yes' responses
rmeddis@0 36 warning on MATLAB:divideByZero
rmeddis@0 37 lastwarn('');
rmeddis@0 38
rmeddis@0 39 idx=~isnan(psy); %remove empty bins
rmeddis@0 40 idx=(nYes>0) |(nNo>0); %remove empty bins
rmeddis@0 41 psy=psy(idx);
rmeddis@0 42 levelsBinVector=levelsBinVector(idx);
rmeddis@0 43 binFrequencies=binFrequencies(idx);
rmeddis@0 44 nNo=nNo(idx);
rmeddis@0 45 nYes=nYes(idx);
rmeddis@0 46
rmeddis@0 47 % [nNo' nYes']
rmeddis@0 48 % [levelsBinVector' psy']
rmeddis@0 49 % plot(levelsBinVector,psy,['o'])