6 #include "Crossvalidation.hpp"
16 namespace LinearRegression {
39 return rss /
static_cast<double>(
dof);
42 return std::numeric_limits<double>::quiet_NaN();
61 return 1 - (
rss /
static_cast<double>(
dof)) / (
tss /
static_cast<double>(
n - 1));
64 return std::numeric_limits<double>::quiet_NaN();
85 DLL_DECLSPEC std::string
to_string()
const;
91 DLL_DECLSPEC Eigen::VectorXd
predict(Eigen::Ref<const Eigen::VectorXd> x)
const;
113 DLL_DECLSPEC std::string
to_string()
const;
120 DLL_DECLSPEC Eigen::VectorXd
predict(Eigen::Ref<const Eigen::MatrixXd> X)
const;
127 DLL_DECLSPEC
double predict_single(Eigen::Ref<const Eigen::VectorXd> x)
const;
148 DLL_DECLSPEC Eigen::VectorXd
predict(Eigen::Ref<const Eigen::MatrixXd> X)
const;
155 DLL_DECLSPEC
double predict_single(Eigen::Ref<const Eigen::VectorXd> x)
const;
164 DLL_DECLSPEC std::string
to_string()
const;
173 DLL_DECLSPEC std::string
to_string()
const;
240 template <
bool DoStandardise>
RidgeRegressionResult ridge(Eigen::Ref<const Eigen::MatrixXd> X, Eigen::Ref<const Eigen::VectorXd> y,
double lambda);
255 inline RidgeRegressionResult ridge(Eigen::Ref<const Eigen::MatrixXd> X, Eigen::Ref<const Eigen::VectorXd> y,
double lambda,
bool do_standardise)
257 if (do_standardise) {
285 template <
bool DoStandardise> LassoRegressionResult
lasso(Eigen::Ref<const Eigen::MatrixXd> X, Eigen::Ref<const Eigen::VectorXd> y,
double lambda);
290 template <> DLL_DECLSPEC LassoRegressionResult
lasso<true>(Eigen::Ref<const Eigen::MatrixXd> X, Eigen::Ref<const Eigen::VectorXd> y,
double lambda);
295 template <> DLL_DECLSPEC LassoRegressionResult
lasso<false>(Eigen::Ref<const Eigen::MatrixXd> X, Eigen::Ref<const Eigen::VectorXd> y,
double lambda);
300 inline LassoRegressionResult lasso(Eigen::Ref<const Eigen::MatrixXd> X, Eigen::Ref<const Eigen::VectorXd> y,
double lambda,
bool do_standardise)
302 if (do_standardise) {
322 template <
class Regression>
double press(Eigen::Ref<const Eigen::MatrixXd> X, Eigen::Ref<const Eigen::VectorXd> y, Regression regression)
324 const auto trainer = [®ression](
const Eigen::Ref<const Eigen::MatrixXd> X,
const Eigen::Ref<const Eigen::VectorXd> y) ->
auto {
325 return regression(X, y);
327 const auto tester = [](
const decltype(regression(X, y))& result,
const Eigen::Ref<const Eigen::MatrixXd> X,
const Eigen::Ref<const Eigen::VectorXd> y) ->
double {
328 return (y - result.predict(X)).squaredNorm() /
static_cast<double>(y.size());
343 template <
bool WithIntercept>
double press_univariate(Eigen::Ref<const Eigen::VectorXd> x, Eigen::Ref<const Eigen::VectorXd> y)
345 const auto trainer = [](
const Eigen::Ref<const Eigen::VectorXd> x,
const Eigen::Ref<const Eigen::VectorXd> y) ->
UnivariateOLSResult {
352 const auto tester = [](
const UnivariateOLSResult& result,
const Eigen::Ref<const Eigen::VectorXd> x,
const Eigen::Ref<const Eigen::VectorXd> y) ->
double {
353 return (y - result.
predict(x)).squaredNorm() /
static_cast<double>(y.size());
365 DLL_DECLSPEC Eigen::MatrixXd
add_ones(Eigen::Ref<const Eigen::MatrixXd> X);
374 DLL_DECLSPEC
void standardise(Eigen::Ref<Eigen::MatrixXd> X);
389 DLL_DECLSPEC
void standardise(Eigen::Ref<Eigen::MatrixXd> X, Eigen::VectorXd& means, Eigen::VectorXd& standard_deviations);
401 DLL_DECLSPEC
void unstandardise(Eigen::Ref<Eigen::MatrixXd> X, Eigen::Ref<const Eigen::VectorXd> means, Eigen::Ref<const Eigen::VectorXd> standard_deviations);
412 Eigen::VectorXd calculate_XXt_beta(
const Eigen::Ref<const Eigen::MatrixXd> X,
const Eigen::Ref<const Eigen::VectorXd> y, Eigen::Ref<Eigen::MatrixXd> XXt, Eigen::LDLT<Eigen::MatrixXd>& xxt_decomp,
const Eigen::Ref<const Eigen::VectorXd> lambda);
RidgeRegressionResult ridge< true >(Eigen::Ref< const Eigen::MatrixXd > X, Eigen::Ref< const Eigen::VectorXd > y, double lambda)
Carries out multivariate ridge regression with intercept, standardising X inputs internally.
double leave_one_out_scalar(const Eigen::Ref< const Eigen::VectorXd > x, Eigen::Ref< const Eigen::VectorXd > y, Trainer train_func, Tester test_func)
Calculates model test error using leave-one-out cross-validation (scalar X version).
Definition: Crossvalidation.hpp:257
double intercept
Definition: LinearRegression.hpp:79
LassoRegressionResult lasso(Eigen::Ref< const Eigen::MatrixXd > X, Eigen::Ref< const Eigen::VectorXd > y, double lambda)
Carries out multivariate Lasso regression with intercept.
Eigen::MatrixXd cov
Definition: LinearRegression.hpp:110
Eigen::VectorXd beta
Definition: LinearRegression.hpp:109
Definition: BallTree.hpp:10
Result of multivariate Ordinary Least Squares regression.
Definition: LinearRegression.hpp:107
double r2() const
R2 coefficient.
Definition: LinearRegression.hpp:51
double var_y() const
Estimated variance of observations Y, equal to rss / dof.
Definition: LinearRegression.hpp:37
void unstandardise(Eigen::Ref< Eigen::MatrixXd > X, Eigen::Ref< const Eigen::VectorXd > means, Eigen::Ref< const Eigen::VectorXd > standard_deviations)
Reverses the outcome of standardise().
double tss
Definition: LinearRegression.hpp:34
std::string to_string() const
Formats the result as string.
double var_intercept
Definition: LinearRegression.hpp:81
MultivariateOLSResult multivariate(Eigen::Ref< const Eigen::MatrixXd > X, Eigen::Ref< const Eigen::VectorXd > y)
Carries out multivariate linear regression.
Eigen::VectorXd predict(Eigen::Ref< const Eigen::MatrixXd > X) const
Predicts Y given X.
UnivariateOLSResult univariate(Eigen::Ref< const Eigen::VectorXd > x, Eigen::Ref< const Eigen::VectorXd > y)
Carries out univariate (aka simple) linear regression with intercept.
double press(Eigen::Ref< const Eigen::MatrixXd > X, Eigen::Ref< const Eigen::VectorXd > y, Regression regression)
Calculates the PRESS statistic (Predicted Residual Error Sum of Squares).
Definition: LinearRegression.hpp:322
Result of a multivariate Lasso regression with intercept.
Definition: LinearRegression.hpp:170
UnivariateOLSResult univariate_without_intercept(Eigen::Ref< const Eigen::VectorXd > x, Eigen::Ref< const Eigen::VectorXd > y)
Carries out univariate (aka simple) linear regression without intercept.
Result of a multivariate regularised regression with intercept.
Definition: LinearRegression.hpp:138
std::string to_string() const
Formats the result as string.
std::string to_string() const
Formats the result as string.
RidgeRegressionResult ridge< false >(Eigen::Ref< const Eigen::MatrixXd > X, Eigen::Ref< const Eigen::VectorXd > y, double lambda)
Carries out multivariate ridge regression with intercept, assuming standardised X inputs.
double leave_one_out(Eigen::Ref< const Eigen::MatrixXd > X, Eigen::Ref< const Eigen::VectorXd > y, Trainer train_func, Tester test_func)
Calculates model test error using leave-one-out cross-validation.
Definition: Crossvalidation.hpp:209
unsigned int n
Definition: LinearRegression.hpp:31
double var_slope
Definition: LinearRegression.hpp:80
Eigen::MatrixXd add_ones(Eigen::Ref< const Eigen::MatrixXd > X)
Adds another row with 1s in every column to X.
Eigen::VectorXd predict(Eigen::Ref< const Eigen::MatrixXd > X) const
Predicts Y given X.
double predict_single(Eigen::Ref< const Eigen::VectorXd > x) const
Predicts Y given X.
double adjusted_r2() const
Adjusted R2 coefficient.
Definition: LinearRegression.hpp:59
unsigned int dof
Definition: LinearRegression.hpp:32
double slope
Definition: LinearRegression.hpp:78
double cov_slope_intercept
Definition: LinearRegression.hpp:82
double effective_dof
Definition: LinearRegression.hpp:141
double rss
Definition: LinearRegression.hpp:33
std::string to_string() const
Formats the result as string.
Eigen::VectorXd beta
Definition: LinearRegression.hpp:140
Eigen::VectorXd predict(Eigen::Ref< const Eigen::VectorXd > x) const
Predicts Y given X.
double predict(double x) const
Predicts Y given X.
Definition: LinearRegression.hpp:97
void standardise(Eigen::Ref< Eigen::MatrixXd > X)
Standardises independent variables.
RidgeRegressionResult ridge(Eigen::Ref< const Eigen::MatrixXd > X, Eigen::Ref< const Eigen::VectorXd > y, double lambda)
Carries out multivariate ridge regression with intercept.
Result of 1D Ordinary Least Squares regression (with or without intercept).
Definition: LinearRegression.hpp:76
Result of linear regression.
Definition: LinearRegression.hpp:29
double press_univariate(Eigen::Ref< const Eigen::VectorXd > x, Eigen::Ref< const Eigen::VectorXd > y)
Calculates the PRESS statistic (Predicted Residual Error Sum of Squares) for univariate regression.
Definition: LinearRegression.hpp:343
Eigen::MatrixXd cov
Definition: LinearRegression.hpp:161
LassoRegressionResult lasso< true >(Eigen::Ref< const Eigen::MatrixXd > X, Eigen::Ref< const Eigen::VectorXd > y, double lambda)
Carries out multivariate Lasso regression with intercept, standardising X inputs internally.
LassoRegressionResult lasso< false >(Eigen::Ref< const Eigen::MatrixXd > X, Eigen::Ref< const Eigen::VectorXd > y, double lambda)
Carries out multivariate Lasso regression with intercept, assuming standardised X inputs.
double predict_single(Eigen::Ref< const Eigen::VectorXd > x) const
Predicts Y given X.
Result of a multivariate ridge regression with intercept.
Definition: LinearRegression.hpp:159