Rcpp套索解:一个自我研究

Rcpp套索解:一个自我研究,r,rcpp,armadillo,R,Rcpp,Armadillo,我是Rcpp的新手。我正在尝试为Rcpp中的lasso编写一个坐标下降算法,作为一个自学。该代码返回一个错误: Mat::init(): requested size is not compatible with column vector layout 我在编写代码时也遇到了一些问题 对“sign”的调用没有匹配的函数 调用“ifelse”时没有匹配的函数 pow(X.col(j),2):没有可行的转换 我写 (S1>0)-(S1如何调用代码?@coatless调用sourceCpp(“f

我是Rcpp的新手。我正在尝试为Rcpp中的lasso编写一个坐标下降算法,作为一个自学。该代码返回一个错误:

Mat::init(): requested size is not compatible with column vector layout
我在编写代码时也遇到了一些问题

  • 对“sign”的调用没有匹配的函数
  • 调用“ifelse”时没有匹配的函数
  • pow(X.col(j),2):没有可行的转换
  • 我写


    • (S1>0)-(S1如何调用代码?@coatless调用
      sourceCpp(“filename.cpp”)
      。然后
      系数=betamat(X,y,seq(0,1,0.05))
      R
      中。这里
      X
      是一个矩阵,
      y
      是一个向量。从代码大小的三分之一开始,一个接一个地消除警告。然后一行一行地添加代码。这里有免费午餐(TM)。“调试工作也有。oops.错过了必要的否,因为”这里(当然)没有免费午餐(TM)”.Armadillo确实支持
      符号
      ,c.f?
      // [[Rcpp::depends(RcppArmadillo)]]
      #include <RcppArmadillo.h>
      using namespace Rcpp; 
      using namespace arma;
      
      // [[Rcpp::export]]
      mat betamat(NumericMatrix Xr, NumericVector yr, NumericVector lambdar, double tol=0.0000001) {
        int N = Xr.nrow(), p = Xr.ncol(), l = lambdar.size();
        mat X(Xr.begin(), N, p, false);
        colvec y(yr.begin(), yr.size(), false);
        vec lambda(lambdar.begin(), lambdar.size(),false);
        colvec ols = solve(X,y);
        mat betas = zeros<mat>(p,l);
        //
        bool converged = false;
        for (int i = 0; i < l; ++i) {
          colvec b = zeros<vec>(p);
          colvec r = y-X*b;
          while(converged == false){
            colvec beta_old = betas;
            for(int j = 0; j < p; ++j){
            r = r + X.col(j)*b(j);
            double xr = dot(X.col(j),r);
            double S1 = xr/N;
            double xx = sum(X.col(j)%X.col(j))/N;   
            b(j) =((S1>0)-(S1<0))*(abs(S1)-lambda(i))/xx;
            if(b(j)>0){
              b(j)=b(j);
            }else{
              b(j)=0;
            }
            r = r - X.col(j)*b(j);
            }
            converged = (sum(abs(betas - beta_old)) < tol);
          }
          betas.col(i) = b;
        }
        return betas;
      }
      
      library(Rcpp)
      sourceCpp("filename.cpp")
      
      set.seed(1)
      X <- matrix(rnorm(100*3),100)
      y <- rnorm(100)
      coefficients <- betamat(X,y,seq(0,1,0.0005))