Chapter 12. Loop constructs
90
While loop
Asecond sort of control expression takes the form of the keyword while followed by a boolean
expression. For example,
loop while essdiff > .00001
Execution of the commands within the loop will continue so long as (a) the specified condition
evaluates as true and(b) the number ofiterations does not exceedthe value ofthe internal variable
loop_maxiter. By default this equals 100000, but you can specify a different value (or remove the
limit) via the set command (see the Gretl Command Reference).
Index loop
Athirdform of loopcontrol usesan indexvariable, for example i.1 In thiscase you specify starting
and endingvaluesfor the index, which is incremented by one each time roundthe loop. The syntax
looks like this: loop i=1..20.
The index variable may be a pre-existing scalar; if this is not the case, the variable is created
automatically and is destroyed on exit from the loop.
The indexmay be usedwithin the loop body in either of two ways: you can access the integer value
of i or you can use its string representation, $i.
The starting and ending values for the index can be given in numerical form, by reference to pre-
defined scalar variables, or as expressions that evaluate to scalars. In the latter two cases the
variables are evaluated once, at the start of the loop. In addition, with time series data you can give
the starting and ending values in the form of dates, as in loop i=1950:1..1999:4.
This form of loop control is intended to be quick and easy, and as such it is subject to certain
limitations. In particular, the index variable is always incremented by one at each iteration. If, for
example, you have
loop i=m..n
where m and n are scalar variables with values m > n at the time of execution, the index will not be
decremented; rather, the loop will simply be bypassed.
If you need more complexloop control, see the “for” form below.
The index loop is particularly useful in conjunction with the values() matrix function when some
operation must be carried out for each value of some discrete variable (see chapter11). Consider
the following example:
open greene22_2
discrete Z8
v8 = values(Z8)
loop i=1..rows(v8)
scalar xi = v8[i]
smpl (Z8=xi) --restrict --replace
printf "mean(Y | Z8 = %g) = %8.5f, sd(Y | Z8 = %g) = %g\n", \
xi, mean(Y), xi, sd(Y)
endloop
In this case, we evaluate the conditional mean and standard deviation of the variable Y for each
value of Z8.
1
It is common programming practice to use simple, one-character names for such variables. However, you may use
any name that is acceptable by gretl: up to 31 characters, starting with a letter, and containing nothing but letters,
numerals andthe underscore character.
Copying image from pdf to powerpoint - Library application class:C# Create PDF from PowerPoint Library to convert pptx, ppt to PDF in C#.net, ASP.NET MVC, WinForms, WPF
Online C# Tutorial for Creating PDF from Microsoft PowerPoint Presentation
www.rasteredge.com
Copying image from pdf to powerpoint - Library application class:VB.NET Create PDF from PowerPoint Library to convert pptx, ppt to PDF in vb.net, ASP.NET MVC, WinForms, WPF
VB.NET Tutorial for Export PDF file from Microsoft Office PowerPoint
www.rasteredge.com
Chapter 12. Loop constructs
91
Foreach loop
The fourth form of loop control also uses an index variable, in this case to index a specified list
of strings. The loop is executed once for each string in the list. This can be useful for performing
repetitive operations on a list of variables. Here is an example of the syntax:
loop foreach i peach pear plum
print "$i"
endloop
This loop will execute three times, printing out “peach”, “pear” and “plum” on the respective itera-
tions. The numerical value of the index starts at 1 and is incremented by 1 at each iteration.
If you wish to loop across a list of variables that are contiguous in the dataset, you can give the
names of the first and last variables in the list, separated by “..”, rather than having to type all
the names. For example, say we have 50 variables AK, AL, ..., WY, containing income levels for the
states of the US. To run a regression of income on time for each of the states we could do:
genr time
loop foreach i AL..WY
ols $i const time
endloop
This loop variant can also be usedfor looping across the elements in a named list (see chapter14).
For example:
list ylist = y1 y2 y3
loop foreach i ylist
ols $i const x1 x2
endloop
Note that ifyou use thisidiom inside a function (see chapter13),looping across a list that hasbeen
supplied to the function as an argument, it is necessary to use the syntax listname.$i to reference
the list-member variables. In the context ofthe example above,this would mean replacing the third
line with
ols ylist.$i const x1 x2
For loop
The final form of loop control emulates the for statement in the C programming language. The
sytax is loop for, followed by three component expressions, separated by semicolons and sur-
roundedby parentheses. The three components are as follows:
1. Initialization: This is evaluated only once, at the start of the loop. Common example: setting
ascalar control variable to some starting value.
2. Continuation condition: this is evaluated at the top of each iteration (including the first). If
the expression evaluates as true (non-zero), iteration continues, otherwise it stops. Common
example: an inequality expressing a bound on a control variable.
3. Modifier: an expression which modifies the value of some variable. This is evaluated prior
to checking the continuation condition, on each iteration after the first. Common example: a
control variable is incremented or decremented.
Here’s a simple example:
Library application class:C# PDF copy, paste image Library: copy, paste, cut PDF images in
project. Visual C# class source code for copying, pasting, cutting image from PDF in Visual Studio .NET framework program. Support
www.rasteredge.com
Library application class:VB.NET PDF copy, paste image library: copy, paste, cut PDF images
to Another in VB.NET. .NET framework PDF editor SDK control for image copying, pasting and cutting from adobe PDF file in VB.NET.
www.rasteredge.com
Chapter 12. Loop constructs
92
loop for (r=0.01; r<.991; r+=.01)
In this example the variable r will take on the values 0.01, 0.02, ..., 0.99 across the 99 iterations.
Note that due to the finite precision of floating point arithmetic on computers it may be necessary
to use a continuation condition such as the above, r<.991, rather than the more “natural” r<=.99.
(Using double-precision numbers on an x86 processor, at the point where you would expect r to
equal 0.99 it may in fact have value 0.990000000000001.)
Any or all of the three expressions governing a for loop may be omitted—the minimal form is
(;;). If the continuation test is omittedit is implicitly true, so you have an infinite loop unless you
arrange for some other way out, such as a break statement.
If the initialization expression in a for loop takes the common form of setting a scalar variable to
agiven value, the string representation of that scalar’s value is made available within the loop via
the accessor $varname.
12.3 Progressive mode
If the --progressive option is given for a command loop, special behavior is invoked for certain
commands, namely, print, store and simple estimation commands. By “simple” here we mean
commands which (a) estimate a single equation (as opposed to a system of equations) and (b) do
so by means of a single commandstatement (as opposed to a block of statements, as with nls and
mle). The paradigm is ols; other possibilities include tsls, wls, logit and so on.
The special behavior is as follows.
Estimators: The results from each individual iteration of the estimator are not printed. Instead,
after the loop is completed you get a printout of (a) the mean value of each estimated coefficient
across all the repetitions, (b) the standard deviation of those coefficient estimates, (c) the mean
value of the estimated standard error for each coefficient, and (d) the standard deviation of the
estimated standard errors. This makes sense only if there is some random input at each step.
print: When this command is usedto print the value of a variable, you do not get a print each time
round the loop. Instead, when the loop is terminated you get a printout of the mean and standard
deviation of the variable, across the repetitions of the loop. This mode is intended for use with
variables that have a scalar value at each iteration, for example the error sum of squares from a
regression. Data series cannot be printed in this way, and neither can matrices.
store: This command writes out the values of the specified scalars, from each time round the
loop, to a specified file. Thus it keeps a complete record of their values across the iterations. For
example, coefficient estimates could be saved in this way so as to permit subsequent examination
of their frequency distribution. Only one such store can be used in a given loop.
12.4 Loop examples
Monte Carlo example
Asimple example of a Monte Carlo loop in “progressive” mode is shown in Example12.1.
This loop will print out summary statistics for the ‘a’ and ‘b’ estimates and R
2
across the 100 rep-
etitions. After running the loop, coeffs.gdt, which contains the individual coefficient estimates
from all the runs, can be opened in gretl to examine the frequency distribution of the estimates in
detail.
The command nulldata is useful for Monte Carlo work. Instead of opening a “real” data set,
nulldata 50 (for instance) opens a dummy data set, containing just a constant and an index
variable, with a series length of50. Constructedvariables can then be added. See the set command
for information on generating repeatable pseudo-random series.
Library application class:C# PDF File Permission Library: add, remove, update PDF file
Image: Copy, Paste, Cut Image in Page. Link: Edit URL. Choose to offer PDF annotation and content extraction Enable or disable copying and form filling functions.
www.rasteredge.com
Library application class:C# PDF Page Extract Library: copy, paste, cut PDF pages in C#.net
NET application. Online C# source code for extracting, copying and pasting PDF pages in C#.NET console class. Support .NET WinForms
www.rasteredge.com
Chapter 12. Loop constructs
93
Example 12.1: Simple Monte Carlo loop
nulldata 50
set seed 547
series x = 100 * uniform()
# open a "progressive" loop, to be repeated 100 times
loop 100 --progressive
series u = 10 * normal()
# construct the dependent variable
series y = 10*x + u
# run OLS regression
ols y const x
# grab the coefficient estimates and R-squared
scalar a = $coeff(const)
scalar b = $coeff(x)
scalar r2 = $rsq
# arrange for printing of stats on these
print a b r2
# and save the coefficients to file
store coeffs.gdt a b
endloop
Iterated least squares
Example12.2 uses a “while” loop to replicate the estimation of a nonlinear consumption function
of the form
C Y

as presented inGreene(2000), Example 11.3. This script is included in the gretl distribution under
the name greene11_3.inp; you can find it in gretl under the menu item “File, Script files, Practice
file, Greene...”.
The option --print-final for the ols command arranges matters so that the regression results
will not beprintedeach time roundthe loop, but the resultsfrom the regression on the last iteration
will be printed when the loop terminates.
Example12.3 shows how a loop can be used to estimate an ARMA model, exploiting the “outer
product of the gradient” (OPG) regression discussed byDavidsonandMacKinnon(1993).
Further examples of loop usage that may be of interest can be found in chapter16.
Library application class:VB.NET PDF File Permission Library: add, remove, update PDF file
NET PDF Windows Viewer, C#.NET convert image to PDF Choose to offer PDF annotation and content extraction Enable or disable copying and form filling functions.
www.rasteredge.com
Library application class:C# HTML5 PDF Viewer SDK to view, annotate, create and convert PDF
protect PDF document from editing, printing, copying and commenting Such as Word, Excel, PowerPoint, Tiff, images and other C#.NET: Edit PDF Image in ASP.NET.
www.rasteredge.com
Chapter 12. Loop constructs
94
Example 12.2: Nonlinearconsumption function
open greene11_3.gdt
# run initial OLS
ols C 0 Y
scalar essbak = $ess
scalar essdiff = 1
scalar beta = $coeff(Y)
scalar gamma = 1
# iterate OLS till the error sum of squares converges
loop while essdiff > .00001
# form the linearized variables
series C0 = C + gamma * beta * Y^gamma * log(Y)
series x1 = Y^gamma
series x2 = beta * Y^gamma * log(Y)
# run OLS
ols C0 0 x1 x2 --print-final --no-df-corr --vcv
beta = $coeff[2]
gamma = $coeff[3]
ess = $ess
essdiff = abs(ess - essbak)/essbak
essbak = ess
endloop
# print parameter estimates using their "proper names"
printf "alpha = %g\n", $coeff[1]
printf "beta = %g\n", beta
printf "gamma = %g\n", gamma
Library application class:C# PDF Convert to Word SDK: Convert PDF to Word library in C#.net
remove watermark and save PDF text, image, table, hyperlink Password protected PDF file can be printed to Word source code is available for copying and using
www.rasteredge.com
Library application class:C# PDF File & Page Process Library SDK for C#.net, ASP.NET, MVC
Image: Copy, Paste, Cut Image in Page. Link: Edit URL. Bookmark: Edit RasterEdge XDoc.PDF allows you to easily move PDF document pages Copying and Pasting Pages.
www.rasteredge.com
Chapter 12. Loop constructs
95
Example 12.3: ARMA 1, 1
# Estimation of an ARMA(1,1) model "manually", using a loop
open arma.gdt
scalar c = 0
scalar a = 0.1
scalar m = 0.1
series e = 0.0
series de_c = e
series de_a = e
series de_m = e
scalar crit = 1
loop while crit > 1.0e-9 --quiet
# one-step forecast errors
e = y - c - a*y(-1) - m*e(-1)
# log-likelihood
scalar loglik = -0.5 * sum(e^2)
print loglik
# partials of e with respect to c, a, and m
de_c = -1 - m * de_c(-1)
de_a = -y(-1) -m * de_a(-1)
de_m = -e(-1) -m * de_m(-1)
# partials of l with respect to c, a and m
series sc_c = -de_c * e
series sc_a = -de_a * e
series sc_m = -de_m * e
# OPG regression
ols const sc_c sc_a sc_m --print-final --no-df-corr --vcv
# Update the parameters
c += $coeff[1]
a += $coeff[2]
m += $coeff[3]
# show progress
printf " constant
= %.8g (gradient %#.6g)\n", c, $coeff[1]
printf " ar1 coefficient = %.8g (gradient %#.6g)\n", a, $coeff[2]
printf " ma1 coefficient = %.8g (gradient %#.6g)\n", m, $coeff[3]
crit = $T - $ess
print crit
endloop
scalar se_c = $stderr[1]
scalar se_a = $stderr[2]
scalar se_m = $stderr[3]
printf "\n"
printf "constant
= %.8g (se = %#.6g, t = %.4f)\n", c, se_c, c/se_c
printf "ar1 coefficient = %.8g (se = %#.6g, t = %.4f)\n", a, se_a, a/se_a
printf "ma1 coefficient = %.8g (se = %#.6g, t = %.4f)\n", m, se_m, m/se_m
Library application class:VB.NET PDF File & Page Process Library SDK for vb.net, ASP.NET
The PDFDocument instance may consist of newly created blank pages or image-only pages from an image source. PDF Pages Extraction, Copying and Pasting.
www.rasteredge.com
Library application class:.NET PDF SDK - Description of All PDF Processing Control Feastures
Create PDF from Excel (xlsx, xls); Create PDF from PowerPoint (pptx, ppt PDF page extraction, copying and pasting allow users to move PDF pages; PDF Image Process
www.rasteredge.com
Chapter 13
User-defined functions
13.1 Defining a function
Gretl offers a mechanism for defining functions, which may be called via the command line, in
the context of a script, or (if packaged appropriately, see section13.5) via the program’s graphical
interface.
The syntaxfor defining a function looks like this:
1
function return-type function-name (parameters)
function body
end function
The opening line of a function definition contains these elements, in strict order:
1. The keyword function.
2. return-type, which states the type of value returned by the function, if any. This must be one
of void (if the function does not return anything), scalar, series, matrix, list, string or
bundle.
3. function-name, the unique identifier forthe function. Function names have a maximum length
of 31 characters; they must start with a letter and can contain only letters, numerals and the
underscore character. You will get an error if you try to define a function having the same
name as an existing gretl command.
4. The function’s parameters, in the form of a comma-separated list enclosed in parentheses.
This may be run into the function name, or separated by white space as shown. In case the
function takes no arguments (unusual, but acceptable) this should be indicated by placing the
keyword void between the parameter-list parentheses.
Function parameters can be of any of the types shown below.2
Type
Description
bool
scalar variable acting as a Boolean switch
int
scalar variable acting as an integer
scalar
scalar variable
series
data series
list
named list of series
matrix
matrixor vector
string
string variable or string literal
bundle
all-purpose container (see section10.7)
1Asomewhatdifferentsyntaxwasinforcepriortogretlversion1.8.4,andremainedacceptableuptoversion1.9.90.
The old syntax isnolonger supported; see section13.6 for detailson updating.
2
An additionalparameter type is available for GUI use, namely obs; thisisequivalent toint except for theway itis
represented inthe graphicalinterface for calling afunction.
96
Chapter 13. User-defined functions
97
Each element in the listing of parameters must include two terms: a type specifier, and the name
by which the parameter shall be known within the function. An example follows:
function scalar myfunc (series y, list xvars, bool verbose)
Each of the type-specifiers,with the exception of list and string, may be modifiedby prepending
an asterisk to the associated parameter name, as in
function scalar myfunc (series *y, scalar *b)
The meaning of this modification is explained below (see section13.4); it is related to the use of
pointer arguments in the C programming language.
Function parameters: optional refinements
Besides the required elements mentioned above, the specification of a function parameter may
include some additional fields, as follows:
 The const modifier.
 For scalar or int parameters: minimum, maximum and/or default values; or for bool pa-
rameters, just a default value.
 For optional arguments in pointer form, and additionally for string or list arguments in stan-
dard form (see section13.4), the special default value null.
 For all parameters, a descriptive string.
 For int parameterswith minimum andmaximum values specified, a set ofstrings toassociate
with the allowed numerical values (value labels).
The first two of these options may be useful in many contexts; the last two may be helpful if a
function is to be packagedfor use in the gretl GUI(but probably not otherwise). We nowexpand on
each of the options.
 The const modifier: must be given as a prefix to the basic parameter specification, as in
const matrix M
This constitutes a promise that the corresponding argument will not be modified within the
function; gretl will flag an error if the function attempts to modify the argument.
 Minimum, maximum and default values for scalar or int types: These values should di-
rectly follow the name of the parameter, enclosed in square brackets and with the individual
elements separated by colons. For example, suppose we have an integer parameter order for
which we wish to specify a minimum of1, a maximum of 12, and a default of4. We can write
int order[1:12:4]
If you wish to omit any of the three specifiers, leave the corresponding field empty. For
example [1::4] would specify a minimum of1 and a default of 4 while leaving the maximum
unlimited. However, as a special case, it is acceptable to give just one value, with no colons:
in that case the value is interpreted as a default. So for example
int k[0]
designates a default value of 0 for the parameter k, with no minimum or maximum specified.
If you wished to specify a minimum of zero with no maximum or default you would have to
write
Chapter 13. User-defined functions
98
int k[0::]
For a parameter of type bool (whose values are just zero or non-zero), you can specify a
default of 1 (true) or 0 (false), as in
bool verbose[0]
 Descriptive string: This will show up as an aid to the user if the function is packaged (see
section13.5 below) and called via gretl’s graphical interface. The string should be enclosed
in double quotes and separated from the preceding elements of the parameter specification
with a space, as in
series y "dependent variable"
 Value labels: These may be used only with int parameters for which minimum and maximum
values have been specified, so there is a fixed number of admissible values, and the number
of labels must match the number of values. They will show up in the graphical interface
in the form of a drop-down list, making the function writer’s intent clearer when an integer
argument represents a categorical selection. A set ofvalue labels must be enclosed in braces,
and the individual labels must be enclosed in double quotes and separated by commas or
spaces. For example:
int case[1:3:1] {"Fixed effects", "Between model", "Random effects"}
If two or more of the trailing optional fields are given in a parameter specification, they must be
given in the order shown above: min–max–default, description, value labels. Note that there is
no facility for “escaping” characters within descriptive strings or value labels; these may contain
spaces but they cannot contain the double-quote character.
Here is an example of a well-formedfunction specification using all the elements mentionedabove:
function matrix myfunc (series y "dependent variable",
list X "regressors",
int p[0::1] "lag order",
int c[1:2:1] "criterion" {"AIC", "BIC"},
bool quiet[0])
One advantage of specifying default values for parameters, where applicable, is that in script or
command-line mode users may omit trailing arguments that have defaults. For example, myfunc
above could be invoked with just two arguments, corresponding to y and X; implicitly p = 1, c = 1
and quiet is false.
Functions taking no parameters
You maydefinea function that hasnoparameters(these are called“routines” in some programming
languages). In this case, use the keyword void in place of the listing of parameters:
function matrix myfunc2 (void)
The function body
The function body is composed of gretl commands, or calls to user-defined functions (that is,
function calls may be nested). A function may call itself(that is, functions may be recursive). While
the function body may contain function calls, it may not contain function definitions. That is, you
cannot define a function inside another function. For further details, see section13.4.
Chapter 13. User-defined functions
99
13.2 Calling a function
A user function is called by typing its name followed by zero or more arguments enclosed in
parentheses. If there are two or more arguments these should be separatedby commas.
There are automatic checks in place to ensure that the number of arguments given in a function
call matches the number of parameters, andthat the typesof the given arguments match the types
specifiedin thedefinition ofthe function. An error isflaggedifeitheroftheseconditionsisviolated.
One qualification: allowance is made for omitting arguments at the end of the list, provided that
default values are specified in the function definition. To be precise, the check is that the number
of arguments is at least equal to the number of required parameters, and is no greater than the
total number of parameters.
Ascalar, series or matrix argument to a function may be given either as the name of a pre-existing
variable or asan expression which evaluatesto a variable ofthe appropriate type. Scalar arguments
may also be given as numerical values. List arguments must be specifiedby name.
The following trivial example illustrates a function call that correctly matches the function defini-
tion.
# function definition
function scalar ols_ess(series y, list xvars)
ols y 0 xvars --quiet
scalar myess = $ess
printf "ESS = %g\n", myess
return myess
end function
# main script
open data4-1
list xlist = 2 3 4
# function call (the return value is ignored here)
ols_ess(price, xlist)
The function call gives two arguments: the first is a data series specified by name and the second
is a named list of regressors. Note that while the function offers the variable myess as a return
value, it is ignored by the caller in this instance. (As a side note here, if you want a function to
calculate some value having to do with a regression, but are not interested in the full results of the
regression, you may wish to use the --quiet flag with the estimation command as shown above.)
Asecondexample shows how to write a function call that assigns a return value to a variable in the
caller:
# function definition
function series get_uhat(series y, list xvars)
ols y 0 xvars --quiet
series uh = $uhat
return uh
end function
# main script
open data4-1
list xlist = 2 3 4
# function call
series resid = get_uhat(price, xlist)
13.3 Deleting a function
Ifyou have defined a function andsubsequently wish to clear it out ofmemory,you can do so using
the keywords delete or clear, as in
Documents you may be interested
Documents you may be interested