2011-12-28 18 views
6

Ho la lima data.txt con due colonne e N righe, qualcosa di simile:Matlab, come calcolare AUC (Area Under Curve)?

0.009943796 0.4667975 
0.009795735 0.46777886 
0.009623984 0.46897832 
0.009564759 0.46941447 
0.009546991 0.4703958 
0.009428543 0.47224948 
0.009375241 0.47475737 
0.009298249 0.4767201 
[...] 

Ogni coppia di valori nel file corrispondono ad una coordinate del punto (x, y). Se tracciati, questi punti generano una curva. Vorrei calcolare l'area sotto curva (AUC) di questa curva.

Quindi caricare i dati:

data = load("data.txt"); 
X = data(:,1); 
Y = data(:,2); 

Quindi, X contiene tutte le coordinate x dei punti, e Y tutte le coordinate y.

Come è possibile calcolare l'area sotto curva (AUC)?

+1

Dipende. La [regola trapezoidale] (http://en.wikipedia.org/wiki/Trapezium_rule) è abbastanza buona per te? –

+0

http://www.mathworks.com/matlabcentral/fileexchange/24597-area-under-a-curve –

+0

@Robert: sembra che sia l'area sotto la curva di una * funzione * (Matlab ha un intero gruppo di ' quad'xxxx() funzioni). OP sta cercando l'integrazione numerica dei dati. –

risposta

3

Il modo più semplice è la funzione di regola trapezoidale trapz.

Se i dati sono noti per essere fluidi, si può provare a utilizzare la regola di Simpson, ma non c'è nulla di integrato in MATLAB per l'integrazione di dati numerici tramite la regola di Simpson. (& non sono sicuro di come usarlo per x/y di dati dove x non aumenta costantemente)

+0

Grazie ragazzi, ho provato con trapz(), ma stranamente mi dà sempre valori negativi. Perchè questo? Se è un'area, dovrebbe essere sempre positiva ... Qualche idea? Grazie! –

+3

Se la curva scende sotto 0, l'area effettivamente verrà diminuita. Questo è solo integrale, ricorda. Per ottenere l'AUC positivo potrebbe essere necessario modificare la linea di base. Ad esempio, sottrai il 'min (Y)' da 'Y'.Oppure puoi usare 'abs (Y)' per riassumere aree positive e negative. – yuk

+2

Tecnicamente, se usi 'trapz (x, y)', il segno del risultato dipende dal segno di y e dal segno della modifica in x. (ricorda: questo è integrale di y dx) Quindi se i tuoi valori y sono positivi ma x sta diminuendo, otterrai un numero negativo. In realtà è un po 'più complicato di così: per le curve chiuse, il segno dovrebbe essere positivo per l'accerchiamento in senso orario e negativo per l'accerchiamento in senso antiorario (vedi http://en.wikipedia.org/wiki/Green%27s_theorem#Area_Calculation). –

1

Si può fare qualcosa di simile:

AUC = sum((Y(1:end-1)+Y(2:end))/2.*... 
    (X(2:end)-X(1:end-1))); 
+0

Oli, potresti aggiungere una spiegazione o un link per l'equazione che hai usato? – Tin

4

basta aggiungere AUC = trapz (X , Y) al vostro programma e otterrete l'area sotto la curva

1

Fonte: Link

Un esempio in MATLAB per aiutarvi a ottenere la vostra risposta ...

x=[3 10 15 20 25 30]; 
y=[27 14.5 9.4 6.7 5.3 4.5]; 
trapz(x,y) 

Nel caso in cui si dispone di valori negativi in ​​y, si può fare come,

y=max(y,0) 
0

Ci sono alcune opzioni per trapz per la persona pronta a fare un po 'di codifica da soli. Questo link mostra l'implementazione di Simpson's rule, con codice python incluso. C'è anche un File Exchange sulla regola dei simpson.