2012-03-28 3 views
3

Ich versuche, eine lineare Regression zu machen, aber ich versuche nur, Variablen mit positiven Koeffizienten zu verwenden (ich glaube, das nennt man Hard-Thresholding, aber ich bin mir nicht sicher).R Gibt es eine Möglichkeit, Thresholding in der linearen Regression durchzuführen?

zum Beispiel:

> 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 *** 

In der obigen Regression, ich mag nur Modelle verwenden, 3802, 8004 und 8005. Gibt es eine Möglichkeit, dies ohne das Kopieren zu tun und Einfügen jeden Variablennamen?

+2

Sie können '? Coef' überprüfen. Aber wenn Sie Variablen mit einem negativen Koeffizienten entfernen und die Regression neu berechnen, kann sich das Vorzeichen der verbleibenden Koeffizienten ändern. –

Antwort

3

Statt lm zu verwenden, können Sie Ihr Problem in Bezug auf eine Quadratic Programming formulieren:

Minimieren Sie die Summe der Quadrate der Replikationsfehler mit der Einschränkung, dass Ihre linearen Koeffizienten alle positiv sind.

Solche Probleme können mit lsei aus dem limSolve-Paket gelöst werden. Mit Blick auf Ihrem Beispiel wäre es viel wie folgt aussehen:

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

fand ich die nnls (nicht-negativen kleinsten Quadrate) Paket auf der Suche wert zu sein.

0

Sie können auch Ihr lineares Regressionsmodell auf folgende Weise neu formulieren: Label ~ Summe (exp (\ alpha_i) f_i)

das Optimierungsziel wird sum_j sein (label_j - sum_i (exp (\ alpha_i) f_i))^2

Dies hat keine geschlossene Form Lösung, aber kann effizient gelöst werden, da es in den \ alpha_i konvex ist.

Sobald Sie die \ alpha_i's berechnet haben, können Sie sie als Regressoren eines gewöhnlichen linearen Modells neu modellieren, indem Sie sie exponentieren.