Alte Frage, aber da ich vor dem gleichen Problem stehe, dachte ich, meine 2P zu posten ...
Verwenden Sie quadratische Programmierung, wie von @Elvis vorgeschlagen, aber verwenden Sie sqlincon aus dem pracma- Paket. Ich denke, der Vorteil gegenüber quadrpog::solve.QPist eine einfachere Benutzeroberfläche, um die Einschränkungen zu spezifizieren. (In der Tat lsqlinconist ein Wrapper um solve.QP).
Beispiel:
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
Gleiche Ergebnisse wie bei 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
BEARBEITEN Um zu versuchen, Gungs Kommentar anzusprechen, folgen einige Erklärungen. sqlincon emuliert das lsqlin von matlab, das eine nette Hilfeseite hat. Hier sind die relevanten Teile mit einigen (geringfügigen) Änderungen von mir:
XMultiplikatormatrix, angegeben als Doppelmatrix. C stellt den Multiplikator der Lösung x im Ausdruck C * x - Y dar. C ist M-mal-N, wobei M die Anzahl der Gleichungen und N die Anzahl der Elemente von x ist.
YKonstanter Vektor, angegeben als Doppelvektor. Y stellt den additiven konstanten Term in dem Ausdruck C * x - Y dar. Y ist M-mal-1, wobei M die Anzahl der Gleichungen ist.
Aeq: Lineare Gleichheitsbeschränkungsmatrix, angegeben als Doppelmatrix. Aeq repräsentiert die linearen Koeffizienten in den Nebenbedingungen Aeq * x = beq. Aeq hat die Größe Meq-by-N, wobei Meq die Anzahl der Nebenbedingungen und N die Anzahl der Elemente von x ist
beqLinearer Gleichheitsbeschränkungsvektor, angegeben als Doppelvektor. beq repräsentiert den konstanten Vektor in den Nebenbedingungen Aeq * x = beq. beq hat die Länge Meq, wobei Aeq Meq-by-N ist.
lbUntere Schranken, angegeben als Doppelvektor. lb repräsentiert die unteren Grenzen elementweise in lb ≤ x ≤ ub.
ubObere Schranken, angegeben als Doppelvektor. ub repräsentiert die oberen Grenzen elementweise in lb ≤ x ≤ ub.