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']) |