Mínimos cuadrados con restricciones

Sí, había restricciones. No me preguntéis por qué, pero los coeficientes tenían que ser positivos y sumar uno. Es decir, buscaba la combinación convexa de cuatro vectores que más se aproximase a y en alguna métrica razonable. Y lo resolví así:

# prepare constrained optimization
 
y <- dat.clean$actual
x <- t(dat.clean[,2:5])
 
# target function: L2 first, then other metrics
 
L2 <- function(coef){
  sum(abs((y - colSums(x * coef)))^1.5)
}
 
# restrictions: coefs > 0, sum(coefs) ~ 1
 
ui <- rbind(diag(4), c(-1,-1,-1,-1), c(1,1,1,1))
ci <- c(0,0,0,0,-1.000001,0.999999)
 
theta <- rep(0.25, 4)
 
best.coef <- constrOptim(theta, L2, grad = NULL, ui = ui, ci = ci)
 
coefs <- best.coef$par

Objetos aparte de x e y, hay:

  • L2, que es la función que devuelve la distancia entre y y la combinación lineal de las filas de x indicada por su argumento. (Los lectores más sagaces descubrirán que L2 no implementa la norma L2: lo hago solo por joder a un economista gilipollas que vino a llamarme iluso por pretender que existían distancias otras que las dos más corrientes).
  • ui, una matriz y
  • ci, un vector, que restringen las soluciones factibles a aquellas que cumplen que ui %*% x > ci.
  • theta que es un valor inicial que tiene que cumplir la restricción anterior.
  • constrOptim, que hace toda la magia.

5 comentarios sobre “Mínimos cuadrados con restricciones

  1. Aleix 6 Junio, 2014 11:13

    Yo alguna vez he utilizado el package nnls (non-negative least squares): mínimos cuadrados con coeficientes positivos.

    También he visto en algún artículo, que si tienes esa información a priori (o si crees que así debe ser), utilizar coeficientes positivos disminuye la complejidad de tu modelo y que puede dar mejores resultados en predicción de los que se podrían obtener si no impusiésemos restricciones a los coeficientes.

    Dicho sea de paso, nnls implementa el algoritmo descrito en el fantástico y muy recomendable libro de Lawson y Hanson “Solving Least Squares Problems” (1987).

  2. Jorge A. 6 Junio, 2014 14:33

    Aleix, ¿Tienes alguna referencia sobre el artículo/s que comentas?

    Gracias y un saludo.

  3. Aleix 10 Junio, 2014 10:55

    Jorge, tengo estos, que alguno me leí hace tiempo.

    Sign-constrained least squares estimation for high-dimensional regression, Nicolai Meinshausen (2012)
    Sparse recovery by thresholded non-negative least squares, Martin Slawski and Matthias Hein

  4. Jorge A. 11 Junio, 2014 9:20

    Muchas gracias!!

  5. Rubén F. Casal 30 Junio, 2014 9:21

    Cuando se trata de un ajuste lineal con restricciones lineales yo empleo programación cuadrática (se obtiene el optimo global, no hay problemas de mínimos locales). En R encontré el paquete “quadprog”.

Los comentarios están desabilitados.