npstat is hosted by Hepforge, IPPP Durham
NPStat  5.10.0
EllipticalDistributions.hh
Go to the documentation of this file.
1 #ifndef NPSTAT_ELLIPTICALDISTRIBUTIONS_HH_
2 #define NPSTAT_ELLIPTICALDISTRIBUTIONS_HH_
3 
4 /*!
5 // \file EllipticalDistributions.hh
6 //
7 // \brief A few concrete examples of multivariate elliptical ditributions
8 // with simple parameters
9 //
10 // Author: I. Volobouev
11 //
12 // September 2022
13 */
14 
20 
21 // The distributions below are taken from Chapter 3 of the
22 // monograph "Symmetric Multivariate and Related Distributions"
23 // by K.-T. Fang, S. Kotz and K. W. Ng, CRC Press, 1990.
24 namespace npstat {
25  /**
26  // EllipticalNormal is the same distribution as GaussND.
27  // The transformation matrix in the constructor is just
28  // the square root of the desired covariance matrix.
29  */
31  {
32  public:
33  inline EllipticalNormal(const double* location1, unsigned dim1,
34  const Matrix<double>& transformationMatrix)
35  : EllipticalDistribution(location1, dim1,
36  transformationMatrix,
37  Exponential1D(0.0, 2.0),
38  Gamma1D(0.0, 2.0, dim1/2.0)) {}
39 
40  inline virtual ~EllipticalNormal() {}
41 
42  // Methods needed for I/O
43  inline virtual gs::ClassId classId() const {return gs::ClassId(*this);}
44  inline virtual bool write(std::ostream& os) const
45  {
46  return EllipticalDistribution::classId().write(os) &&
47  EllipticalDistribution::write(os);
48  }
49 
50  static inline const char* classname()
51  {return "npstat::EllipticalNormal";}
52  static inline unsigned version() {return 1;}
53  static inline EllipticalNormal* read(
54  const gs::ClassId& id, std::istream& in)
55  {
56  static const gs::ClassId current(
57  gs::ClassId::makeId<EllipticalNormal>());
58  current.ensureSameId(id);
59  CPP11_auto_ptr<EllipticalDistribution> pb =
60  gs::read_obj<EllipticalDistribution>(in);
61  return new EllipticalNormal(*pb);
62  }
63 
64  private:
65  inline EllipticalNormal(const EllipticalDistribution& b)
67 
68 #ifdef SWIG
69  public:
70  inline EllipticalNormal(const double* location1, unsigned dim1,
71  const double* transform, unsigned nrows, unsigned ncols)
72  : EllipticalDistribution(location1, dim1,
73  transform, nrows, ncols,
74  Exponential1D(0.0, 2.0),
75  Gamma1D(0.0, 2.0, dim1/2.0)) {}
76 #endif // SWIG
77  };
78 
80  {
81  public:
82  /** For this distribution we must have s > 0, r > 0, 2*N + dim1 > 2 */
83  inline EllipticalKotz(const double* location1, unsigned dim1,
84  const Matrix<double>& transformationMatrix,
85  const unsigned N, const double r, const double s)
87  location1, dim1, transformationMatrix,
88  TransformedDistribution1D(PowerTransform1D(r, s), Gamma1D(0.0, 1.0, N/s)),
89  TransformedDistribution1D(PowerTransform1D(r, s), Gamma1D(0.0, 1.0, (N+dim1/2.0-1)/s))),
90  N_(N), r_(r), s_(s) {calcNorm();}
91 
92  inline virtual ~EllipticalKotz() {}
93 
94  virtual double density(const double* location1, unsigned dim1) const;
95 
96  // Methods needed for I/O
97  inline virtual gs::ClassId classId() const {return gs::ClassId(*this);}
98  virtual bool write(std::ostream& os) const;
99 
100  static inline const char* classname()
101  {return "npstat::EllipticalKotz";}
102  static inline unsigned version() {return 1;}
103  static EllipticalKotz* read(const gs::ClassId& id, std::istream& in);
104 
105  protected:
106  inline virtual bool isEqual(const AbsDistributionND& other) const
107  {
108  const EllipticalKotz& r = static_cast<const EllipticalKotz&>(other);
109  return EllipticalDistribution::isEqual(r) &&
110  N_ == r.N_ && r_ == r.r_ && s_ == r.s_;
111  }
112 
113  private:
114  void calcNorm();
115 
116  inline EllipticalKotz(const EllipticalDistribution& b,
117  const unsigned N, const double r, const double s)
119  N_(N), r_(r), s_(s) {calcNorm();}
120 
121  unsigned N_;
122  double r_;
123  double s_;
124  double norm_;
125 
126 #ifdef SWIG
127  public:
128  inline EllipticalKotz(const double* location1, unsigned dim1,
129  const double* transform, unsigned nrows, unsigned ncols,
130  const unsigned N, const double r, const double s)
132  location1, dim1, transform, nrows, ncols,
133  TransformedDistribution1D(PowerTransform1D(r, s), Gamma1D(0.0, 1.0, N/s)),
134  TransformedDistribution1D(PowerTransform1D(r, s), Gamma1D(0.0, 1.0, (N+dim1/2.0-1)/s))),
135  N_(N), r_(r), s_(s) {calcNorm();}
136 #endif // SWIG
137  };
138 
140  {
141  public:
142  /**
143  // In the constructor we must have s > 0, 2*N > dim1.
144  // Also, the current implementation is limited to N < 7.
145  */
146  inline EllipticalPearsonTypeVII(const double* location1, unsigned dim1,
147  const Matrix<double>& transformationMatrix,
148  const unsigned N, const double s)
150  location1, dim1, transformationMatrix,
151  PowerRatio1D(0.0, s, 0, N),
152  PowerRatio1D(0.0, s, static_cast<int>(dim1)-2, N)) {}
153 
154  inline virtual ~EllipticalPearsonTypeVII() {}
155 
156  // Methods needed for I/O
157  inline virtual gs::ClassId classId() const {return gs::ClassId(*this);}
158  inline virtual bool write(std::ostream& os) const
159  {
160  return EllipticalDistribution::classId().write(os) &&
161  EllipticalDistribution::write(os);
162  }
163 
164  static inline const char* classname()
165  {return "npstat::EllipticalPearsonTypeVII";}
166  static inline unsigned version() {return 1;}
167  static inline EllipticalPearsonTypeVII* read(
168  const gs::ClassId& id, std::istream& in)
169  {
170  static const gs::ClassId current(
171  gs::ClassId::makeId<EllipticalPearsonTypeVII>());
172  current.ensureSameId(id);
173  CPP11_auto_ptr<EllipticalDistribution> pb =
174  gs::read_obj<EllipticalDistribution>(in);
175  return new EllipticalPearsonTypeVII(*pb);
176  }
177 
178  private:
179  inline EllipticalPearsonTypeVII(const EllipticalDistribution& b)
180  : EllipticalDistribution(b) {}
181 
182 #ifdef SWIG
183  public:
184  inline EllipticalPearsonTypeVII(const double* location1, unsigned dim1,
185  const double* transform, unsigned nrows, unsigned ncols,
186  const unsigned N, const double s)
188  location1, dim1, transform, nrows, ncols,
189  PowerRatio1D(0.0, s, 0, N),
190  PowerRatio1D(0.0, s, static_cast<int>(dim1)-2, N)) {}
191 #endif // SWIG
192  };
193 
195  {
196  public:
197  /**
198  // Not sure why Pearson type II elliptical distribution does not have
199  // the "s" parameter in the Fang's book. Here it is included, similar
200  // to Pearson type VII.
201  */
202  inline EllipticalPearsonTypeII(const double* location1, unsigned dim1,
203  const Matrix<double>& transformationMatrix,
204  const unsigned m, const double s)
205  : EllipticalDistribution(location1, dim1,
206  transformationMatrix,
207  Beta1D(0.0, s, 1.0, m+1U),
208  Beta1D(0.0, s, dim1/2.0, m+1U)) {}
209 
210  inline virtual ~EllipticalPearsonTypeII() {}
211 
212  // Methods needed for I/O
213  inline virtual gs::ClassId classId() const {return gs::ClassId(*this);}
214  inline virtual bool write(std::ostream& os) const
215  {
216  return EllipticalDistribution::classId().write(os) &&
217  EllipticalDistribution::write(os);
218  }
219 
220  static inline const char* classname()
221  {return "npstat::EllipticalPearsonTypeII";}
222  static inline unsigned version() {return 1;}
223  static inline EllipticalPearsonTypeII* read(
224  const gs::ClassId& id, std::istream& in)
225  {
226  static const gs::ClassId current(
227  gs::ClassId::makeId<EllipticalPearsonTypeII>());
228  current.ensureSameId(id);
229  CPP11_auto_ptr<EllipticalDistribution> pb =
230  gs::read_obj<EllipticalDistribution>(in);
231  return new EllipticalPearsonTypeII(*pb);
232  }
233 
234  private:
235  inline EllipticalPearsonTypeII(const EllipticalDistribution& b)
236  : EllipticalDistribution(b) {}
237 
238 #ifdef SWIG
239  public:
240  inline EllipticalPearsonTypeII(const double* location1, unsigned dim1,
241  const double* transform, unsigned nrows, unsigned ncols,
242  const unsigned m, const double s)
243  : EllipticalDistribution(location1, dim1,
244  transform, nrows, ncols,
245  Beta1D(0.0, s, 1.0, m+1U),
246  Beta1D(0.0, s, dim1/2.0, m+1U)) {}
247 #endif // SWIG
248  };
249 }
250 
251 #endif // NPSTAT_ELLIPTICALDISTRIBUTIONS_HH_
A number of useful 1-d continuous statistical distributions.
Multivariate elliptical ditributions.
Distribution with unscaled density proportional to x^m/(1 + x)^n for x >= 0 (and 0 for x < 0)....
Transform y = a x^p (a > 0). Obviously, works only for non-negative x. x must be strictly positive if...
Distribution in x for the given transform y(x) and distribution in y.
Definition: Distributions1D.hh:554
Definition: EllipticalDistribution.hh:23
EllipticalDistribution(const double *location, unsigned dim, const Matrix< double > &transformationMatrix, const AbsDistribution1D &gDistro, const AbsDistribution1D &hDistro)
virtual gs::ClassId classId() const
Definition: EllipticalDistribution.hh:79
Definition: EllipticalDistributions.hh:80
virtual double density(const double *location1, unsigned dim1) const
virtual gs::ClassId classId() const
Definition: EllipticalDistributions.hh:97
EllipticalKotz(const double *location1, unsigned dim1, const Matrix< double > &transformationMatrix, const unsigned N, const double r, const double s)
Definition: EllipticalDistributions.hh:83
Definition: EllipticalDistributions.hh:31
virtual gs::ClassId classId() const
Definition: EllipticalDistributions.hh:43
Definition: EllipticalDistributions.hh:195
EllipticalPearsonTypeII(const double *location1, unsigned dim1, const Matrix< double > &transformationMatrix, const unsigned m, const double s)
Definition: EllipticalDistributions.hh:202
virtual gs::ClassId classId() const
Definition: EllipticalDistributions.hh:213
Definition: EllipticalDistributions.hh:140
virtual gs::ClassId classId() const
Definition: EllipticalDistributions.hh:157
EllipticalPearsonTypeVII(const double *location1, unsigned dim1, const Matrix< double > &transformationMatrix, const unsigned N, const double s)
Definition: EllipticalDistributions.hh:146
Definition: Distributions1D.hh:100
Definition: Distributions1D.hh:597
Definition: PowerRatio1D.hh:20
Definition: PowerTransform1D.hh:19
Definition: TransformedDistribution1D.hh:19
Definition: AbsArrayProjector.hh:14