Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R中的快速非负分位数和Huber回归_R_Cplex_Cvx_Quantile Regression_Cvxr - Fatal编程技术网

R中的快速非负分位数和Huber回归

R中的快速非负分位数和Huber回归,r,cplex,cvx,quantile-regression,cvxr,R,Cplex,Cvx,Quantile Regression,Cvxr,我正在寻找一种在R中进行非负分位数和Huber回归的快速方法(即,在所有系数都大于0的约束条件下)。我尝试使用CVXR软件包进行分位数和Huber回归,使用quantreg软件包进行分位数回归,但是CVXR非常慢,当我使用非负性约束时,quantreg似乎有问题。是否有人知道R中有一个好的、快速的解决方案,例如使用Rcplex包,或因此使用更快的CPLEX或gurobi优化器 注意,我需要运行一个小于80000次的问题大小,这样我只需要在每次迭代中更新y向量,但仍然使用相同的预测矩阵X。从这个意

我正在寻找一种在R中进行非负分位数和Huber回归的快速方法(即,在所有系数都大于0的约束条件下)。我尝试使用
CVXR
软件包进行分位数和Huber回归,使用
quantreg
软件包进行分位数回归,但是
CVXR
非常慢,当我使用非负性约束时,
quantreg
似乎有问题。是否有人知道R中有一个好的、快速的解决方案,例如使用
Rcplex
包,或因此使用更快的CPLEX或gurobi优化器


注意,我需要运行一个小于80000次的问题大小,这样我只需要在每次迭代中更新
y
向量,但仍然使用相同的预测矩阵
X
。从这个意义上说,我觉得在
CVXR
中,我现在必须执行
obj来加速CVXR,您可以在开始时获取问题数据一次,然后在循环中修改它,并将其直接传递到解算器的R接口。代码是

prob_data <- get_problem_data(prob, solver = "SCS")
prob\u数据
## Solve nonnegative quantile regression problem using CVX
require(CVXR)
beta <- Variable(n)
quant_loss <- function(u, tau) { 0.5*abs(u) + (tau - 0.5)*u }
obj <- sum(quant_loss(y - X %*% beta, tau=0.01))
prob <- Problem(Minimize(obj), constraints = list(beta >= 0))
system.time(beta_cvx <- pmax(solve(prob, solver="SCS")$getValue(beta), 0)) # estimated coefficients, note that they ocasionally can go - though and I had to clip at 0
# 0.47s
cor(beta_true,beta_cvx) # correlation=0.99985, OK but very slow
M <- 1      ## Huber threshold
obj <- sum(CVXR::huber(y - X %*% beta, M))
### Solve nonnegative quantile regression problem using quantreg package with method="fnc"
require(quantreg)
R <- rbind(diag(n),-diag(n))
r <- c(rep(0,n),-rep(1E10,n)) # specify bounds of coefficients, I want them to be nonnegative, and 1E10 should ideally be Inf
system.time(beta_rq <- coef(rq(y~0+X, R=R, r=r, tau=0.5, method="fnc"))) # estimated coefficients
# 0.12s
cor(beta_true,beta_rq) # correlation=-0.477, no good, and even worse with tau=0.01...
prob_data <- get_problem_data(prob, solver = "SCS")