使用CVXR估计约束泊松回归模型遇求解错误与约束失效问题
问题诊断与解决
核心错误原因
- 约束传递位置错误:CVXR的
Problem()构造函数需要将约束作为第二个参数传入,而非传给solve()函数。你当前的代码里约束未被纳入优化问题,直接导致:- 默认求解器因无法识别无效的
solve()参数报错; - MOSEK实际求解的是无约束泊松回归模型,自然忽略了你设定的约束。
- 默认求解器因无法识别无效的
- 约束方向笔误:你提到要约束beta参数为正,但代码里写的是
beta1 <= 0,这是反向约束,需修正为beta1 >= 0。
修正后的代码
set.seed(12421) x <- rnorm(1000) x <- x[x > 0.1] y <- rpois(length(x), x) alpha <- Variable(1) beta1 <- Variable(1) # 修正约束方向为正 constraint <- list(beta1 >= 0) # 将约束传入Problem的第二个参数 prob <- Problem(Maximize(sum(y * (x %*% beta1 + alpha) - exp(x %*% beta1 + alpha))), constraints = constraint) # 使用默认求解器 result <- solve(prob) print(result$getValue(beta1)) # 使用MOSEK求解 result_mosek <- solve(prob, solver = "MOSEK") print(result_mosek$getValue(beta1))
验证说明
修正后约束会被正确纳入优化问题:
- 默认求解器不再抛出参数错误;
- MOSEK会严格遵守
beta1 >= 0的约束条件,求解结果符合预期。
内容的提问来源于stack exchange,提问作者Scott Ganz
相关产品推荐
相关产品推荐

