\chapter{Esempi svolti}
\label{chap:cheatsheet}

Questo capitolo spiega come eseguire alcuni compiti comuni (e altri meno comuni)
usando il linguaggio di scripting di \app{gretl}. Alcune delle tecniche mostrate,
ma non tutte, sono utilizzabili anche attraverso l'interfaccia grafica del
programma; sebbene questa possa sembrare più intuitiva e facile da utilizzare a
prima vista, incoraggiamo gli utenti a sfruttare le potenzialità del linguaggio
di scripting di \app{gretl}, dopo aver preso confidenza col programma.

\section{Gestione dei dataset}

\subsection{Periodicità ``strane''}

\emph{Problema:} si hanno dati rilevati ogni 3 minuti a partire dalle ore 9,
ossia ogni ora è suddivisa in 20 periodi.

\emph{Soluzione:}
\begin{code}
setobs 20 9:1 --special
\end{code}

\emph{Commento:} ora le funzioni come \texttt{sdiff()} (differenza ``stagionale'')
o i metodi di stima come l'ARIMA stagionale funzioneranno come ci si aspetta.

\subsection{Aiuto, i miei dati sono all'incontrario!}

\emph{Problema:} Gretl si aspetta che le serie storiche siano in ordine
cronologico (l'osservazione più recente per ultima), ma sono stati importati
da una fonte esterna dei dati ordinati in modo inverso (l'osservazione più
recente per prima).

\emph{Soluzione:}
\begin{code}
setobs 1 1 --cross-section
genr ordinamento = -obs
dataset sortby ordinamento
setobs 1 1950 --time-series
\end{code}

\emph{Commento:} la prima riga è richiesta solo se il dataset in uso è
interpretato come serie storiche: occorre rimuovere questo tipo di
interpretazione che (ovviamente) non permette di usare il comando
\texttt{dataset sortby}. Le due righe successive invertono l'ordine dei dati,
usando come variabile di ordinamento il negativo della variabile indice interna
\texttt{obs}. L'ultima riga è solo un esempio: imposta l'interpretazione del
dataset come serie storiche annuali che iniziano dall'anno 1950.

Se si ha un dataset ordinato correttamente per tutte le variabili tranne una, è
possibile correggere l'ordinamento di una sola variabile nel modo seguente:
\begin{code}
genr x = sortby(-obs, x)
\end{code}

\subsection{Eliminare osservazioni mancanti in modo selettivo}

\emph{Problema:} si ha un dataset con molte variabili e si vuole restringere il
campione a quelle osservazioni per cui non ci sono osservazioni mancanti per
nessuna delle variabili \texttt{x1}, \texttt{x2} e \texttt{x3}.

\begin{samepage}
\emph{Soluzione:}
\begin{code}
list X = x1 x2 x3
genr sel = ok(X)
smpl sel --restrict
\end{code}
\end{samepage}

\emph{Commento:} ora è possibile salvare il file con il comando \texttt{store} per
preservare una versione ristretta del dataset.

\subsection{Operazioni diverse a seconda dei valori di una variabile}

\emph{Problema:} si ha una variabile discreta \texttt{d} e si vuole eseguire
alcuni comandi (ad esempio, stimare un modello) suddividendo il campione a
seconda dei valori di \texttt{d}.

\emph{Soluzione:}
\begin{code}
matrix vd = values(d)
m = rows(vd)
loop for i=1..m
  scalar sel = vd[i]
  smpl (d=sel) --restrict --replace
  ols y const x
end loop
smpl full
\end{code}

\emph{Commento:} L'ingrediente principale è un loop, all'interno del quale è
possibile eseguire tutte le istruzioni volute per ogni valore di
\texttt{d}, a patto che siano istruzioni il cui uso è consentito all'interno di
un loop.

\section{Creazione e modifica di variabili}

\subsection{Generazione di una variabile dummy per una specifica osservazione}

\emph{Problema:} Generare $d_t = 0$ per tutte le osservazioni tranne una, per
cui vale $d_t = 1$.

\emph{Soluzione:}
\begin{code}
  genr d = (t="1984:2")
\end{code}

\emph{Commento:} La variabile interna \texttt{t} viene usata per riferirsi alle
osservazioni sotto forma di stringa, quindi se si ha un campione cross-section
si può usare semplicemente \texttt{d = (t="123")}; ovviamente, se il dataset
ha delle etichette per i dati si può usare l'etichetta corrispondente. Ad
esempio, se si apre il dataset \texttt{mrw.gdt}, fornito con \app{gretl}, si può
generare una variabile dummy per l'Italia usando
\begin{code}
  genr DIta = (t="Italy")
\end{code}

Si noti che questo metodo non richiede di creare uno script: è possibile inserire i
comandi appena visti usando il comando dell'interfaccia grafica
``Aggiungi/Definisci nuova variabile''.

\subsection{Generazione di un ARMA(1,1)}

\emph{Problema:} Generare $y_t = 0.9 y_{t-1} + \varepsilon_t - 0.5
\varepsilon_{t-1}$, con $\varepsilon_t \sim N\!I\!I\!D(0,1)$.

\emph{Soluzione:}
\begin{code}
alpha = 0.9
theta = -0.5
series e = normal()
series y = 0
series y = alpha * y(-1) + e + theta * e(-1)
\end{code}

\emph{Commento:} L'istruzione \texttt{series y = 0} è necessaria perché
l'istruzione successiva valuta \texttt{y} ricorsivamente, quindi occorre
impostare \texttt{y[1]}. Si noti che occorre usare la parola chiave
\texttt{series}, invece di scrivere \texttt{genr y = 0} o semplicemente
\texttt{y = 0}, per assicurarsi che \texttt{y} sia una serie e non uno scalare.

\subsection{Assegnazione condizionale}

\emph{Problema:} Generare $y_t$ secondo la regola seguente:
\[
  y_t = \left\{ 
    \begin{array}{ll} 
      x_t & \mathrm{for} \quad d_t = 1 \\ 
      z_t & \mathrm{for} \quad d_t = 0 
    \end{array}
    \right. 
\]

\emph{Soluzione:}
\begin{code}
series y = d ? x : z
\end{code}

\emph{Commento:} ci sono varie alternative a quella presentata. La prima è
quella di forza bruta usando i loop. Un'altra, più efficiente ma ancora
subottimale, è quella di usare \verb|y = d*x + (1-d)*z|. L'operatore di
assegnazione condizionale ternario non solo rappresenta la soluzione
numericamente più efficiente, ma è anche quella di più semplice lettura, una volta
che si è abituati alla sua sintassi, che per alcuni lettori può ricordare quella
della funzione \texttt{=IF()} nei fogli di calcolo.

\section{Trucchi utili}
\label{sec:cheat-neat}

\subsection{Dummy di interazione}

\emph{Problema:} si vuole stimare il modello $y_i = \mathbf{x}_i
\beta_1 + \mathbf{z}_i \beta_2 + d_i \beta_3 + (d_i \cdot \mathbf{z}_i)
\beta_4 + \varepsilon_t$, dove $d_i$ è una variabile dummy, mentre
$\mathbf{x}_i$ e $\mathbf{z}_i$ sono vettori di variabili esplicative.

\emph{Soluzione:}
\begin{code}
list X = x1 x2 x3
list Z = z1 z2
list dZ = null
loop foreach i Z
  series d$i = d * $i
  list dZ = dZ d$i
end loop 

ols y X Z d dZ
\end{code} 
%$

\emph{Commento:} incredibile cosa si può fare con la sostituzione delle
stringhe, vero?

\subsection{Volatilità percepita}

\emph{Problema:} avendo dati raccolti ogni minuto, si vuole calcolare la
``realized volatility'' per ogni ora come $RV_t = \frac{1}{60}
\sum_{\tau=1}^{60} y_{t:\tau}^2$. Il campione parte da 1:1.

\emph{Soluzione:}
\begin{code}
smpl full
genr time
genr minute = int(time/60) + 1
genr second = time % 60
setobs minute second --panel
genr rv = psd(y)^2
setobs 1 1
smpl second=1 --restrict
store foo rv
\end{code}

\emph{Commento:} qui facciamo credere a \app{gretl} che il dataset sia di tipo
panel, dove i minuti sono le ``unità'' e i secondi sono il ``tempo''; in questo
modo possiamo utilizzare la funzione speciale \texttt{psd()} (panel standard deviation).
Quindi eliminiamo semplicemente tutte le osservazioni tranne una per minuto e
salviamo i dati risultanti (\texttt{store foo rv} significa ``salva nel file di dati
\texttt{foo.gdt} la serie \texttt{rv}'').


%%% Local Variables: 
%%% mode: latex
%%% TeX-master: "gretl-guide"
%%% End: 
