Trimr Gauss, tra le altre, fornisce una preziosissima funzione che risulta di estrema utilità nell’ambito matriciale. Questa funzione, chiamata trimr(x,t,b), considerata una matrice x, restituisce una matrice ottenuta tagliando da x le prime t righe e le ultime b righe. In MATLAB questa funzione non è implementata, e costituisce quindi un utile esercizio scriverne il codice tenendo in considerazione che la funzione deve dare un messaggio di errore qualora si stia “trimmando” troppo. Il codice potrebbe dunque essere il seguente:
Trimr function [y]= mytrim(x,a,b); if (a>size(x,1) | b>size(x,1) | (a+b)>size(x,1)); y=' trim too much '; else; y=x((a+1):(size(x,1)-b),:); end; L’eccesso di trim può avvenire se a o b sono > del totale delle righe di x, o se lo è la loro somma. Notiamo l’uso di | tra le singole condizioni e il comando x((a+1):(size(x,1)-b),:), che seleziona tutte le righe di x da a+1 fino alla riga = n° righe – b.
Lag Un’altra funzione utilissima nell’ambito dell’analisi delle serie storiche è la funzione presente in Gauss come lagn(x,k), che ripropone in linguaggio di programmazione l’operatore lag (L). Se k è positivo, l’operatore restituisce una matrice della stessa lunghezza (come righe) di x in cui la prima riga è quella che occupava il posto k+1 in x e le ultime k righe sono missing values (ossia dati mancanti, indicati in Gauss con un punto). Abbiamo così tagliato le prime k osservazioni, “spostando” la matrice x in alto di k righe. Se k è negativo, l’operatore restituisce una matrice della stessa lunghezza (come righe) di x in cui le prime k righe sono missing values, la riga di posto k+1 coincide con la prima riga di x e quindi le ultime k righe di x vengono perse. Vediamone in concreto l’utilità. Possiamo di voler stimare un modello di regressione del tipo AR(2):
Lag yt=a+b1yt-1+b2yt-2+e Senza scendere nei particolari, diciamo che vogliamo capire come i valori ritardati di 1 e 2 periodi influenzano la variabile al tempo corrente. Ovviamente se abbiamo una serie storica di t=100 osservazioni, di queste possiamo sfruttarne solo 98, perché alpiù partiamo dalla terza e la regrediamo sulla seconda e sulla prima, la quarta su terza e seconda e così via. In MATLAB i missing values si indicano con NaN= not a number. Proviamo ora a scrivere questa funzione in MATLAB, con l’avvertenza di predisporre un messaggio di errore se stiamo “laggando” troppo, e distinguere tra k>0 e k<0:
Trimr function [y]= mylag(x,k); if abs(k)>size(x,1); y=' trim too much '; elseif k>0; y=[x((k+1):size(x,1),:) ; NaN*ones(k,size(x,2))]; elseif k<0; y=[NaN*ones(abs(k),size(x,2)) ; x(1:(size(x,1) - abs(k)),:)]; end; Notiamo che y ha sempre la stessa lunghezza di x, in quanto concatenazione verticale tra un vettore lungo k e tante righe di x quante il numero delle sue righe meno k. Attenzione che Dove k è <0 dobbiamo utilizzare abs(k)!!!!
Trimr e lag Se, per calcolare gli stimatori della regressione o ad es. una semplice matrice di covarianza, ho la necessità di creare una matrice che raccolga i valori della variabile, i ritardi fino all’ordine 2 ma ovviamente non voglio lavorare con missing values, posso combinare le due funzioni appena viste sul vettore x che contiene la serie storica in questo modo: posso formare una matrice con lag y=[x mylag(x,-1) mylag(x,-2)] e poi trimmare le prime 2 righe che sicuramente contengono missing values, essendomi spostato in basso (k=-1 e -2): z=mytrim(y,2,0) z (1,1) sarà il terzo valore della serie storica di x, z(1,2) il secondo valore e z(1,3) il primo valore della serie storica!.
Trimr e lag Possiamo estendere utilmente il meccanismo di generazione di suddetta matrice con un loop for, il cui indicatore sarà ovviamente collegato all’ordine k dei ritardi che vogliamo inserire. È preferibile racchiudere il tutto in una funzione, i cui input saranno: il vettore e il numero di ritardi. L’output di detta funzione sarà costituito dalla matrice la cui prima colonna sarà costituita dai valori di x dal k-esimo fino all’ultimo. La funzione che chiamiamo essr (estrazione serie storica ritardata) può essere scritta così:
Trimr e lag function [y]=essr(x,k); if k<0; y='errore, k non può essere negativo'; elseif k> size(x,1); y='errore, k non può eccedere il numero di righe di x'; else; y=[x zeros(size(x,1),k)]; creo a priori y for i=1:k; y(:,i+1)=mylag(x,-i); end; y=mytrim(y,k,0); trimmo alla fine del loop altrimenti end; non coincidono le lunghezze dei vettori!
Altre funzioni create Altri esempi di funzioni vcma per la matrice di varcov di un MA(1) rendc per calcolare i rendimenti semplici rendsc per calcolare i rendimenti semplici e continui estdi per estrarre la diagonale inferiore di una matrice quadrata simm per vedere se la matrice è o meno simmetrica
La creazione di grafici MATLAB è molto completo anche per quello che riguarda la creazione di grafici. Il comando per grafici in bidimensionale è plot: Se x è un vettore, plot(x) lo stampa a video in ordinata (Y) il valore degli elementi e in ascissa (X) l’indice (1,2,3,..) della loro posizione nel vettore. Se x e y sono due vettori, plot(x,y) stampa a video in ordinata (Y) il valore degli elementi di y e in ascissa (X) il valore degli elementi di x. Nel caso di grafici multipli, MATLAB usa di default colori diversi: plot(x,y,x,z) stampa sulla stessa finestra prima x e y poi x e z, con colori diversi.
La creazione di grafici Possiamo definire a piacere il tipo di linea in 3 caratteristiche: plot(x,y,’puntatore-stile-colore’) Quanto ai colori c cyano m magenta y giallo r rosso g verde b blu w bianco k nero Quanto agli stili di linea - linea continua -- linea tratteggiata : Puntini -. Punti + tratteggio none senza linea
La creazione di grafici Quanto ai puntatori abbiamo +,o,*,x Quindi per tracciare un grafico di colore blu, a linea tratteggiata e con puntatore * scriviamo plot(x,y,’b--*’) Se abbiamo tracciato un grafico su di una finestra e vogliamo ora stampargliene sopra un altro, dobbiamo mantenere aperta la finestra con il comando hold on. Es. >> plot(x,y) >> hold on >> plot (x,z)
La creazione di grafici Se invece vogliamo suddividere la finestra in più celle sulle quali vengono stampati diversi grafici, il comando appropriato è subplot(r,c,i). Questo comando suddivide la finestra in una “matrice” rxc e di essa ne seleziona la cella i – esima. Ad es. possiamo creare una sequenza molto fitta di valori che vada da 0 a 2 pigreco con incrementi di 0.1, tracciare sulla prima finestra il coseno, sulla seconda il seno, sulla terza la tangente e sulla quarta la cotangente usando puntatori, colori e stili di linea diversi per ogni sottofinestra con i comandi appena visti e il comando subplot. Possiamo addirittura creare una funzione che chiamiamo mytrig, nel modo seguente: NB: se non ricordo i comandi per le funzioni trigonometriche posso digitare help, poi osservo e digito help matlab\elfun
La creazione di grafici Creiamo prima di tutto la funzione nell’edit: function[]= mytrig(s) co=cos(s); se=sin(s); t=tan(s); ct=cot(s); subplot(2,2,1) plot(s,co,'y:+') subplot(2,2,2) plot(s,se,'b-*') subplot(2,2,3) plot(s,t,'k--x') subplot(2,2,4) plot(s,ct,'m:o')
La creazione di grafici Dopodiché andiamo nel command, creiamo la nostra sequenza come vettore colonna e applichiamo la funzione: >> k=0:0.1:2*pi; >> mytrig(k) Il programma gira ma fornisce anche un messaggio di errore. Questo perché le funzioni tangente e cotangente hanno alcuni punti in cui non possono essere calcolate!!! Digitando alla fine della funzione print –dbmp16m fig.bmp salvo la figura con il nome fig ed estensione .bmp (posso anche porre .gif o .jpeg) nella cartella work.
La creazione di grafici Altri comandi per caratterizzare il grafico sono: axis([min xmax ymin ymax]) axis square axis auto rispettivamente per definire la lunghezza degli assi, renderla uguale o lasciare quella automatica; xlabel(‘…’) ylabel(‘…’) title(‘…’) rispettivamente per dare un nome all’asse x, all’asse y o al titolo del grafico;
La creazione di grafici La funzione text(x,y,’…’) inserisce invece un testo nel grafico che inizia in corrispondenza della coordinata (x,y)