65void linear_regression_compute_fit_from_S(Value& constant,
68 Value& variance_of_constant,
69 Value& variance_of_scale,
70 Value& covariance_of_constant_with_scale,
77 const std::size_t data_size,
78 const bool use_estimated_variance);
80template <
class DataIter,
class CoordinatesIter,
class WeightsIter>
82linear_regression_compute_S(
double& S,
88 const DataIter data_begin,
89 const DataIter data_end,
90 const CoordinatesIter coords_begin,
91 const WeightsIter weights_begin)
93 DataIter data_iter = data_begin;
94 CoordinatesIter coords_iter = coords_begin;
95 WeightsIter weights_iter = weights_begin;
97 for (; data_iter != data_end; ++data_iter, ++coords_iter, ++weights_iter)
99 const double weight =
static_cast<double>(*weights_iter);
101 Sx += weight * (*coords_iter);
102 Sy += weight * (*data_iter);
103 Syy += weight *
square(
static_cast<double>(*data_iter));
106 data_iter = data_begin;
107 coords_iter = coords_begin;
108 weights_iter = weights_begin;
110 for (; data_iter != data_end; ++data_iter, ++coords_iter, ++weights_iter)
112 const double wti = (*coords_iter - Sx / S);
113 Stt += *weights_iter * wti * wti;
114 Sty += *weights_iter * wti * *data_iter;
120template <
class Value,
class DataIter,
class CoordinatesIter,
class WeightsIter>
125 Value& variance_of_constant,
126 Value& variance_of_scale,
127 Value& covariance_of_constant_with_scale,
130 CoordinatesIter coords_begin,
131 WeightsIter weights_begin,
132 const bool use_estimated_variance)
141 detail::linear_regression_compute_S(S, Sx, Sy, Syy, Stt, Sty, data_begin, data_end, coords_begin, weights_begin);
143 detail::linear_regression_compute_fit_from_S(constant,
146 variance_of_constant,
148 covariance_of_constant_with_scale,
155 static_cast<std::size_t
>(data_end - data_begin),
156 use_estimated_variance);
159template <
class Value,
class DataType,
class CoordinatesType>
164 Value& variance_of_constant,
165 Value& variance_of_scale,
166 Value& covariance_of_constant_with_scale,
170 const bool use_estimated_variance)
180 variance_of_constant,
182 covariance_of_constant_with_scale,
183 measured_data.
begin(),
187 use_estimated_variance);
190template <
class ValueIter,
class DataIter,
class CoordinatesIter,
class WeightsIter>
192linear_regression(ValueIter value_begin,
195 CoordinatesIter coords_begin,
196 WeightsIter weights_begin,
197 const bool use_estimated_variance)
206 detail::linear_regression_compute_S(S, Sx, Sy, Syy, Stt, Sty, data_begin, data_end, coords_begin, weights_begin);
208 ValueIter value_iter = value_begin;
210 detail::linear_regression_compute_fit_from_S(*value_iter,
222 data_end - data_begin,
223 use_estimated_variance);
224 *(value_iter + 6) = *(value_iter)*Sx / Sy;
A templated class for vectors, but with indices starting not from 0.
Definition VectorWithOffset.h:65
iterator begin()
use to initialise an iterator to the first element of the vector
Definition VectorWithOffset.inl:190
int get_max_index() const
get value of last valid index
Definition VectorWithOffset.inl:131
int get_min_index() const
get value of first valid index
Definition VectorWithOffset.inl:124
iterator end()
iterator 'past' the last element of the vector
Definition VectorWithOffset.inl:206
void linear_regression(Value &constant, Value &scale, Value &chi_square, Value &variance_of_constant, Value &variance_of_scale, Value &covariance_of_constant_with_scale, const VectorWithOffset< DataType > &measured_data, const VectorWithOffset< CoordinatesType > &coordinates, const VectorWithOffset< float > &weights, const bool use_estimated_variance=true)
Implements standard linear regression on VectorWithOffset data.
Definition linear_regression.inl:161
NUMBER square(const NUMBER &x)
returns the square of a number, templated.
Definition common.h:154