File: cmtkGeneralLinearModel.h

package info (click to toggle)
cmtk 3.3.1p2%2Bdfsg-4
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 10,524 kB
  • sloc: cpp: 87,098; ansic: 23,347; sh: 3,896; xml: 1,551; perl: 707; makefile: 334
file content (181 lines) | stat: -rw-r--r-- 4,856 bytes parent folder | download | duplicates (5)
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
170
171
172
173
174
175
176
177
178
179
180
181
/*
//
//  Copyright 1997-2009 Torsten Rohlfing
//
//  Copyright 2004-2010 SRI International
//
//  This file is part of the Computational Morphometry Toolkit.
//
//  http://www.nitrc.org/projects/cmtk/
//
//  The Computational Morphometry Toolkit is free software: you can
//  redistribute it and/or modify it under the terms of the GNU General Public
//  License as published by the Free Software Foundation, either version 3 of
//  the License, or (at your option) any later version.
//
//  The Computational Morphometry Toolkit is distributed in the hope that it
//  will be useful, but WITHOUT ANY WARRANTY; without even the implied
//  warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//  GNU General Public License for more details.
//
//  You should have received a copy of the GNU General Public License along
//  with the Computational Morphometry Toolkit.  If not, see
//  <http://www.gnu.org/licenses/>.
//
//  $Revision: 5436 $
//
//  $LastChangedDate: 2018-12-10 19:01:20 -0800 (Mon, 10 Dec 2018) $
//
//  $LastChangedBy: torstenrohlfing $
//
*/

#ifndef __cmtkGeneralLinearModel_h_included_
#define __cmtkGeneralLinearModel_h_included_

#include <cmtkconfig.h>

#include <Base/cmtkTypedArray.h>
#include <Base/cmtkMatrix.h>

#include <System/cmtkSmartPtr.h>
#include <System/cmtkThreads.h>

#include <vector>

namespace
cmtk
{

/** \addtogroup Base */
//@{

/** Pixelwise linear modeling and t statistics of data.
 * \note This class formerly contained a method for 
 * getting the covariance matrix of an SVD.  It has 
 * been removed due to obsolete implementation 
 * (Numerical Recipes) and un-use
 */
class GeneralLinearModel
{
public:
  /// This class.
  typedef GeneralLinearModel Self;

  /// Smart pointer type.
  typedef SmartPointer<Self> SmartPtr;

  /** Constructor.
   * This will take care of SVD of the design matrix and perform all necessary
   * pre-computations for the actual modeling.
   */
  GeneralLinearModel( const size_t nParameters, const size_t nData, const double* designMatrix );
  
  /// Destructor.
  ~GeneralLinearModel();

  /** Get singular value of the SVD decomposition of the design matrix.
   *\param n Index of the model parameter [0..NParameters-1].
   *\return The singular value for parameter n.
   */
  double GetSingularValue( const size_t n ) const 
  {
    return (*(this->W))[n];
  }

  /** Get the parameter correlation matrix from design matrix.
   */
  Matrix2D<double>* GetCorrelationMatrix() const;

  /** Model y[] distribution and return model parameters a[].
   *\param y A vector of TypedArray smart pointers. Each object in this
   * vector points to a pixel array from a different subject in a population.
   *\param normalizeParameters If this flag is set (default), then the
   * linear model parameters are normalized w.r.t. the maghnitudes of the
   * respective measurements.
   */
  void FitModel( std::vector<TypedArray::SmartPtr>& y, const bool normalizeParameters = true );

  /// Get pointer to n-th model parameter array.
  TypedArray::SmartPtr& GetModel( const size_t n )
  {
    return this->Model[n];
  }

  /// Get normalization factor for parameter number 'p'.
  double GetNormFactor( const size_t p )
  {
    // do not normalize constant part
    if ( this->VariableSD[p] > 0 ) 
      return this->VariableSD[p];
    else
      return 1.0;
  }

  /// Get pointer to n-th parameter t statistics array.
  TypedArray::SmartPtr& GetTStat( const size_t n )
  {
    return this->TStat[n];
  }

  /// Get pointer to n-th parameter t statistics array.
  TypedArray::SmartPtr& GetFStat()
  {
    return this->FStat;
  }

private:
  /// Solve least-squares problem.
  void LeastSquares();

  /// Initialize results arrays with the correct number of pixels.
  void InitResults( const size_t nPixels );

  /// Number of model parameters.
  size_t NParameters;

  /// Number of data items.
  size_t NData;

  /// Design matrix.
  Matrix2D<double> DesignMatrix;

  /// Matrix U of the design matrix SVD.
  Matrix2D<double>* U;

  /// Array of partial design matrices.
  std::vector< Matrix2D<double>* > Up;

  /// Matrix V the design matrix SVD.
  Matrix2D<double>* V;

  /// SVD of partial design matrices.
  std::vector< Matrix2D<double>* > Vp;

  /// Vector W (workspace).
  std::vector<double>* W;

  /// Workspace vectors for partial regressions.
  std::vector< std::vector<double>* > Wp;

  /// Means of variables.
  std::vector<double> VariableMean;

  /// Standard deviations of variables.
  std::vector<double> VariableSD;

  /// Computed model coefficients.
  std::vector<TypedArray::SmartPtr> Model;

  /// Computed model t statistics coefficients.
  std::vector<TypedArray::SmartPtr> TStat;

  /// Computed model F statistics.
  TypedArray::SmartPtr FStat;
};

//@}

} // namespace cmtk

#endif // #ifndef __cmtkGeneralLinearModel_h_included_