Anteprima
Vedrai una selezione di 3 pagine su 8
Laboratori Matlab - Informatica medica Pag. 1 Laboratori Matlab - Informatica medica Pag. 2
Anteprima di 3 pagg. su 8.
Scarica il documento per vederlo tutto.
Laboratori Matlab - Informatica medica Pag. 6
1 su 8
D/illustrazione/soddisfatti o rimborsati
Disdici quando
vuoi
Acquista con carta
o PayPal
Scarica i documenti
tutte le volte che vuoi
Estratto del documento

provate

% ogni volta a scrivere char(ans) sotto ogni fread, vedrete che troverete

% delle informazioni o delle lettere che per voi non vogliono dire niente

% ma sono indicazioni precise dentro il file originale

g= fread(f,8);

char(g); %troverete SIEMENS

% ES 3

function posizione = trovaelemento (f, group, element)

%codifico il TAG in binario da esadecimale

%tag di esempio 0008, 0070) trovo 8 e 0 come se leggessi da destra il mio

%numero

V = [ hex2dec(group(3:4)) hex2dec(group(1:2)) hex2dec(element(3:4))

hex2dec(element(1:2))];

%mi posiziono all'inizio, mi sposto di 0 byte rispetto all'origine del file

%che per convenzione è rappresentato dal -1

fseek(f, 0, -1);

A = fread(f);

%è un vettore posizione e lo sto inizializzando a 0 e ogni volta lo aggiorno

posizione=[];

for i = 1:length(A)-3

%verifica che la dimensione di A sia uguale al vettore V

if isequal (A(i:i+3)',V)

%se è vera, concatena al vettore posizione il vettore corrente di i

posizione = [posizione i];

end

end

% ES 4

posizione = trovaelemento (f,'0008', '0020');

fseek(f, 536, -1);

fread(f, 4);

fread(f,2);

char(ans)';

fread(f,2);

char(ans)';

fread(f,8);

char(ans)'; %esce la data "20120516", 16/05/2012

posizione = trovaelemento (f, '7FE0', '0010') % questa è l'immagine in se, ve l'ha

messa

% qui più che altro per trarre in inganno. L'informazione che vi da è che

% troverete l'immagine al byte 68031, è anche un suggerimento per la domanda n. 6,

% che comunque vedremo prima come l'ha vista lei, ricordatevi di tornare

% qui più tardi

% ES 5

posizione = trovaelemento (f, '0020', '000D');

% Uso il primo numero che esce da "posizione" nel comando sottostante

fseek(f, 2168, -1);

fread(f,4);

dec2hex(ans); % questa è la stringa che corrisponde a 0020,000D, non ho capito se

richiedeva lei

% o se chiedeva questa

fread(f,2);

char(ans)'; %da cui esce "UI"

fread(f,2);

char(ans)';

fread(f, 54); %è la dimensione del contenuto "scritto" di quel tag

char(ans)';

% ES 6

I=dicomread('image.dcm');

imshow(I, 'DisplayRange' , []); %ti fa vedere l'immagine

dicomdisp('image.dcm'); %QUESTO COMANDO TI FA VEDERE LA STRUTTURA DEL FILE DI TESTO

% SU CUI HAI LAVORATO PRATICAMENTE A VUOTO FINO AD ORA, TE LO METTO QUI NON

% PERCHè SONO STRONZA, MA ADESSO PUOI RIVEDERE TUTTO QUELLO FATTO AVENDO A

% MENTE QUESTO SCHEMA, A ME è SERVITO MOLTO IMPARARE PRIMA I COMANDI E LA

% SEQUENZA, E POI CAPIRE SU COSA STESSI EFFETTIVAMENTE LAVORANDO PER POI

% RIVEDERE IL TUTTO

% Comunque, ti va direttamente alla fine e nell'ultima riga puoi vedere "Pixel-

Data" che è l'effettiva immagine e ti

% dice che occupa 524288 bytes, quindiper sapere quanti bytes occupa il file

% di testo senza immagine non faccio altro che togliere questo numero alla

% lunghezza totale del file

length(A) - 524288; % viene fuori 68042 occupati dal file, che, come visto

nell'esercizio 4

% corrisponde al byte al quale inizia l'immagine trovato tramite il comando

% "posizione=trovaelemento(..)"

% ES 7

load('ecg.mat');

figure;

plot(ECGtm, ECG);

hold on;

plot(ECGtm(ann), ones(1,10), 'ro');

plot(ECGtm(ann), ECG(ann), 'ro');

figure;

subplot(1,2,1), plot(ECGtm(1:1000), ECG(1:1000));

subplot(1,2,2), plot(ECGtm(1001:2000), ECG(1001:2000));

LABORATORIO 3

% ES 1

%estrarre dal file ICD10.tt i codici e le realative descrizioni per la

%categoria G000-G09: "Infiammatory disases of the central nervous sistem"

f=fopen('ICD10.txt');

lista=['G00'; 'G01'; 'G02'; 'G03'; 'G04'; 'G05'; 'G06'; 'G07'; 'G08'; 'G09'];

n=0;

%ottengo una matrice di 10 rigehe per 3 colonne????

%inizializzo a 0 una variabile che conterà i termini che effettivamente

%andiamo a estrarre in quanto facenti parte della categoria voluta

%utilizzo il while per leggere l'intero documento, quella funzione valuta

%se siamo al termine della lettura del file

while feof(f)==0

line=fgetl(f);

if isempty(strmatch(line(2:4),lista)) == 0

%prendo i primi caratteri delle nostra riga appena letta e la

%confronto con la lista, la funzione strmatch mi consente

%questo e mi resituisce la posizione dell'occorrenza della

%nostra stringa, se il risultato è un vettore non vuoto la

%funzione isempty diversa da 0, non è vuoto hai trovato

%qualcosa allora ho trovato un'istanza dei termini che cercavo

%e vado a contarli

if isempty(findstr('-', line))

n=n+1;

[code, descrizione] = strtok(line);

%sto utilizzando la funzione prende la stringa in ingresso,

%line nel nostro caso, salta eventuali spazi all'inizio, nel

%primo argomento mette tutti i caratteri prima del carattere di

%tab, nel secondo argomento vengono memorizzati i caratteri restanti

s(n) = struct('code', code, ...

'descrizione', descrizione);

end

end

end

fclose(f)

%ho delle righe di intestazione che voglio eliminare, contengono il

%trattino qindi aggiungo un if

% ES 2

%creare un array strutture contenente tutti i termini che contengono la

%parola 'deficiency'

f=fopen('ICD10.txt');

n=0;

while feof(f)==0

line=fgetl(f);

if isempty(findstr(' deficiency', ...

line))==0;

n=n+1;

%estrae e copia il code e descrizione

[code, descrizione]= strtok(line);

d(n) = struct('code', code, 'descrizione', descrizione);

end

end

% ES 3 – ECG

load('ecg.mat')

%trovare e aggiungere al grafico i relativi marcatori del picco S che segue

%il picco R nel battito

D=diff(ECG); %segnale differenziale

S=[]; %vettore che conterrà le posizioni dei picchi S

for i=1:length(ann)

%ann contiene i picchi R annotati manualmente da un esperto

d=D(ann(i) + 3:end);

positivi=find(d>0);

s=positivi(1)-1; %prendo il primo dei positivi che troviamo

%parto dal picco R, il segnale scende, valuto la differenza tra un

%campionee il precedente, questa sarà sempre negativa fin quando non

%trovo il minimo, mi interessa il primo minimo e questo sarà la

%posizione del mio s

s=s+ann(i)+3;

S= [S s];

end figure

plot (ECGtm, ECG)

hold on

plot(ECGtm(S), ECG(S), 'mx')

LABORATORIO 4

% ROC

%PUNTO 1

%il soggetto è considerato affetto se il marcatore è >= 1,3, rispetto allo

%standard del disease calcolare sensitività, specificità e accuratezza del

%test

load('ex1.mat');

POS=find(disease);

NEG=find(disease==0);

n=length(disease);

TP= length(find(concentration(POS)>1.3));

TN=length(find(concentration(NEG)<=1.3));

SENSITIVITY = TP/length(POS);

SPECIFICITY = TN/length(NEG);

ACCURACY = (TN + TN)/n;

% PUNTO 2 - Vado a fare la stessa cosa, ma andando a variare la soglia nel

% ciclo for, questo per valutare il marcatore (vedere teoria info med +

% segnali)

soglie =unique(concentration);

ROCx=[];

ROCy=[];

for i=1:length(soglie)

TP= length(find(concentration(POS)>soglie(i)));

TN=length(find(concentration(NEG)<=soglie(i)));

SENSITIVITY = TP/length(POS);

SPECIFICITY = TN/length(NEG);

ROCx=[ROCx, 1-SPECIFICITY];

ROCy=[ROCy, SENSITIVITY];

end

figure

plot(ROCx, ROCy)

% stiamo così valutando il marcatore in base a TUTTI i valori soglia

xlabel('1-specificity')

ylabel('sensitivity')

% Kaplan-Meier

Appunto personale a posteriori, questo è il laboratorio più difficile, questa prima parte in verde è presa dagli audio che

avevo del laboratorio, è sicuramente poco chiara, ma ho preferito comunque metterla a disposizione, ma se vi fa

confusione provata a partire direttamente dal testo.

% censored fa riferimento ai soggetti che sono all'interno della casistica

% all'inizio del periodo di osservazione, ma poi non si hanno informazioni

% relative a questi soggetti, questi partecipano al compito della curva di

% Kaplan-Meier ma vengono esclusi nel momento in cui non si hanno più

% informazioni rispetto al loro follow-up

% tempi in settimane per l'evento critico

% man mano che ho eventi il numero dei soggetti a rischio diminuisce, anche

% a causa dei censored

% la curva è una produttoria delle probabilità che riguardano la sopravvivenza

% a un certo tempo

% ciascuno avrà il proprio tempo 0, che può essere una certa diagnosi, tutti

% sono riferiti allo stesso istante iniziale rispetto al quale parte il

% calcolo del tempo, quindi avrò tempi cronologici diversi per i quali ho lo

% stesso tipo di informazione a partire da una certa diagnosi > evoluzione

% partiamo da 21 soggetti

N=21;

EVENT=[6 6 6 7 10 13 16 22 23];

censored = [6 9 10 11 17 19 20 25 25 32 32 34];

% tempi che ho nella casistica + 0 iniziale

t1=[0 unique(EVENT)];

% numero di eventi per ogni tempo

eventi1=[];

for i = 1:length(t1), eventi1=[eventi1 length(find(EVENT==t1(i)))]; end

%aggiorna il vettore che è in t1 della lunghezza del vettore trovato

% ora consideriamo i soggetti censored e li andiamo a contare intervallo per

% intervallo, inizializziamo a vuoto il vettore c1

c1=[];

for i = 1:length(t1) - 1, c1=[c1 length(find(t1(i)<= censored) && (censored <

t1(i+1)))]; end

% quanto la curva scende è solo in corrispondenza solo dei tempi critici

% memorizzati in event, i censored sono all'interno del gradino e vengono

% raffigurati lungo esso. Gradino che corrisponde ad un intervallo tra due

% eventi critici. Inoltre andiamo ad aggiungere a c1

c1= [c1 length(find(censored>=23))]; %23 tempo max di event

% parto con un 100% di sogetti, questo può diminuire in corrispondenza degli

% eventi critici

nt=0;

% soggetti a rischio nel j-esimo intervallo di tempo

nt=nt + N*ones(1, length(t1));

% qui vado a vedere anche i soggetti censored, diminuisco la quantità sia

% degli esclusi sia dell'evento critico

for j=2:length(t1), nt(j)=nt(j-1)-eventi1(j-1)-c1(j-1); end

% probabilità di eventi nel j-esimo intervallo

f=eventi1./nt;

robabilità di sopravvivenza

s=1-f;

% qualcosa per costruire kaplan meier

preKM = s(1);

KM=1;

% ciclo for per le sopravvivenze nei singoli intervalli

% produttoria delle frequenze calcolate fino a quel tempo

% devo moltiplicare le probabilità da 0 fino a quel tempo

for k=1:7, preKM= preKM*s(k

Dettagli
Publisher
A.A. 2016-2017
8 pagine
6 download
SSD Scienze matematiche e informatiche INF/01 Informatica

I contenuti di questa pagina costituiscono rielaborazioni personali del Publisher elisa.lis di informazioni apprese con la frequenza delle lezioni di Informatica medica e studio autonomo di eventuali libri di riferimento in preparazione dell'esame finale o della tesi. Non devono intendersi come materiale ufficiale dell'università Politecnico di Milano o del prof Pattini Linda.