12#include <Eigen/SparseCore>
13#include <Eigen/SparseQR>
34std::pair<double, Eigen::VectorXd>
35fitOls(
const Eigen::MatrixBase<T>& X,
36 const Eigen::VectorXd& y,
37 bool fit_intercept =
true)
39 Eigen::MatrixXd x_mod = X;
43 Eigen::MatrixXd ones = Eigen::MatrixXd::Ones(x_mod.rows(), 1);
44 x_mod.conservativeResize(Eigen::NoChange, x_mod.cols() + 1);
45 x_mod.rightCols(1) = ones;
49 Eigen::ColPivHouseholderQR<Eigen::MatrixXd> qr(x_mod);
50 Eigen::VectorXd all_coefs = qr.solve(y);
52 double intercept = 0.0;
53 Eigen::VectorXd coeffs;
56 intercept = all_coefs(all_coefs.size() - 1);
57 coeffs = all_coefs.head(all_coefs.size() - 1);
62 return { intercept, coeffs };
81std::pair<double, Eigen::VectorXd>
82fitOls(
const Eigen::SparseMatrixBase<T>& X,
83 const Eigen::VectorXd& y,
84 bool fit_intercept =
true)
87 Eigen::SparseMatrix<double> x_mod = X;
91 Eigen::VectorXd ones = Eigen::VectorXd::Ones(x_mod.rows());
92 Eigen::SparseMatrix<double> intercept_col(x_mod.rows(), 1);
93 intercept_col.reserve(x_mod.rows());
95 for (
int i = 0; i < x_mod.rows(); ++i) {
96 intercept_col.insert(i, 0) = ones(i);
100 Eigen::SparseMatrix<double> temp(x_mod.rows(), x_mod.cols() + 1);
101 temp.leftCols(x_mod.cols()) = x_mod;
102 temp.rightCols(1) = intercept_col;
107 Eigen::SparseQR<Eigen::SparseMatrix<double>, Eigen::COLAMDOrdering<int>>
109 solver.compute(x_mod);
110 Eigen::VectorXd all_cofs = solver.solve(y);
112 double intercept = 0.0;
113 Eigen::VectorXd coeffs;
116 intercept = all_cofs(all_cofs.size() - 1);
117 coeffs = all_cofs.head(all_cofs.size() - 1);
122 return { intercept, coeffs };
Namespace containing SLOPE regression implementation.