"Fossies" - the Fresh Open Source Software Archive

Member "gretl-2019c/doc/tex_it/nls.tex" (2 Oct 2015, 13121 Bytes) of package /linux/misc/gretl-2019c.tar.xz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) TeX and LaTeX source code syntax highlighting (style: standard) with prefixed line numbers. Alternatively you can here view or download the uninterpreted source code file.

    1 \chapter{Minimi quadrati non lineari}
    2 \label{chap-nls}
    3 
    4 
    5 \section{Introduzione ed esempi}
    6 \label{nls-intro}
    7 
    8 \app{gretl} supporta i minimi quadrati non
    9 lineari (NLS - nonlinear least squares), usando una variante
   10 dell'algoritmo Levenberg--Marquardt.  L'utente deve fornire la
   11 specificazione della funzione di regressione, e, prima ancora di fare
   12 questo, occorre ``dichiarare'' i parametri da stimare e fornire dei
   13 valori iniziali. È anche possibile indicare analiticamente delle
   14 derivate della funzione di regressione rispetto a ognuno dei
   15 parametri. La tolleranza usata per fermare la procedura iterativa di
   16 stima può essere impostata con il comando \cmd{set}.
   17 
   18 La sintassi per la specificazione della funzione da stimare è la
   19 stessa usata per il comando \cmd{genr}. Ecco due esempi, che includono
   20 anche le derivate.
   21 
   22 \begin{script}[htbp]
   23   \caption{Funzione di consumo da Greene}
   24   \label{nls-cons}
   25 \begin{scode}
   26 nls C = alfa + beta * Y^gamma
   27     deriv alfa = 1
   28     deriv beta = Y^gamma
   29     deriv gamma = beta * Y^gamma * log(Y)
   30 end nls
   31 \end{scode}
   32 \end{script}
   33 
   34 \begin{script}[htbp]
   35   \caption{Funzione non lineare da Russell Davidson}
   36   \label{nls-ects}
   37 \begin{scode}
   38 nls y = alfa + beta * x1 + (1/beta) * x2
   39     deriv alfa = 1
   40     deriv beta = x1 - x2/(beta*beta)
   41 end nls
   42 \end{scode}
   43 \end{script}
   44 
   45 Si notino i comandi \cmd{nls} (che indica la funzione di regressione),
   46 \cmd{deriv} (che indica la specificazione di una derivata) e \cmd{end
   47   nls}, che conclude la specificazione e avvia la stima. Se si
   48 aggiunge l'opzione \cmd{--vcv} all'ultima riga, verrà mostrata la
   49 matrice di covarianza delle stime dei parametri.
   50 
   51 \section{Inizializzazione dei parametri}
   52 \label{nls-param}
   53 
   54 Prima di eseguire il comando \cmd{nls}, occorre definire dei valori iniziali per
   55 i parametri della funzione di regressione. Per farlo, è
   56 possibile usare il comando \cmd{genr} (o, nella versione grafica del
   57 programma, il comando ``Variabile, Definisci nuova variabile'').  
   58 
   59 In alcuni casi, in cui la funzione non lineare è una generalizzazione
   60 di un modello lineare (o di una sua forma ristretta), può essere
   61 conveniente eseguire un comando \cmd{ols} e inizializzare i parametri
   62 a partire dalle stime OLS dei coefficienti. In relazione al primo
   63 degli esempi visti sopra, si potrebbe usare:
   64 
   65 \begin{code}
   66 ols C 0 Y
   67 genr alfa = $coeff(0)
   68 genr beta = $coeff(Y)
   69 genr gamma = 1
   70 \end{code}
   71 
   72 E in relazione al secondo esempio si userebbe:
   73 
   74 \begin{code}
   75 ols y 0 x1 x2
   76 genr alfa = $coeff(0)
   77 genr beta = $coeff(x1)
   78 \end{code}
   79 
   80 \section{Finestra di dialogo NLS}
   81 \label{nls-gui}
   82 
   83 Probabilmente il modo più comodo di formulare i comandi per una stima
   84 NLS consiste nell'usare uno script per \app{gretl}, ma è possibile
   85 anche procedere interattivamente, selezionando il comando
   86 ``Minimi quadrati non lineari'' dal menù ``Modello, Modelli non lineari''. In questo modo,
   87 si aprirà una finestra di dialogo in cui è possibile scrivere la
   88 specificazione della funzione (opzionalmente preceduta da linee
   89 \cmd{genr} per impostare i valori iniziali dei parametri) e le
   90 derivate, se sono disponibili. Un esempio è mostrato nella
   91 figura~\ref{fig-nls-dialog}.  Si noti che in questo contesto non
   92 occorre scrivere i comandi \cmd{nls} e \cmd{end nls}.
   93 
   94 \begin{figure}[htbp]
   95   \begin{center}
   96     \includegraphics[scale=0.75]{figures/nls_window}
   97   \end{center}
   98   \caption{Finestra di dialogo NLS}
   99   \label{fig-nls-dialog}
  100 \end{figure}
  101 
  102 
  103 \section{Derivate analitiche e numeriche}
  104 \label{nls-deriv}
  105 
  106 Se si è in grado di calcolare le derivate dalla funzione di
  107 regressione rispetto ai parametri, è consigliabile indicarle come
  108 mostrato negli esempi precedenti. Se ciò non è possibile, \app{gretl}
  109 calcolerà delle derivate approssimate numericamente. Tuttavia, le
  110 proprietà dell'algoritmo NLS in questo caso potrebbero non essere
  111 ottimali (si veda la sezione~\ref{nls-accuracy}).
  112 
  113 Questo vien fatto usando l'istruzione \cmd{params}, seguita da una
  114 lista di identificatori per i parametri da stimare. In questo caso,
  115 gli esempi fatti sopra diventano:
  116 
  117 \begin{scode}
  118 nls C = alpha + beta * Y^gamma
  119     params alpha beta gamma
  120 end nls
  121 \end{scode}
  122 
  123 \begin{scode}
  124 nls y = alpha + beta * x1 + (1/beta) * x2
  125     params alpha beta
  126 end nls
  127 \end{scode}
  128 
  129 Se vengono fornite delle derivate analitiche, ne viene controllata la
  130 coerenza con la funzione non lineare data. Se esse sono chiaramente
  131 scorrette, la stima viene annullata con un messaggio di errore. Se le
  132 derivate sono ``sospette'', viene mostrato un messaggio di
  133 avvertimento, ma la stima prosegue.  Questo avvertimento può essere
  134 causato da derivate scorrette, ma può anche essere dovuto a un alto
  135 grado di collinearità tra le derivate.
  136 
  137 Si noti che non è possibile mischiare derivate numeriche e analitiche:
  138 se si indicano espressioni analitiche per una derivata, occorre farlo
  139 per tutte.
  140 
  141 \section{Arresto della procedura}
  142 \label{nls-toler}
  143 
  144 La procedura di stima NLS è iterativa: l'iterazione viene arrestata quando
  145 si verifica una qualunque delle seguenti condizioni: viene raggiunto il
  146 criterio di convergenza, o si supera il massimo numero di iterazioni
  147 impostato.
  148 
  149 Se $k$ denota il numero di parametri da stimare, il numero massimo di iterazioni
  150 è $100 \times (k+1)$ quando si indicano le derivate analitiche, mentre è $200
  151 \times (k+1)$ quando si usano le derivate numeriche.
  152 
  153 Preso un numero $\epsilon$ piccolo a piacere, la convergenza si ritiene
  154 raggiunta se è soddisfatta almeno una delle due condizioni seguenti:
  155 
  156 \begin{itemize}
  157 \item Entrambe le riduzioni, effettiva o prevista, della somma dei quadrati
  158   degli errori sono minori di $\epsilon$.
  159 \item L'errore relativo tra due iterazioni consecutive è minore di
  160   $\epsilon$.
  161 \end{itemize}
  162 
  163 Il valore predefinito per $\epsilon$ è pari alla precisione della macchina
  164 elevata alla potenza 3/4\footnote{Su una macchina Intel Pentium a 32-bit, il
  165 valore è pari a circa $1.82\times 10^{-12}$.}, ma può essere modificato usando
  166 il comando \cmd{set} con il parametro \verb+nls_toler+. Ad esempio
  167 %
  168 
  169 \begin{code}
  170 set nls_toler .0001
  171 \end{code}
  172 %
  173 imposterà il valore di $\epsilon$ a 0.0001.
  174 
  175 \section{Dettagli sul codice}
  176 \label{nls-code}
  177 
  178 Il motore sottostante la stima NLS è basato sulla suite di funzioni
  179 \app{minpack}, disponibile su
  180 \href{http://www.netlib.org/minpack/}{netlib.org}.  Nello specifico,
  181 sono usate le seguenti funzioni \app{minpack}:
  182 
  183 \begin{center}
  184   \begin{tabular}{ll}
  185     \verb+lmder+ & 
  186     Algoritmo Levenberg--Marquardt con derivate analitiche
  187     \\
  188     \verb+chkder+ & 
  189     Controllo delle derivate analitiche fornite
  190     \\
  191     \verb+lmdif+ & 
  192     Algoritmo Levenberg--Marquardt con derivate numeriche
  193     \\
  194     \verb+fdjac2+ & 
  195     Calcolo del Jacobiano approssimato finale se si usano le derivate 
  196     numeriche
  197     \\
  198     \verb+dpmpar+ & 
  199     Determinazione della precisione della macchina
  200     \\
  201   \end{tabular}
  202 \end{center}
  203 
  204 In caso di successo nell'iterazione Levenberg--Marquardt, viene usata
  205 una regressione Gauss--Newton per calcolare la matrice di covarianza
  206 per le stime dei parametri. Se si usa l'opzione \verb|--robust|, viene
  207 calcolata una variante robusta. La documentazione del comando \cmd{set}
  208 spiega le opzioni disponibili a questo proposito.
  209 
  210 Poiché i risultati NLS sono asintotici, si può discutere sulla necessità di
  211 applicare una correzione per i gradi di libertà nel calcolo dell'errore standard
  212 della regressione (e di quello delle stime dei parametri). Per confrontabilità
  213 con OLS, e seguendo il ragionamento in Davidson e MacKinnon (1993), le stime
  214 calcolate in \app{gretl} \emph{usano} una correzione per i gradi di libertà.
  215 
  216 \section{Accuratezza numerica}
  217 \label{nls-accuracy}
  218 
  219 La tabella~\ref{tab-nls} mostra i risultati dell'uso della procedura
  220 NLS di \app{gretl} sui 27 ``Statistical Reference Dataset'' forniti
  221 dal National Institute of Standards and Technology (NIST)
  222 statunitense, per il test del software di regressione non
  223 lineare.\footnote{Per una discussione dell'accuratezza di \app{gretl}
  224   nella stima di modelli lineari, si veda
  225   l'appendice~\ref{app-accuracy}.} Per ogni dataset, il file di test
  226 indicano due valori iniziali per i parametri, quindi il test completo
  227 riporta 54 stime. Sono stati eseguiti due test completi, uno usando
  228 derivate analitiche e uno usando approssimazioni numeriche; in
  229 entrambi i casi si è usata la tolleranza predefinita.\footnote{I dati
  230   mostrati nella tabella derivano dalla versione 1.0.9 di \app{gretl},
  231   compilato con \app{gcc} 3.3, collegato a \app{glibc} 2.3.2 ed
  232   eseguito in Linux su un PC i686 (IBM ThinkPad A21m).}
  233 
  234 Sulle 54 stime, \app{gretl} non riesce a produrre una soluzione in 4
  235 casi, se vengono usate le derivate analitiche, e in 5 casi se vengono
  236 usate le approssimazioni numeriche. Dei quattro fallimenti in modalità
  237 derivate analitiche, due sono dovuti alla non convergenza
  238 dell'algoritmo Levenberg--Marquardt dopo il numero massimo di
  239 iterazioni (su \verb+MGH09+ e \verb+Bennett5+, entrambi descritti dal
  240 NIST come di ``alta difficoltà'') e due sono dovuti ad errori di
  241 intervallo (valori in virgola mobile al di fuori dei limiti) occorsi
  242 durante il calcolo del Jacobiano (su \verb+BoxBOD+ e \verb+MGH17+,
  243 rispettivamente descritti come di ``alta difficoltà'' e di ``media
  244 difficoltà''). In modalità approssimazione numerica, l'ulteriore caso
  245 di fallimento è rappresentato da \verb+MGH10+ (``alta difficoltà'',
  246 massimo numero di iterazioni raggiunto).
  247 
  248 La tabella mostra informazioni su vari aspetti dei test: numero di
  249 fallimenti, numero medio di iterazioni richieste per produrre una
  250 soluzione, e due tipi di misura dell'accuratezza dei risultati per i
  251 parametri e per i loro errori standard.
  252 
  253 Per ognuno dei 54 test eseguiti in ogni modalità, se è stata prodotta
  254 una soluzione, sono state confrontate le stime dei parametri ottenute da
  255 \app{gretl} con i valori certificati dal NIST. È stata definita la
  256 variabile ``numero minimo di cifre corrette'' per una data stima come il
  257 numero di cifre significative per cui la \emph{meno accurata} delle
  258 stime di \app{gretl} coincide con il valore certificato. La tabella
  259 mostra i valori medio e minimo di questa variabile, calcolati sulle
  260 stime che hanno prodotto una soluzione; la stessa informazione è fornita
  261 per gli errori standard stimati.\footnote{Per gli errori standard, dalle
  262   statistiche mostrate nella tabella, è stato escluso l'outlier
  263   costituito da \verb+Lanczos1+, che rappresenta un caso strano,
  264   composto da dati generati con un adattamento quasi esatto; gli
  265   errori standard sono di 9 o 10 ordini di grandezza più piccoli dei
  266   coefficienti. In questo caso \app{gretl} riesce a riprodurre gli
  267   errori standard solo per 3 cifre (con derivate analitiche) e per 2
  268   cifre (con derivate numeriche).}  
  269 
  270 La seconda misura di accuratezza mostrata è la percentuale di casi,
  271 tenendo conto di tutti i parametri di tutte le stime giunte a buon
  272 fine, in cui la stima di \app{gretl} concorda con il valore
  273 certificato per almeno 6 cifre significative, che sono mostrate in
  274 modo predefinito nei risultati delle regressioni di \app{gretl}.
  275 
  276 \begin{table}[htbp]
  277   \caption{Regressione non lineare: i test NIST}
  278   \label{tab-nls}
  279   \begin{center}
  280     \begin{tabular}{lcc}
  281         & \textit{Derivate analitiche} 
  282         & \textit{Derivate numeriche} \\ [4pt]
  283         Fallimenti in 54 test & 4 & 5\\
  284         Iterazioni medie & 32 & 127\\
  285         Media del "numero minimo di cifre corrette", & 8.120 & 6.980\\
  286         stima dei parametri \\
  287         Valore minimo del "numero minimo di cifre corrette", & 4 & 3 \\
  288         stima dei parametri \\
  289         Media del "numero minimo di cifre corrette", & 8.000 & 5.673\\
  290         stima degli errori standard \\
  291         Valore minimo del "numero minimo di cifre corrette", & 5 & 2\\
  292         stima degli errori standard \\
  293         Percentuale delle stime corrette a 6 cifre, & 96.5 & 91.9\\
  294         stima dei parametri \\
  295         Percentuale delle stime corrette a 6 cifre, & 97.7 & 77.3\\
  296         stima degli errori standard \\
  297       \end{tabular}
  298     \end{center}
  299   \end{table}
  300 
  301   Usando derivate analitiche, i valori dei casi peggiori sia per le
  302   stime dei parametri che per gli errori standard sono stati
  303   migliorati a 6 cifre corrette restringendo il valore di tolleranza a
  304   1.0e$-$14.  Usando derivate numeriche, la stessa modifica del limite
  305   di tolleranza ha innalzato la precisione dei valori peggiori a 5
  306   cifre corrette per i parametri e 3 cifre per gli errori standard, al
  307   costo di un fallimento in più nella convergenza.  
  308 
  309   Si noti la tendenziale superiorità delle derivate analitiche: in
  310   media le soluzioni ai problemi dei test sono state ottenute con
  311   molte meno iterazioni e i risultati sono più accurati (in modo
  312   evidente per gli errori standard stimati). Si noti anche che i
  313   risultati a 6 cifre mostrati da \app{gretl} non sono affidabili al
  314   100 per cento per i problemi non lineari difficili (in particolare
  315   se si usano derivate numeriche). Tenendo presente questi limiti, la
  316   percentuale dei casi in cui i risultati sono accurati alla sesta
  317   cifra o più sembra sufficiente per giustificarne l'utilizzo in
  318   questa forma.
  319 
  320 %%% Local Variables: 
  321 %%% mode: latex
  322 %%% TeX-master: "gretl-guide-it"
  323 %%% End: 
  324