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_
|