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