3

我正在尝试进行线性回归,但我只想使用具有正系数的变量(我认为这称为硬阈值,但我不确定)。

例如:

> 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。有没有办法在不复制和粘贴每个变量名称的情况下做到这一点?

4

3 回答 3

3

而不是使用lm,您可以用二次规划来表述您的问题:

在线性系数均为正的约束下,最小化平方复制误差的总和。

lsei使用from limSolvepackage可以解决此类问题。看看你的例子,它看起来很像这样:

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))
于 2012-03-29T01:22:42.900 回答
1

我发现nnls(非负最小二乘)包值得一看。

于 2013-05-03T12:53:31.663 回答
0

您还可以通过以下方式重新制定线性回归模型: label ~ sum(exp(\alpha_i) f_i)

优化目标是 sum_j (label_j - sum_i(exp(\alpha_i) f_i))^2

这没有封闭形式的解决方案,但可以有效地解决,因为它在 alpha_i 中是凸的。

一旦你计算了 \alpha_i's,你可以通过取幂将它们重铸为通常线性模型的回归量。

于 2014-01-10T18:23:41.380 回答