Vieille question mais comme je suis confronté au même problème, j'ai pensé poster mon 2p ...
Utilisez la programmation quadratique comme suggéré par @Elvis mais en utilisant sqlincon à partir du paquet pracma . Je pense que l’avantage quadrpog::solve.QP
est une interface utilisateur plus simple pour spécifier les contraintes. (En fait, lsqlincon
c'est un wrapper autour solve.QP
).
Exemple:
library(pracma)
set.seed(1234)
# Test data
X <- matrix(runif(300), ncol=3)
Y <- X %*% c(0.2, 0.3, 0.5) + rnorm(100, sd=0.2)
# Equality constraint: We want the sum of the coefficients to be 1.
# I.e. Aeq x == beq
Aeq <- matrix(rep(1, ncol(X)), nrow= 1)
beq <- c(1)
# Lower and upper bounds of the parameters, i.e [0, 1]
lb <- rep(0, ncol(X))
ub <- rep(1, ncol(X))
# And solve:
lsqlincon(X, Y, Aeq= Aeq, beq= beq, lb= lb, ub= ub)
[1] 0.1583139 0.3304708 0.5112153
Mêmes résultats que ceux d'Elvis:
library(quadprog)
Rinv <- solve(chol(t(X) %*% X));
C <- cbind(rep(1,3), diag(3))
b <- c(1,rep(0,3))
d <- t(Y) %*% X
solve.QP(Dmat = Rinv, factorized = TRUE, dvec = d, Amat = C, bvec = b, meq = 1)$solution
EDIT Pour essayer de répondre au commentaire de gung, voici une explication. sqlincon émule le lsqlin de matlab qui a une belle page d’aide. Voici les bits pertinents avec quelques modifications (mineures):
X
Matrice multiplicateur, spécifiée comme une matrice de doubles. C représente le multiplicateur de la solution x dans l'expression C * x - Y. C est M-by-N, où M est le nombre d'équations et N le nombre d'éléments de x.
Y
Vecteur constant, spécifié en tant que vecteur de doubles. Y représente le terme constant additif dans l'expression C * x - Y. Y est M par 1, où M est le nombre d'équations.
Aeq
: Matrice de contrainte d'égalité linéaire, spécifiée comme une matrice de doubles. Aeq représente les coefficients linéaires dans les contraintes Aeq * x = beq. Aeq a la taille Meq-by-N, où Meq est le nombre de contraintes et N le nombre d'éléments de x
beq
Vecteur de contrainte d'égalité linéaire, spécifié en tant que vecteur de doubles. beq représente le vecteur constant dans les contraintes Aeq * x = beq. beq a la longueur Meq, où Aeq est Meq-by-N.
lb
Limites inférieures, spécifiées en tant que vecteur de doubles. lb représente la limite inférieure élément par élément dans lb ≤ x ≤ ub.
ub
Limites supérieures, spécifiées en tant que vecteur de doubles. ub représente la limite supérieure par élément dans lb ≤ x ≤ ub.