【发布时间】:2019-10-25 02:05:37
【问题描述】:
我想在Rcpp Armadillo 中提取glmnet 的系数估计(交叉验证后),以便在Armadillo 的另一个函数中使用它们。
我搜索了一个类似的问题,但找不到解决方案。
我附上我的尝试。 (不工作)
即使我会得到cv.glmnet 的列表结果,我也无法使用coef 函数来获取系数。
R 代码
library(glmnet)
set.seed(1)
X = matrix(rnorm(1e3 * 201), 1e3, 201)
beta = -100:100
y = X%*%beta + rnorm(1e3)
cvfit = cv.glmnet(X, y, alpha = 1)
coefs = coef(cvfit, s = "lambda.min")
coefs # get these coefficients from Rcpp
cv.glmnet 的参数
args(cv.glmnet)
> function (x, y, weights, offset = NULL, lambda = NULL, type.measure = c("mse", "deviance", "class", "auc", "mae"), nfolds = 10, foldid,
alignment = c("lambda", "fraction"), grouped = TRUE, keep = FALSE,
parallel = FALSE, ...)
NULL
C++ 代码
#include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]
// [[Rcpp::export]]
Rcpp::List f_cpp(const arma::mat &x, const arma::vec &y,
const arma::vec &weights,
const arma::vec &lambda, double alpha,
int nfolds = 10){
Rcpp::Environment pkg = Rcpp::Environment::namespace_env("glmnet");
Rcpp::Function f_R = pkg["cv.glmnet"];
Rcpp::Nullable<arma::vec> offset = pkg["offset"];
Rcpp::CharacterVector type_measure = pkg["type.measure"];
arma::vec foldid = pkg["foldid"];
Rcpp::CharacterVector alignment = pkg["alignment"];
bool grouped = pkg["grouped"];
bool keep = pkg["keep"];
bool parallel = pkg["parallel"];
return f_R(x, y, weights, offset, lambda,
type_measure, nfolds, foldid,
alignment, grouped, keep, parallel, alpha = alpha);
// coef(f_R(...)) ???
}
【问题讨论】:
-
从 C++ 调用 R 例程不会加速该过程。您是否考虑过只使用 R?如果不是,请考虑使用
coefs结果调用 C++ 例程。 -
您对程序的速度是正确的。但我需要多次进行此计算。手动移动
coefs结果非常困难。 -
为什么手动移动
coefs很难?你试过什么? -
@Ralf Stubner 也许我让一个简单的问题变得困难。我不知道。但是我添加了我尝试过的代码。
标签: r rcpp glmnet method-call