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.QP
ist eine einfachere Benutzeroberfläche, um die Einschränkungen zu spezifizieren. (In der Tat lsqlincon
ist 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:
X
Multiplikatormatrix, 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.
Y
Konstanter 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
beq
Linearer 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.
lb
Untere Schranken, angegeben als Doppelvektor. lb repräsentiert die unteren Grenzen elementweise in lb ≤ x ≤ ub.
ub
Obere Schranken, angegeben als Doppelvektor. ub repräsentiert die oberen Grenzen elementweise in lb ≤ x ≤ ub.