我正在尝试进行线性回归,但我只是想使用具有正系数的变量(我认为这称为硬阈值,但我不确定)。
例如:
> summary(lm1)
Call:
lm(formula = value ~ ., data = intCollect1[, -c(1, 3)])
Residuals:
Min 1Q Median 3Q Max
-15.6518 -0.2089 -0.0227 0.2035 15.2235
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.099763 0.024360 4.095 4.22e-05 ***
modelNum3802 0.208867 0.008260 25.285 < 2e-16 ***
modelNum8000 -0.086258 0.013104 -6.582 4.65e-11 ***
modelNum8001 -0.058225 0.010741 -5.421 5.95e-08 ***
modelNum8002 -0.001813 0.012087 -0.150 0.880776
modelNum8003 -0.083646 0.011015 -7.594 3.13e-14 ***
modelNum8004 0.002521 0.010729 0.235 0.814254
modelNum8005 0.301286 0.011314 26.630 < 2e-16 ***
在上面的回归中,我只想使用模型3802,8004和8005.有没有办法在不复制和粘贴每个变量名的情况下执行此操作?
答案 0 :(得分:3)
不是使用lm
,而是可以用二次规划来表达你的问题:
最小化平方复制错误的总和,但要受到线性系数都为正的约束。
可以使用lsei
包中的limSolve
来解决此类问题。看看你的例子,看起来很像这样:
x.variables <- c("modelNum3802", "modelNum8000", ...)
num.var <- length(x.variables)
lsei(A = intCollect1[, x.variables],
B = intCollect1$value,
G = diag(num.var),
H = rep(0, num.var))
答案 1 :(得分:1)
我发现nnls
(非负最小二乘)包值得一看。
答案 2 :(得分:0)
您还可以通过以下方式重新构建线性回归模型: label~sum(exp(\ alpha_i)f_i)
优化目标将是 sum_j(label_j - sum_i(exp(\ alpha_i)f_i))^ 2
这没有封闭形式的解决方案,但可以有效地解决,因为它在\ alpha_i中是凸的。
计算\ alpha_i之后,你可以通过对其进行取幂来将它们重新设置为通常线性模型的回归量。