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 entrey
y la combinación lineal de las filas dex
indicada por su argumento. (Los lectores más sagaces descubrirán queL2
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 yci
, un vector, que restringen las soluciones factibles a aquellas que cumplen queui %*% x > ci
.theta
que es un valor inicial que tiene que cumplir la restricción anterior.constrOptim
, que hace toda la magia.
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).
Aleix, ¿Tienes alguna referencia sobre el artículo/s que comentas?
Gracias y un saludo.
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
Muchas gracias!!
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”.