celestialgod

wighted least square algorithm (wls.cpp)

Dec 30th, 2016
141
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.66 KB | None | 0 0
  1. // [[Rcpp::depends(RcppArmadillo)]]
  2. // [[Rcpp::depends(RcppEigen)]]
  3. #include <RcppArmadillo.h>
  4. #include <RcppEigen.h>
  5. using namespace arma;
  6.  
  7. // [[Rcpp::export]]
  8. Eigen::VectorXd eigen_fullPivHHQR(const Eigen::Map<Eigen::MatrixXd> & X,
  9.                                   const Eigen::Map<Eigen::VectorXd> & w,
  10.                                   const Eigen::Map<Eigen::VectorXd> & y) {
  11.   Eigen::VectorXd beta = (X.transpose() * w.asDiagonal() * X).fullPivHouseholderQr().solve(X.transpose() * w.asDiagonal() * y);;
  12.   return beta;
  13. }
  14.  
  15. // [[Rcpp::export]]
  16. Eigen::VectorXd eigen_colPivHHQR(const Eigen::Map<Eigen::MatrixXd> & X,
  17.                                  const Eigen::Map<Eigen::VectorXd> & w,
  18.                                  const Eigen::Map<Eigen::VectorXd> & y) {
  19.   Eigen::VectorXd beta = (X.transpose() * w.asDiagonal() * X).colPivHouseholderQr().solve(X.transpose() * w.asDiagonal() * y);;
  20.   return beta;
  21. }
  22.  
  23. // [[Rcpp::export]]
  24. Eigen::VectorXd eigen_HHQR(const Eigen::Map<Eigen::MatrixXd> & X,
  25.                            const Eigen::Map<Eigen::VectorXd> & w,
  26.                            const Eigen::Map<Eigen::VectorXd> & y) {
  27.   Eigen::VectorXd beta = (X.transpose() * w.asDiagonal() * X).householderQr().solve(X.transpose() * w.asDiagonal() * y);
  28.   return beta;
  29. }
  30.  
  31. // [[Rcpp::export]]
  32. Eigen::VectorXd eigen_fullLU(const Eigen::Map<Eigen::MatrixXd> & X,
  33.                              const Eigen::Map<Eigen::VectorXd> & w,
  34.                              const Eigen::Map<Eigen::VectorXd> & y) {
  35.   Eigen::VectorXd beta = (X.transpose() * w.asDiagonal() * X).fullPivLu().solve(X.transpose() * w.asDiagonal() * y);
  36.   return beta;
  37. }
  38.  
  39. // [[Rcpp::export]]
  40. Eigen::VectorXd eigen_llt(const Eigen::Map<Eigen::MatrixXd> & X,
  41.                           const Eigen::Map<Eigen::VectorXd> & w,
  42.                           const Eigen::Map<Eigen::VectorXd> & y) {
  43.   Eigen::VectorXd beta = (X.transpose() * w.asDiagonal() * X).llt().solve(X.transpose() * w.asDiagonal() * y);
  44.   return beta;
  45. }
  46.  
  47. // [[Rcpp::export]]
  48. Eigen::VectorXd eigen_ldlt(const Eigen::Map<Eigen::MatrixXd> & X,
  49.                            const Eigen::Map<Eigen::VectorXd> & w,
  50.                            const Eigen::Map<Eigen::VectorXd> & y) {
  51.   Eigen::VectorXd beta = (X.transpose() * w.asDiagonal() * X).ldlt().solve(X.transpose() * w.asDiagonal() * y);
  52.   return beta;
  53. }
  54.  
  55. // [[Rcpp::export]]
  56. Eigen::VectorXd eigen_chol_llt1(const Eigen::Map<Eigen::MatrixXd> & X,
  57.                                 const Eigen::Map<Eigen::VectorXd> & w,
  58.                                 const Eigen::Map<Eigen::VectorXd> & y) {
  59.   Eigen::MatrixXd XWX = X.transpose() * w.asDiagonal() * X;
  60.   Eigen::MatrixXd R = XWX.llt().matrixU();
  61.   Eigen::VectorXd XWY = X.transpose() * (w.array() * y.array()).matrix();
  62.   Eigen::VectorXd beta = R.householderQr().solve(R.transpose().householderQr().solve(XWY));
  63.   return beta;
  64. }
  65.  
  66. // [[Rcpp::export]]
  67. Eigen::VectorXd eigen_chol_llt2(const Eigen::Map<Eigen::MatrixXd> & X,
  68.                                 const Eigen::Map<Eigen::VectorXd> & w,
  69.                                 const Eigen::Map<Eigen::VectorXd> & y) {
  70.   Eigen::MatrixXd XW = X.transpose() * w.asDiagonal();
  71.   Eigen::MatrixXd R = (XW * X).llt().matrixU();
  72.   Eigen::VectorXd beta = R.householderQr().solve(R.transpose().householderQr().solve(XW * y));
  73.   return beta;
  74. }
  75.  
  76. // [[Rcpp::export]]
  77. Eigen::VectorXd eigen_chol_llt3(const Eigen::Map<Eigen::MatrixXd> & X,
  78.                                 const Eigen::Map<Eigen::VectorXd> & w,
  79.                                 const Eigen::Map<Eigen::VectorXd> & y) {
  80.   Eigen::MatrixXd XW(X.cols(), X.rows());
  81.   for (unsigned int i = 0; i < X.cols(); ++i)
  82.     XW.row(i) = X.col(i).array() * w.array();
  83.   Eigen::MatrixXd R = (XW * X).llt().matrixU();
  84.   Eigen::VectorXd beta = R.householderQr().solve(R.transpose().householderQr().solve(XW * y));
  85.   return beta;
  86. }
  87.  
  88. // [[Rcpp::export]]
  89. Eigen::VectorXd eigen_colPivHHQR2(const Eigen::Map<Eigen::MatrixXd> & X,
  90.                                   const Eigen::Map<Eigen::VectorXd> & w,
  91.                                   const Eigen::Map<Eigen::VectorXd> & y) {
  92.   Eigen::VectorXd sw = w.cwiseSqrt();
  93.   Eigen::MatrixXd XW(X.rows(), X.cols());
  94.   for (unsigned int i = 0; i < X.cols(); ++i)
  95.     XW.col(i) = X.col(i).array() * sw.array();
  96.   Eigen::VectorXd beta = XW.colPivHouseholderQr().solve(y.cwiseProduct(sw));
  97.   return beta;
  98. }
  99.  
  100. // [[Rcpp::export]]
  101. arma::vec arma_qr(const arma::mat& X, const arma::vec& w, const arma::vec& y) {
  102.   mat Q, R;
  103.   qr(Q, R, X.each_col() % sqrt(w));
  104.   vec p = solve(R.head_rows(X.n_cols), Q.head_cols(X.n_cols).t() * (y % sqrt(w)));
  105.   return p;
  106. }
  107.  
  108. // [[Rcpp::export]]
  109. arma::vec arma_pinv(const arma::mat& X, const arma::vec& w, const arma::vec& y) {
  110.   vec p = pinv(X.t() * (repmat(w, 1, X.n_cols) % X)) * X.t() * (w % y);
  111.   return p;
  112. }
  113.  
  114. // [[Rcpp::export]]
  115. arma::vec arma_chol1(const arma::mat& X, const arma::vec& w, const arma::vec& y) {
  116.   mat R = chol((X.each_col() % w).t() * X);
  117.   vec p = solve(R, solve(R.t(), X.t() * (w % y), solve_opts::fast), solve_opts::fast);
  118.   return p;
  119. }
  120.  
  121. // [[Rcpp::export]]
  122. arma::vec arma_chol2(const arma::mat& X, const arma::vec& w, const arma::vec& y) {
  123.   mat XW = (X.each_col() % w).t();
  124.   mat R = chol(XW * X);
  125.   vec p = solve(R, solve(R.t(), XW * y, solve_opts::fast), solve_opts::fast);
  126.   return p;
  127. }
  128.  
  129. // [[Rcpp::export]]
  130. arma::vec arma_direct1(const arma::mat& X, const arma::vec& w, const arma::vec& y) {
  131.   vec sw = sqrt(w);
  132.   vec p = solve(X.each_col() % sw, y % sw);
  133.   return p;
  134. }
  135.  
  136. // [[Rcpp::export]]
  137. arma::vec arma_direct2(const arma::mat& X, const arma::vec& w, const arma::vec& y) {
  138.   vec p = solve((X.each_col() % w).t() * X, X.t() * (w % y));
  139.   return p;
  140. }
Advertisement
Add Comment
Please, Sign In to add comment