1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
|
// laplace_example.cpp
// Copyright Paul A. Bristow 2008, 2010.
// Use, modification and distribution are subject to the
// Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt
// or copy at http://www.boost.org/LICENSE_1_0.txt)
// Example of using laplace (& comparing with normal) distribution.
// Note that this file contains Quickbook mark-up as well as code
// and comments, don't change any of the special comment mark-ups!
//[laplace_example1
/*`
First we need some includes to access the laplace & normal distributions
(and some std output of course).
*/
#include <boost/math/distributions/laplace.hpp> // for laplace_distribution
using boost::math::laplace; // typedef provides default type is double.
#include <boost/math/distributions/normal.hpp> // for normal_distribution
using boost::math::normal; // typedef provides default type is double.
#include <iostream>
using std::cout; using std::endl; using std::left; using std::showpoint; using std::noshowpoint;
#include <iomanip>
using std::setw; using std::setprecision;
#include <limits>
using std::numeric_limits;
int main()
{
cout << "Example: Laplace distribution." << endl;
try
{
{ // Traditional tables and values.
/*`Let's start by printing some traditional tables.
*/
double step = 1.; // in z
double range = 4; // min and max z = -range to +range.
//int precision = 17; // traditional tables are only computed to much lower precision.
int precision = 4; // traditional table at much lower precision.
int width = 10; // for use with setw.
// Construct standard laplace & normal distributions l & s
normal s; // (default location or mean = zero, and scale or standard deviation = unity)
cout << "Standard normal distribution, mean or location = "<< s.location()
<< ", standard deviation or scale = " << s.scale() << endl;
laplace l; // (default mean = zero, and standard deviation = unity)
cout << "Laplace normal distribution, location = "<< l.location()
<< ", scale = " << l.scale() << endl;
/*` First the probability distribution function (pdf).
*/
cout << "Probability distribution function values" << endl;
cout << " z PDF normal laplace (difference)" << endl;
cout.precision(5);
for (double z = -range; z < range + step; z += step)
{
cout << left << setprecision(3) << setw(6) << z << " "
<< setprecision(precision) << setw(width) << pdf(s, z) << " "
<< setprecision(precision) << setw(width) << pdf(l, z)<< " ("
<< setprecision(precision) << setw(width) << pdf(l, z) - pdf(s, z) // difference.
<< ")" << endl;
}
cout.precision(6); // default
/*`Notice how the laplace is less at z = 1 , but has 'fatter' tails at 2 and 3.
And the area under the normal curve from -[infin] up to z,
the cumulative distribution function (cdf).
*/
// For a standard distribution
cout << "Standard location = "<< s.location()
<< ", scale = " << s.scale() << endl;
cout << "Integral (area under the curve) from - infinity up to z " << endl;
cout << " z CDF normal laplace (difference)" << endl;
for (double z = -range; z < range + step; z += step)
{
cout << left << setprecision(3) << setw(6) << z << " "
<< setprecision(precision) << setw(width) << cdf(s, z) << " "
<< setprecision(precision) << setw(width) << cdf(l, z) << " ("
<< setprecision(precision) << setw(width) << cdf(l, z) - cdf(s, z) // difference.
<< ")" << endl;
}
cout.precision(6); // default
/*`
Pretty-printing a traditional 2-dimensional table is left as an exercise for the student,
but why bother now that the Boost Math Toolkit lets you write
*/
double z = 2.;
cout << "Area for gaussian z = " << z << " is " << cdf(s, z) << endl; // to get the area for z.
cout << "Area for laplace z = " << z << " is " << cdf(l, z) << endl; //
/*`
Correspondingly, we can obtain the traditional 'critical' values for significance levels.
For the 95% confidence level, the significance level usually called alpha,
is 0.05 = 1 - 0.95 (for a one-sided test), so we can write
*/
cout << "95% of gaussian area has a z below " << quantile(s, 0.95) << endl;
cout << "95% of laplace area has a z below " << quantile(l, 0.95) << endl;
// 95% of area has a z below 1.64485
// 95% of laplace area has a z below 2.30259
/*`and a two-sided test (a comparison between two levels, rather than a one-sided test)
*/
cout << "95% of gaussian area has a z between " << quantile(s, 0.975)
<< " and " << -quantile(s, 0.975) << endl;
cout << "95% of laplace area has a z between " << quantile(l, 0.975)
<< " and " << -quantile(l, 0.975) << endl;
// 95% of area has a z between 1.95996 and -1.95996
// 95% of laplace area has a z between 2.99573 and -2.99573
/*`Notice how much wider z has to be to enclose 95% of the area.
*/
}
//] [/[laplace_example1]
}
catch(const std::exception& e)
{ // Always useful to include try & catch blocks because default policies
// are to throw exceptions on arguments that cause errors like underflow, overflow.
// Lacking try & catch blocks, the program will abort without a message below,
// which may give some helpful clues as to the cause of the exception.
std::cout <<
"\n""Message from thrown exception was:\n " << e.what() << std::endl;
}
return 0;
} // int main()
/*
Output is:
Example: Laplace distribution.
Standard normal distribution, mean or location = 0, standard deviation or scale = 1
Laplace normal distribution, location = 0, scale = 1
Probability distribution function values
z PDF normal laplace (difference)
-4 0.0001338 0.009158 (0.009024 )
-3 0.004432 0.02489 (0.02046 )
-2 0.05399 0.06767 (0.01368 )
-1 0.242 0.1839 (-0.05803 )
0 0.3989 0.5 (0.1011 )
1 0.242 0.1839 (-0.05803 )
2 0.05399 0.06767 (0.01368 )
3 0.004432 0.02489 (0.02046 )
4 0.0001338 0.009158 (0.009024 )
Standard location = 0, scale = 1
Integral (area under the curve) from - infinity up to z
z CDF normal laplace (difference)
-4 3.167e-005 0.009158 (0.009126 )
-3 0.00135 0.02489 (0.02354 )
-2 0.02275 0.06767 (0.04492 )
-1 0.1587 0.1839 (0.02528 )
0 0.5 0.5 (0 )
1 0.8413 0.8161 (-0.02528 )
2 0.9772 0.9323 (-0.04492 )
3 0.9987 0.9751 (-0.02354 )
4 1 0.9908 (-0.009126 )
Area for gaussian z = 2 is 0.97725
Area for laplace z = 2 is 0.932332
95% of gaussian area has a z below 1.64485
95% of laplace area has a z below 2.30259
95% of gaussian area has a z between 1.95996 and -1.95996
95% of laplace area has a z between 2.99573 and -2.99573
*/
|