Code covered by the BSD License

### Highlights from ROCout=roc(varargin)

4.16
4.2 | 30 ratings Rate this file 52 Downloads (last 30 days) File Size: 13 KB File ID: #19950 Version: 1.33

# ROCout=roc(varargin)

### Giuseppe Cardillo (view profile)

16 May 2008 (Updated )

compute a ROC curve

File Information
Description

The ROC graphs are a useful technique for organizing classifiers and visualizing their performance. ROC graphs are commonly used in medical decision making.
YOU CAN USE THIS FUNCTION ONLY AND ONLY IF YOU HAVE A BINARY CLASSIFICATOR.

The input is a Nx2 matrix: in the first column you will put your test values (i.e. glucose blood level); in the second column you will put only 1 or 0 (i.e. 1 if the subject is diabetic; 0 if he/she is healthy).

By itself (without arguments) roc will run a demo.

The function computes and plots the classical ROC curve and curves for Sensitivity, Specificity and Efficiency (see the screenshot).

The function will show 4 cut-off points:
1) Max sensitivity
2) Max specificity
3) Cost effective (cross point of sensitivity and specificity curves)
4) Max Efficiency

ROC requires the Curve fitting toolbox.

Required Products Curve Fitting Toolbox
MATLAB release MATLAB 7.6 (R2008a)
MATLAB Search Path
`/`
14 Jul 2016 Giuseppe Cardillo

### Giuseppe Cardillo (view profile)

Mark it is very simple: it is a 5 point logistic regression where A=0 and D=1

http://www.myassays.com/five-parameter-logistic-curve.assay

Comment only
13 Jul 2016 Mark Pether

### Mark Pether (view profile)

Thanks for sharing this excellent piece of code Giuseppe, I have one question: how did you come by the formula 1-1/((1+(x/C)^B)^E for the curve fitting of the ROC?

07 Jul 2016 Ge Ruiyang

### Ge Ruiyang (view profile)

I am wondering if the performance of the classifier is determined with permutation test.

Comment only
07 Jul 2016 Ge Ruiyang

### Ge Ruiyang (view profile)

I found a paper which used this code stated as: "To determine whether the discriminative performances could occur by chance, we employed a non-parametric permutation test. Briefly, an empirical distribution was obtained for the area under curve (AUC) derived from the ROC analysis and the determination coefficient (R2) derived from the logistic regression analysis, respectively, by randomly reallocating all of the patients into two groups (improvers and non-improvers) and re-computing the AUC and R2 based on the two randomized groups (10,000 permutations). The 95th percentile points of the empirical distributions were used as critical values to estimate statistics (P values), which indicate the deviation of the observed discriminative performances from those expected by chance."

01 Apr 2016 Jose M.

### Jose M. (view profile)

Thanks Giuseppe, I was away for some time. I am afraid that it is probably the same error as Fulden. Jose Maria

Comment only
28 Mar 2016 Thao Tran

### Thao Tran (view profile)

23 Mar 2016 fulden cantas

### fulden cantas (view profile)

Thanks a lot! It works well :)

Comment only
23 Mar 2016 Giuseppe Cardillo

### Giuseppe Cardillo (view profile)

because you have negative data in your ROC matrix
m=min(rocdata);
rocdatac=rocdata+repmat(abs(m),length(rocdata),1);
ROCout=roc(rocdatac);
cut=ROCout.co(1,4)+m(1)

cut =

92.8841

Comment only
22 Mar 2016 fulden cantas

### fulden cantas (view profile)

Hi Giuseppe,
Thanks for the codes and it helped me so much but unfortunately I've got an error this time but don't know how to fix it. Could you help me as soon as possible? The codes are below which gave me error.. Thanks in advance.

n=1000;
sigma1=42;
sigma2=23;
sigma3=55;
rho12=0.9;
rho13=0.6;
rho23=0.3;
cov=[sigma1^2 rho12*sigma1*sigma2 rho13*sigma1*sigma3; rho12*sigma1*sigma2 sigma2^2 rho23*sigma2*sigma3; rho13*sigma1*sigma3 rho23*sigma2*sigma3 sigma3^2];
m=mvnrnd([91.51 48.83 139.69],cov,n); %[mvnrnd[mean1 mean2 mean3],cov,n];
S=m(:,1)+2*m(:,2)+3*m(:,3);
k=find(S<mean(S));
S(k)=0;
k2=find (mean(S)<S);
S(k2)=1;
data=[m S];

dataa=[data(:,1) data(:,2) data(:,4)];

rocdata=[dataa(:,1) dataa(:,3)]; default.values={rocdata,0,0.05,1};
[rocdata threshold alpha verbose] = deal(default.values{:});
ROCout=roc(rocdata,threshold,alpha,verbose)
cut=ROCout.co(1,4);

Error using fit>iFit (line 340)
Complex value computed by model function, fitting cannot continue.
Try using or tightening upper and lower bounds on coefficients.

Error in fit (line 108)
[fitobj, goodness, output, convmsg] = iFit( xdatain, ydatain, fittypeobj, ...

Error in roc (line 219)
fitSe = fit(table(:,1),table(:,2),ft_,fo_);

Comment only
10 Mar 2016 Giuseppe Cardillo

### Giuseppe Cardillo (view profile)

I should see the data to reply. Could you send me the dataset by email?

Comment only
10 Mar 2016 Jose M.

### Jose M. (view profile)

I have some issues with the code, I am not sure why. Do you have any suggestions?

Error using fit>iFit (line 367)
Complex value computed by model function, fitting
cannot continue.
Try using or tightening upper and lower bounds on
coefficients.
Error in fit (line 108)
[fitobj, goodness, output, convmsg] = iFit(
xdatain, ydatain, fittypeobj, ...
Error in rocc (line 281)
fitSe = fit(table(:,1),table(:,2),ft_,fo_);

Comment only
19 Apr 2015 Raid Omar

### Raid Omar (view profile)

Dear Sir,

26 Jun 2014 abdul

### abdul (view profile)

09 Apr 2014 Jort Gemmeke

### Jort Gemmeke (view profile)

Nice. One issue with the verbose option: when set to 0, it doesnt fill the .co part of the output anymore. To fix, switch the lines

m=[table(CSe,1) table(CSp,1) CE table(CEff,1)];
end

near the end of the code (line 300 or so)

Comment only
09 Apr 2014 Jort Gemmeke

### Jort Gemmeke (view profile)

28 Nov 2013 Giuseppe Cardillo

### Giuseppe Cardillo (view profile)

the Equal Error Rate (EER) is the point on the ROC curve that corresponds to have an equal probability of miss-classifying a positive or negative sample. This point is obtained by intersecting the ROC curve with a diagonal of the unit square.
Anyway, in the results, it should be the "cost-effective" cut-off point.

Comment only
27 Nov 2013 Anupam

### Anupam (view profile)

Hello Cardillo.. I was wondering how to obtain the value of EER from your code. Is the standard error equal to the EER?

27 Nov 2013 Giuseppe Cardillo

### Giuseppe Cardillo (view profile)

Simply... I don't know

Comment only
27 Nov 2013 AMIT kamra

### AMIT kamra (view profile)

i have 2 excel files..one is desired result..second is actual results.kindly tell where to add these files in code to get Az value

Comment only
13 Jun 2013 Giuseppe Cardillo

### Giuseppe Cardillo (view profile)

I have just uploaded a new roc version. You can set the verbose flag and so you will have not plots and results summary, but only the rocout structure

Comment only
11 Jun 2013 giusep

### giusep (view profile)

Really nice function. I am wondering how to avoid the plots. Is it possibile?

10 Jun 2013 giusep

### giusep (view profile)

cool function!

05 Jun 2013 Giuseppe Cardillo

### Giuseppe Cardillo (view profile)

to be honest, I haven't. I run on R2012a and it works. Maybe you haven't curvefit toolbox

Comment only
04 Jun 2013 Pham

### Pham (view profile)

Hi, when I test your function without argument, it keeps output error like below:
>> roc
Error using fittype/subsref (line 16)
Cannot access fields of fittype using . notation

Error in fit>params2var (line 65)
evalStr = sprintf('tmp = params.%s;',freeList{i});

Error in fit (line 34)
vars = params2var(params,freeList);

Error in roc (line 156)
cfit = fit(xroc,yroc,ft_,fo_);

I'm using Matlab R2012a. Could you give me some suggestion.
Thanks

Comment only
29 Apr 2013 Giuseppe Cardillo

### Giuseppe Cardillo (view profile)

As I previously wrote, the main paper you have to read is Hanley JA, McNeil BJ. The Meaning and Use of the Area under a Receiver Operating Characteristic (ROC) Curve. Radiology. 1982 Apr;143(1):29-36.
Now I think it is quite impossible to find a paper describing each bayesian parameter, so you could email me in private and I could try to help you.

Adding a costant will not affect results.

Comment only
29 Apr 2013 Noam

### Noam (view profile)

Hi,
Great code. Thanks. Some questions:
1) Is there any document explaning the output - what each result means and how is it calculated?
2) We found that a negative value in the data causing an error. Is that true? Will adding a constant to bring all data above zero will affect the results?
Thanks.

14 Nov 2012 Giuseppe Cardillo

### Giuseppe Cardillo (view profile)

By definition, the efficiency is the fraction of subjects that are correctly classified.
TRACE(M) is the sum of the elements on the main diagonal; in our case it is the sum of true positives and negatives.
SUM(M(:)) is the sum of the elements of the matrix and so it is the number of studied subjects.
TRACE(M)/SUM(M(:)) is the efficiency.

Comment only
13 Nov 2012 Benjamin

### Benjamin (view profile)

In the 25 Sep 2012 version, can you describe/cite how 'trace(M)/sum(M(:))' , where M is a 2x2 of [TP FP;FN TN], results in an efficiency measure at each threshold?

Comment only
22 Mar 2012 Jorge Amaral

### Jorge Amaral (view profile)

I run the same problem again on matlab 7.8 ( R2009a) and it was perfect. I was using matlab 7.4 before. I fixed the error mentioned by Segun Oshin and run some examples with matlab 7.4 and it was ok. However, when I ran the example above there was an error in 7.4 but not in Mtalab 7.8. Thanks
Jorge

Comment only
07 Mar 2012 Giuseppe Cardillo

### Giuseppe Cardillo (view profile)

@Jorge Amaral
I used your data and this is the result:
ROC CURVE DATA
--------------------------------------------------------------------------------
Cut-off point Sensivity Specificity
0.9000 0.0000 1.0000
0.8000 0.1000 1.0000
0.7000 0.2000 1.0000
0.6000 0.2000 0.9000
0.5500 0.3000 0.9000
0.5400 0.4000 0.9000
0.5300 0.5000 0.9000
0.5200 0.5000 0.8000
0.5100 0.5000 0.7000
0.5050 0.6000 0.7000
0.4000 0.6000 0.6000
0.3900 0.7000 0.6000
0.3800 0.7000 0.5000
0.3700 0.8000 0.5000
0.3600 0.8000 0.4000
0.3500 0.8000 0.3000
0.3400 0.8000 0.2000
0.3300 0.9000 0.2000
0.3000 0.9000 0.1000
0.1000 1.0000 0.1000
--------------------------------------------------------------------------------

ROC CURVE ANALYSIS

--------------------------------------------------------------------------------
AUC S.E. 95% C.I. Comment
--------------------------------------------------------------------------------
0.68000 0.12186 0.44115 0.91885 Poor test
--------------------------------------------------------------------------------
Standardized AUC 1-tail p-value
1.4771 0.069828 The area is not statistically greater than 0.5

so there is not error. If you want contact me by email and we'll try to better understand and to solve

Comment only
06 Mar 2012 ananthi

### ananthi (view profile)

gud stuff sir.i am doin my final year project.i tried ur codes.its workin gud 4 default values.but i dono 2 feed d input.. wat do u mean by data value?i hav used svm classifier. the output of svm is no of ones and no of zeros.how shld i feed tis as input..i need tis immediately..can u plz help...

Comment only
05 Mar 2012 Jorge Amaral

### Jorge Amaral (view profile)

Great work!
I have a question regarding the code. In line 222
(if p<=alpha) , I have partest in the same directory but when I run the code with the matrix:
fawcett_matrix =
0.7000 0
0.5300 0
0.5200 0
0.5050 0
0.3900 0
0.3700 0
0.3600 0
0.3500 0
0.3300 0
0.1000 0
0.9000 1.0000
0.8000 1.0000
0.6000 1.0000
0.5500 1.0000
0.5400 1.0000
0.5100 1.0000
0.4000 1.0000
0.3800 1.0000
0.3400 1.0000
0.3000 1.0000
ROCout=roc(fawcett_matrix,0,0.05,1) the following error occurs:
??? Undefined function or variable "co".

Error in ==> roc at 271
ROCout.co=co;

I think it happens because p is greater than alpha in line 222 and there is no default value. Is that correct?
Thanks,

Jorge

05 Dec 2011 Giuseppe Cardillo

### Giuseppe Cardillo (view profile)

this is a problem caused by using a new syntax of matlab that is not supported by your version. Simply do this:
1) edit roc
2) change [~,J]=min(d); into [S,J]=min(d);
3) save and exit

Comment only
04 Dec 2011 K

### K (view profile)

Hi Mr.Cardillo, I'd like to run the sample command "roc" but the error appears:

>> roc
??? Error: File: roc.m Line: 225 Column: 11
Expression or statement is incorrect--possibly unbalanced (, {, or [.

Any idea to encounter this?, my matlab version 7.6.0

Comment only
16 Nov 2011 Frb

16 Nov 2011 Frb

### Frb (view profile)

I appreciate your help, it worked :)

Comment only
16 Nov 2011 Giuseppe Cardillo

### Giuseppe Cardillo (view profile)

this error shows that something doesnt work on rocdata and so you have not x in your workspace. Now I have changed and uploaded a new version of roc so, if you call roc without arguments, it will run the demo by itself. If you dont want to wait for the FEX updating simply change in the code the default.value in this way

default.values = {[165 1;140 1;154 1;139 1;134 1;154 1;120 1;133 1;150 1;...

146 1;140 1;114 1;128 1;131 1;116 1;128 1;122 1;129 1;145 1;117 1;140 1;...

149 1;116 1;147 1;125 1;149 1;129 1;157 1;144 1;123 1;107 1;129 1;152 1;...

164 1;134 1;120 1;148 1;151 1;149 1;138 1;159 1;169 1;137 1;151 1;141 1;...

145 1;135 1;135 1;153 1;125 1;159 1;148 1;142 1;130 1;111 1;140 1;136 1;...

142 1;139 1;137 1;187 1;154 1;151 1;149 1;148 1;157 1;159 1;143 1;124 1;...

141 1;114 1;136 1;110 1;129 1;145 1;132 1;125 1;149 1;146 1;138 1;151 1;...

147 1;154 1;147 1;158 1;156 1;156 1;128 1;151 1;138 1;193 1;131 1;127 1;...

129 1;120 1;159 1;147 1;159 1;156 1;143 1;149 1;160 1;126 1;136 1;150 1;...

136 1;151 1;140 1;145 1;140 1;134 1;140 1;138 1;144 1;140 1;140 1;159 0;...

136 0;149 0;156 0;191 0;169 0;194 0;182 0;163 0;152 0;145 0;176 0;122 0;...

141 0;172 0;162 0;165 0;184 0;239 0;178 0;178 0;164 0;185 0;154 0;164 0;...

140 0;207 0;214 0;165 0;183 0;218 0;142 0;161 0;168 0;181 0;162 0;166 0;...

150 0;205 0;163 0;166 0;176 0;],0,0.05,1};

Comment only
16 Nov 2011 Frb

### Frb (view profile)

This error happens,
roc(x)

??? Error using ==> cell
Size vector must be a row vector with real elements.

Error in ==> roc at 44
args=cell(varargin);

Comment only
15 Nov 2011 Giuseppe Cardillo

### Giuseppe Cardillo (view profile)

typing 'load rocdata' you already have your matrix x into the workspace. if you will type x you will see all the data of the matrix. now type roc(x)

Comment only
14 Nov 2011 Frb

### Frb (view profile)

Data is on rocdata.mat, true?
so I write load rocdata.mat but I should put it into x, how can I do that?

Comment only
13 Nov 2011 Giuseppe Cardillo

Comment only
12 Nov 2011 Frb

### Frb (view profile)

Hey guys, I couldn't run the program, any help plz?

Comment only
08 Jun 2011 Ali Ali

### Ali Ali (view profile)

Thanks a lot

15 Mar 2011 Giuseppe Cardillo

### Giuseppe Cardillo (view profile)

Dear Benjamin, I think that Pythagora don't care if you acknowledge him or not :-).
For the standard error I used an equation described in: Hanley JA, McNeil BJ. Radiology 1982 143 29-36. The meaning and use of the area under the Receiver Operating Characteristic (ROC) curve.

Please cite me only if you use all my function: if you took pieces of code, you can decide to cite me or not.

Lastly, I prefer to use quantile and not a fixed size step because real data usually are not equally spaced.

Comment only
15 Mar 2011 Benjamin

### Benjamin (view profile)

I was also going to suggest adding a varagin to delineate a step-size, ex:
%add a varagin, in this case I am calling it step which can describe the distance between thresholds to be calculated
if(nargin<2 )
z=sortrows(x,1);
%find unique values in z
step=unique(z(:,1));
elseif length(step)==1 % the fixed step size is being requested
step=[min(pred):step:max(pred)]
end
% later in guiseppe code just do labels=step

Also, Guiseppe, I implemented your standard error and pythagoras into my code which generated data that will probably used in an upcoming paper. Do you mind being acknowledged or are there any actual articles to cite? Your call. And lastly, I have a GUI that is pretty beta, but works.

Comment only
15 Mar 2011 Reza

### Reza (view profile)

Thanks for the update.
P.S. I work with images of 2000x2000 pixels, so... ;)

15 Mar 2011 Giuseppe Cardillo

### Giuseppe Cardillo (view profile)

Dear Jay, thank you for your comment. I don't agree so much with you. If you look at the code:
1) all vectors are preallocated;
2) True and false positive and negative are computed using logical indexing.
So the computations are very fast.
Anyway, I introduced your suggest and now you can choose if you want to use all or 3<=N<all unique values as thresholds. I have just uploaded the file.

Comment only
12 Mar 2011 Reza

### Reza (view profile)

hey there, nice program!

However, you use each element of the data as a threshold and you calculate the fpr tpr etc. This means a very very long time and many many points on the curve for a large vector (which makes your program useless). To avoid this, I suggest you let the user to choose the number of thresholds.

12 Nov 2010 Benjamin

### Benjamin (view profile)

Thanks, that fixed it and I now understand the difference with SE.

Comment only
12 Nov 2010 Giuseppe Cardillo

### Giuseppe Cardillo (view profile)

Perhaps you are right: I uploaded the file at July to fix the bug by Segun Oshin; it is clear that somewhat in the upload went wrong. I have just reupload the file.
If you are using my roc dataset, you will see that 0's and 1's are not in the same proportion. If you invert 0's and 1's the curve is slight different and so the SE is quite different.

Comment only
12 Nov 2010 Benjamin

### Benjamin (view profile)

Thanks for answering all of my questions, I really do appreciate it. I still have an issue with your answer for number 3.

First, I was using an inverted data set when I stated the answer should be 151 not 150 (previous post). Second, using the download available on this page right now, running roc(x) gives a cutoff of 153. As you state, the correct answer is in fact 152. Therefore, I am not sure if you changed something and didn't update, since the cutoff value is still using the row of the minimum distance from xroc,yroc and grabbing that rows value from 'labels', hence the wrong answer of 153. (lines 184-186)

To confirm this, run the download from here and see what cutoff you get. Maybe it is something on my end?

As for the standard error calculation (#4), I was playing around and found that if I inverted the 1's and 0's before running, I would get a different Serror for the AUC, which I assumed should be the same regardless of whether they were inverted. The Serror of the sample data is 0.02713, and if I invert the observations, it becomes 0.0364. This is probably trivial.

Thanks again for your excellent responses.

12 Nov 2010 Giuseppe Cardillo

### Giuseppe Cardillo (view profile)

I'll try to answer the questions by Benjamin.
1) The SE of the area is calculated using this equation from Hanley JA, McNeil BJ. Radiology 1982 143 29-36.
2) I haven't project to implement a GUI. Anyway this function is under GPL license, so you can modify and redistribute it without any problems but correct citations.
3) I took in account that there are 2 more points in xroc and yroc arrays than labels array. If you look deeper in the code (line 138):
table=[labels'; yroc(2:end-1)'; 1-xroc(2:end-1)';]';
As you can see, the displayed xroc and yroc points go from 2 to end-1 (and so the points 0,0 and 1,1 are excluded). Anyway, using the demo dataset the cut-off point is 152 (that is the closest to green line)...
4) The standard error of the area is a function of the area and points used to draw the ROC curve: if you have two ROC curves, the first with 10 points and the second with 100 points the first will have a greater SE than the second. hbar and ubar are used to correctly compute the false and true positives and negatives. Their values don't influence the SE computation.

Comment only
11 Nov 2010 Benjamin

### Benjamin (view profile)

Also, when hbar>ubar, I think values in standard error calculations should be changed. Otherwise, you can get to different standard error values from the same area under the curve depending on whether healthy average is higher than disease average.

Sorry to keep bugging you here, but this is the best way I can see to make suggestions. As you can tell, I have been digging into this lately.

Comment only
11 Nov 2010 Benjamin

### Benjamin (view profile)

I think there may be an issue within the code, but I could be wrong. When you create xroc and yroc using
xroc=flipud([1; 1-a(:,2); 0]) , the additional two rows are not also added to labels. For instance, in your example data, this yields 72 paired points for the ROC curve (# rows in xroc or yroc) but only 70 thresholds (# rows in labels). This causes issues when reporting the threshold value since this is determined by a row reference back to labels (in the example, the threshold by your math should be 151 not 150 (using 'labels' and 'a').

If this doesn't make sense, or I am wrong, please let me know. Its really not a big deal with large datasets with many points on the curve, but becomes an issue with smaller sets where points are farther apart.

Comment only
03 Nov 2010 Benjamin

### Benjamin (view profile)

Giuseppe,

First off, great code, really. I was wondering if you used a specific citable method to calculate the standard error for the AUC, which is then used for the CI?

Second, and more trivial, have you thought about implementing this as a GUI or stand alone? My next side project is to make one for my boss to use (without Matlab).

Thanks again for the great code.

29 Jul 2010 Segun Oshin

### Segun Oshin (view profile)

Hi, the code is very good. However, I encounter an error where the cut-off point is set, on line 186,

??? Attempted to access labels(7397); index out of bounds because numel(labels)=7396.

Error in ==> roc at 186
co=labels(J); %Set the cut-off point

Is there a way to fix this?
Kind regards!

Comment only
29 Jul 2010 Segun Oshin

08 Apr 2010 Neel

### Neel (view profile)

Giuseppe, I find your code useful. I was keen to calculate Equal Error Rate based on your code. Do you have any suggestions as to how I can do this easily. This will be appreciated.

08 Apr 2010 Neel

### Neel (view profile)

27 Oct 2009 Jens Kaftan

### Jens Kaftan (view profile)

Hi Giuseppe.
I have had a look at the new release today and I think it is still not perfectly correct. I have validated the scripts using the example data of Hanley and McNeil's 1982 paper: "The Meaning and Use of the Area under a Receiver Operating Characteristic (ROC) Curve", which seems to be the basis for the calculations (such as the approximation of Q_1 and Q_2) anyways. To my opinion the problem is that when integrating over the ROC curve to compute the AUC, the data point (sensitivity=1, specificity=0) is not considered when using the trapezoidal rule. Consequently the AUC value (and all AUC dependent measures) differ slightly from the example in the mentioned article (which becomes more severe for non-continous tests with only a few cut-off points).

Best,
Jens.

29 Jul 2009 cabrego

### cabrego (view profile)

I tested the new release and it is agreeing with other codes now. Michael, you may also wish to verify that the new version is working correctly.

I also think adding the cut off points as an additional x or y axis would be very useful to understand the trade off between sensitivity and sensibility.

24 Jul 2009 Michael

### Michael (view profile)

Agree with cabrego, this algorithm does not work correctly. Depending on the input data, it generates ROC curves with specificity and sensitivity backward. I believe this is because elements that fall below a cutoff value (I in the code) are called "true positives" when they should be "false positives". The convention is that higher values of a test are abnormal (positive).

I confirmed that other software (online ROC calculator, ROCR in R, STATA) does not behave this way with the same input data and all others produce correct results.

16 Jul 2009 cabrego

### cabrego (view profile)

Nice function, but I think it may have a bug, I am getting different results for significantly overlaping distributions when I compare to medcalc, and online calculators.

email me for more details: cpabrego@gmail.com

25 Jun 2009 Phong Vo

### Phong Vo (view profile)

Thank you very much!

20 Nov 2008 Pawel

### Pawel (view profile)

11 Aug 2008 Günther Eibl

easy to use!

13 Jul 2008 Diego García Bascuñán

Good function

24 Jun 2008 Truc Phan

Good stuff.

12 Nov 2008 1.2

Changes in help section

19 Nov 2008 1.3

Test on significance of AUC added

03 Dec 2008 1.4

10 Dec 2008 1.5

if mean(healthy)>mean(unhealthy) the function mirrors the curve to obtain the correct ROC curve.

10 Feb 2009 1.6

Mistake correction in z test computation

18 Feb 2009 1.7

Changes to make it compatible with uroccomp function

27 Jul 2009 1.8

bug correction

29 Jul 2009 1.9

New plot output

30 Jul 2009 1.10

According to cabrego comment, in the function output the table of cutoff points, sensibility and specificity.

02 Sep 2009 1.11

improved compatibility with URocomp

02 Sep 2009 1.12

In my previous submission I forgot to add the demo...

03 Sep 2009 1.13

18 Sep 2009 1.14

correction in ROC performance bounds

06 Nov 2009 1.15

I modified the files according to Jens Kaftan suggestion

24 Nov 2009 1.16

bug fixing in area computation after adding the points (0,0) and (1,1) as previously suggested

23 Dec 2009 1.17

Changes in description

03 Mar 2010 1.18

The function is deeper commented

09 Mar 2010 1.19

ROC requires another function of mine: partest. If it is not present on the computer, ROC will download it from FEX

08 Apr 2010 1.20

another little bug correction to include the points (0,0) and (1,1)

12 Jul 2010 1.22

Trapz correction

12 Nov 2010 1.23

Bug fixing in Cut off grabbing

12 Nov 2010 1.24

Previously I uploaded an old version of roc.m This is the last version

15 Mar 2011 1.25

I added the possibility to choose if you want to use all unique values or 3<=N<all unique values as tresholds

16 Nov 2011 1.26

running roc without arguments, it will run a demo

07 Mar 2012 1.27

change in description.
Cut-off points and AUC confidence interval are now always computed to avoid nargout error

24 Sep 2012 1.29

new plots and outputs

25 Sep 2012 1.30

The curves Fitting was enhanced.
L5P is no more needed.

14 Jun 2013 1.31

some little editing for verbose flag management

21 Jan 2014 1.32

bug fixed in output table

06 Oct 2014 1.33

minor code improvements